\
\
static TYPE* new_copy(const TYPE &rhs) { auto *ret = new TYPE(rhs); assert(ret->id() == rhs.id()); return ret; } \
static TYPE* new_copy(TYPE &&rhs) { auto *ret = new TYPE(std::move(rhs)); assert(ret->id() == rhs.id()); return ret; } \
static TYPE make_copy(const TYPE &rhs) { TYPE ret(rhs); assert(ret.id() == rhs.id()); return ret; } \
static TYPE make_copy(TYPE &&rhs) { TYPE ret(std::move(rhs)); assert(ret.id() == rhs.id()); return ret; } \
TYPE& assign_copy(const TYPE &rhs); \
TYPE& assign_copy(TYPE &&rhs); \
\
static TYPE* new_clone(const TYPE &rhs) { \
\
auto obj = new TYPE(-1); \
obj->assign_clone(rhs); \
assert(obj->id().valid() && obj->id() != rhs.id()); \
return obj; \
} \
TYPE make_clone(const TYPE &rhs) { \
\
TYPE obj(-1); \
obj.assign_clone(rhs); \
assert(obj.id().valid() && obj.id() != rhs.id()); \
return obj; \
} \
TYPE& assign_clone(const TYPE &rhs) { \
this->assign_copy(rhs); \
assert(this->id().valid() && this->id() == rhs.id()); \
this->assign_new_unique_ids_recursive(); \
assert(this->id().valid() && this->id() != rhs.id()); \
return *this; \
}
142#define OBJECTBASE_DERIVED_COPY_MOVE_CLONE(TYPE) \
143 \
144 \
145 static TYPE* new_copy(const TYPE &rhs) { auto *ret = new TYPE(rhs); assert(ret->id() == rhs.id()); return ret; } \
146 static TYPE* new_copy(TYPE &&rhs) { auto *ret = new TYPE(std::move(rhs)); assert(ret->id() == rhs.id()); return ret; } \
147 static TYPE make_copy(const TYPE &rhs) { TYPE ret(rhs); assert(ret.id() == rhs.id()); return ret; } \
148 static TYPE make_copy(TYPE &&rhs) { TYPE ret(std::move(rhs)); assert(ret.id() == rhs.id()); return ret; } \
149 TYPE& assign_copy(const TYPE &rhs); \
150 TYPE& assign_copy(TYPE &&rhs); \
151 \
152 static TYPE* new_clone(const TYPE &rhs) { \
153 \
154 auto obj = new TYPE(-1); \
155 obj->assign_clone(rhs); \
156 assert(obj->id().valid() && obj->id() != rhs.id()); \
157 return obj; \
158 } \
159 TYPE make_clone(const TYPE &rhs) { \
160 \
161 TYPE obj(-1); \
162 obj.assign_clone(rhs); \
163 assert(obj.id().valid() && obj.id() != rhs.id()); \
164 return obj; \
165 } \
166 TYPE& assign_clone(const TYPE &rhs) { \
167 this->assign_copy(rhs); \
168 assert(this->id().valid() && this->id() == rhs.id()); \
169 this->assign_new_unique_ids_recursive(); \
170 assert(this->id().valid() && this->id() != rhs.id()); \
171 return *this; \
172 }