3 template <typename Type> cell tag(Type* value) {
4 return RETAG(value, Type::type_number);
7 inline static cell tag_dynamic(object* value) {
8 return RETAG(value, value->type());
11 template <typename Type> struct tagged {
14 cell type() const { return TAG(value_); }
17 if (Type::type_number == TYPE_COUNT)
19 return type() == Type::type_number;
23 FACTOR_ASSERT(type_p());
27 Type* untagged() const {
28 FACTOR_ASSERT(type_p());
29 return (Type*)(UNTAG(value_));
32 Type* untag_check(factor_vm* parent) const {
34 parent->type_error(Type::type_number, value_);
38 explicit tagged(cell tagged) : value_(tagged) {}
39 explicit tagged(Type* untagged) : value_(factor::tag(untagged)) {}
41 Type* operator->() const { return untagged(); }
42 cell* operator&() const { return &value_; }
44 const tagged<Type>& operator=(const Type* x) {
48 const tagged<Type>& operator=(const cell& x) {
53 bool operator==(const tagged<Type>& x) { return value_ == x.value_; }
54 bool operator!=(const tagged<Type>& x) { return value_ != x.value_; }
56 template <typename NewType> tagged<NewType> as() {
57 return tagged<NewType>(value_);
61 template <typename Type> Type* factor_vm::untag_check(cell value) {
62 return tagged<Type>(value).untag_check(this);
65 template <typename Type> Type* untag(cell value) {
66 return tagged<Type>(value).untagged();