4 template<typename Type> cell tag(Type *value)
6 return RETAG(value,Type::type_number);
9 inline static cell tag_dynamic(object *value)
11 return RETAG(value,value->type());
14 template<typename Type>
24 bool type_p(cell type_) const
26 return type() == type_;
31 if(Type::type_number == TYPE_COUNT)
34 return type_p(Type::type_number);
40 FACTOR_ASSERT(type_p());
45 Type *untagged() const
48 FACTOR_ASSERT(type_p());
50 return (Type *)(UNTAG(value_));
53 Type *untag_check(factor_vm *parent) const
56 parent->type_error(Type::type_number,value_);
60 explicit tagged(cell tagged) : value_(tagged) {}
61 explicit tagged(Type *untagged) : value_(factor::tag(untagged)) {}
63 Type *operator->() const { return untagged(); }
64 cell *operator&() const { return &value_; }
66 const tagged<Type> &operator=(const Type *x) { value_ = tag(x); return *this; }
67 const tagged<Type> &operator=(const cell &x) { value_ = x; return *this; }
69 bool operator==(const tagged<Type> &x) { return value_ == x.value_; }
70 bool operator!=(const tagged<Type> &x) { return value_ != x.value_; }
72 template<typename NewType> tagged<NewType> as() { return tagged<NewType>(value_); }
75 template<typename Type> Type *factor_vm::untag_check(cell value)
77 return tagged<Type>(value).untag_check(this);
80 template<typename Type> Type *untag(cell value)
82 return tagged<Type>(value).untagged();