diff --git a/src/datamodel/instance.cpp b/src/datamodel/instance.cpp index 7b5b5ea..755a79d 100644 --- a/src/datamodel/instance.cpp +++ b/src/datamodel/instance.cpp @@ -31,15 +31,15 @@ std::vector> Instance::GetChildren() { return this->children; } -Instance Instance::CloneInternal() { +std::unique_ptr Instance::CloneInternal() { // TODO: Implement refs - Instance clone = *this; - clone.children = std::vector>(); - clone.children.reserve(this->children.size()); + std::unique_ptr clone = this->copy(); + clone->children = std::vector>(); + clone->children.reserve(this->children.size()); for (std::shared_ptr child : this->children) { - clone.children.push_back(std::make_shared(child->CloneInternal())); + clone->children.push_back(std::make_shared(child->CloneInternal())); } return clone; diff --git a/src/datamodel/instance.h b/src/datamodel/instance.h index 7175f85..2ae4199 100644 --- a/src/datamodel/instance.h +++ b/src/datamodel/instance.h @@ -4,6 +4,8 @@ #include #include +#define INSTANCE_COPY_IMPL(CLASS_NAME) std::unique_ptr CLASS_NAME::copy() { return std::make_unique(CLASS_NAME(*this)); } + // The base class for all objects in the data model class Instance : std::enable_shared_from_this { private: @@ -16,5 +18,6 @@ public: std::vector> GetChildren(); virtual void Init(); - Instance CloneInternal(); + std::unique_ptr CloneInternal(); + virtual std::unique_ptr copy() const = 0; }; \ No newline at end of file