From 1ad5bd25ef8847328115a0b22aa96796f5818b6c Mon Sep 17 00:00:00 2001
From: Olivier BICHLER <olivier.bichler@cea.fr>
Date: Thu, 28 Sep 2023 14:09:09 +0200
Subject: [PATCH] Do NOT clone the implementation

---
 include/aidge/backend/OperatorImpl.hpp | 4 ----
 include/aidge/operator/Operator.hpp    | 4 +++-
 src/graph/Node.cpp                     | 4 ++--
 3 files changed, 5 insertions(+), 7 deletions(-)

diff --git a/include/aidge/backend/OperatorImpl.hpp b/include/aidge/backend/OperatorImpl.hpp
index cc77ab053..453e30a86 100644
--- a/include/aidge/backend/OperatorImpl.hpp
+++ b/include/aidge/backend/OperatorImpl.hpp
@@ -20,10 +20,6 @@
 namespace Aidge {
 class OperatorImpl {
 public:
-    /**
-     * @brief Clone the implementation using its copy-constructor.
-     */
-    virtual std::unique_ptr<OperatorImpl> clone() const = 0;
 
     virtual void forward(){};
     virtual void backward(){};
diff --git a/include/aidge/operator/Operator.hpp b/include/aidge/operator/Operator.hpp
index 892e5bdb7..f99b1e26d 100644
--- a/include/aidge/operator/Operator.hpp
+++ b/include/aidge/operator/Operator.hpp
@@ -42,7 +42,9 @@ public:
     std::enable_shared_from_this<Operator>()
   {
     mType = op.mType;
-    mImpl = op.mImpl->clone();
+    // Implementation is never cloned. It is up to the non-abstract Operator copy-constructor to create a new implementation matching the copied Operator implementation.
+    // See https://gitlab.eclipse.org/eclipse/aidge/aidge_core/-/merge_requests/8#note_1214050 for the discussion.
+    // Hooks are not copied.
   }
 
 public:
diff --git a/src/graph/Node.cpp b/src/graph/Node.cpp
index 0155b22d7..54fdac808 100644
--- a/src/graph/Node.cpp
+++ b/src/graph/Node.cpp
@@ -332,13 +332,13 @@ Aidge::NodePtr Aidge::Node::cloneSharedOperators() const {
 Aidge::NodePtr Aidge::Node::cloneSharedProducers() const {
     std::shared_ptr<Operator> op = (mOperator->type() == Producer_Op::Type)
         ? mOperator
-        : std::shared_ptr<Operator>(mOperator->clone());
+        : mOperator->clone();
 
     return std::make_shared<Node>(op, mName);
 }
 
 Aidge::NodePtr Aidge::Node::clone() const {
-    return std::make_shared<Node>(std::shared_ptr<Operator>(mOperator->clone()), mName);
+    return std::make_shared<Node>(mOperator->clone(), mName);
 }
 
 /////////////////////////////////////////////////////////////////////////////////////////////
-- 
GitLab