4 template <typename TYPE> cell tag(TYPE *value)
6 return RETAG(value,tag_for(TYPE::type_number));
9 inline static cell tag_dynamic(object *value)
11 return RETAG(value,tag_for(value->h.hi_tag()));
14 template <typename TYPE>
19 cell value() const { return value_; }
20 TYPE *untagged() const { return (TYPE *)(UNTAG(value_)); }
23 cell tag = TAG(value_);
24 if(tag == OBJECT_TYPE)
25 return untagged()->h.hi_tag();
30 bool type_p(cell type_) const { return type() == type_; }
32 TYPE *untag_check(factorvm *myvm) const {
33 if(TYPE::type_number != TYPE_COUNT && !type_p(TYPE::type_number))
34 myvm->type_error(TYPE::type_number,value_);
38 explicit tagged(cell tagged) : value_(tagged) {
40 untag_check(SIGNAL_VM_PTR());
44 explicit tagged(TYPE *untagged) : value_(factor::tag(untagged)) {
46 untag_check(SIGNAL_VM_PTR());
50 TYPE *operator->() const { return untagged(); }
51 cell *operator&() const { return &value_; }
53 const tagged<TYPE>& operator=(const TYPE *x) { value_ = tag(x); return *this; }
54 const tagged<TYPE>& operator=(const cell &x) { value_ = x; return *this; }
56 bool operator==(const tagged<TYPE> &x) { return value_ == x.value_; }
57 bool operator!=(const tagged<TYPE> &x) { return value_ != x.value_; }
59 template<typename X> tagged<X> as() { return tagged<X>(value_); }
62 template <typename TYPE> TYPE *factorvm::untag_check(cell value)
64 return tagged<TYPE>(value).untag_check(this);
67 template <typename TYPE> TYPE *factorvm::untag(cell value)
69 return tagged<TYPE>(value).untagged();