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(); } ~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; } }; }