+ Type* untagged() const {
+#ifdef FACTOR_DEBUG
+ FACTOR_ASSERT(type_p());
+#endif
+ return (Type*)(UNTAG(value_));
+ }
+
+ Type* untag_check(factor_vm* parent) const {
+ if (!type_p())
+ parent->type_error(Type::type_number, value_);
+ return untagged();
+ }
+
+ explicit tagged(cell tagged) : value_(tagged) {}
+ explicit tagged(Type* untagged) : value_(factor::tag(untagged)) {}
+
+ Type* operator->() const { return untagged(); }
+ cell* operator&() const { return &value_; }
+
+ const tagged<Type>& operator=(const Type* x) {
+ value_ = tag(x);
+ return *this;
+ }
+ const tagged<Type>& operator=(const cell& x) {
+ value_ = x;
+ return *this;
+ }
+
+ bool operator==(const tagged<Type>& x) { return value_ == x.value_; }
+ bool operator!=(const tagged<Type>& x) { return value_ != x.value_; }
+
+ template <typename NewType> tagged<NewType> as() {
+ return tagged<NewType>(value_);
+ }