Variable<T_>::Variable(std::string&& thename, T_ themin, T_ themax, T_ theini) : name_(std::move(thename)), min_(themin), max_(themax), ini_(theini), range_(1), offset_(0) { assert_invariant(); }
ref_count_ptr &operator=(const ref_count_ptr &r) { if (this==&r) return *this; reset(); ptr=r.ptr; dtor=r.dtor; k=r.k; if (*this) ++*k; // call operator bool() test if k != 0 assert_invariant(); return *this; }
void reset() { // If I am empty return if (!*this) return; if (!--*k) { /* --*k == 0 */ dtor(ptr); // clean up memory delete k; k=0; ptr=0; } assert_invariant(); }
Variable<T_>& Variable<T_>::operator=(Variable<T_>&& that) { if (!name_.empty()) { std::string err("trying to copy-assign the non-fresh variable \""); throw_FigException(err.append(name_).append("\"")); } name_ = std::move(that.name_); min_ = std::move(that.min_); max_ = std::move(that.max_); ini_ = std::move(that.ini_); range_ = std::move(that.range_); offset_ = std::move(that.offset_); assert_invariant(); return *this; }
// return 0 if empty void *get() { assert_invariant(); return (*this)?ptr:0; }
ref_count_ptr(void *ptr_, void (*dtor_)(void *)): ptr(ptr_), dtor(dtor_), k(0) { if (ptr_) k=new size_t(1); assert_invariant(); }
ref_count_ptr(const ref_count_ptr &r): ptr(r.ptr), dtor(r.dtor), k(r.k) { if (*this) ++*k; assert_invariant(); }
~ref_count_ptr() { reset(); assert_invariant(); }