namespace factor { template struct data_root : public tagged { factor_vm* parent; void push() { parent->data_roots.push_back(&this->value_); } data_root(cell value, factor_vm* parent) : tagged(value), parent(parent) { push(); } data_root(Type* value, factor_vm* parent) : tagged(value), parent(parent) { FACTOR_ASSERT(value); push(); } const data_root& operator=(const Type* x) { tagged::operator=(x); return *this; } const data_root& operator=(const cell& x) { tagged::operator=(x); return *this; } ~data_root() { parent->data_roots.pop_back(); } friend void swap(data_root& a, data_root& b) { cell tmp = a.value_; a.value_ = b.value_; b.value_ = tmp; } }; }