From b86d2b48cbd0a6367ba667f432879624a7098cca Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Thu, 5 Aug 2021 15:08:51 +0200
Subject: [PATCH] Make toCommit() a free function, remove copy/move ctors/ops

---
 .../RobotAPI/libraries/armem/CMakeLists.txt   |  2 +
 .../armem/core/diskmemory/CoreSegment.h       |  1 -
 .../libraries/armem/core/diskmemory/Entity.h  |  1 -
 .../armem/core/diskmemory/EntityInstance.cpp  |  6 ---
 .../armem/core/diskmemory/EntityInstance.h    |  5 ---
 .../armem/core/diskmemory/EntitySnapshot.h    |  1 -
 .../libraries/armem/core/diskmemory/Memory.h  |  1 -
 .../armem/core/diskmemory/ProviderSegment.h   |  1 -
 .../armem/core/longtermmemory/CoreSegment.h   |  1 -
 .../armem/core/longtermmemory/Entity.h        |  1 -
 .../core/longtermmemory/EntityInstance.h      |  5 ---
 .../core/longtermmemory/EntitySnapshot.h      |  1 -
 .../core/longtermmemory/ProviderSegment.h     |  1 -
 .../libraries/armem/core/operations.cpp       | 34 +++++++++++++++
 .../libraries/armem/core/operations.h         | 42 +++++++++++++++++++
 .../armem/core/workingmemory/CoreSegment.cpp  | 11 -----
 .../armem/core/workingmemory/Entity.cpp       | 12 ------
 .../armem/core/workingmemory/Entity.h         | 15 +------
 .../armem/core/workingmemory/EntityInstance.h |  5 ---
 .../core/workingmemory/EntitySnapshot.cpp     | 13 ------
 .../armem/core/workingmemory/EntitySnapshot.h | 13 +-----
 .../armem/core/workingmemory/Memory.cpp       | 11 -----
 .../armem/core/workingmemory/Memory.h         | 11 -----
 .../core/workingmemory/ProviderSegment.cpp    | 13 ------
 .../core/workingmemory/ProviderSegment.h      | 15 +------
 .../armem/server/MemoryToIceAdapter.cpp       |  2 +-
 26 files changed, 82 insertions(+), 142 deletions(-)
 create mode 100644 source/RobotAPI/libraries/armem/core/operations.cpp
 create mode 100644 source/RobotAPI/libraries/armem/core/operations.h

diff --git a/source/RobotAPI/libraries/armem/CMakeLists.txt b/source/RobotAPI/libraries/armem/CMakeLists.txt
index 6898b8e36..475bfbcf1 100644
--- a/source/RobotAPI/libraries/armem/CMakeLists.txt
+++ b/source/RobotAPI/libraries/armem/CMakeLists.txt
@@ -25,6 +25,7 @@ set(LIB_FILES
     core/Commit.cpp
     core/MemoryID.cpp
     core/MemoryID_operators.cpp
+    core/operations.cpp
     core/SuccessHeader.cpp
     core/Time.cpp
     core/ice_conversions.cpp
@@ -138,6 +139,7 @@ set(LIB_HEADERS
     core/DataMode.h
     core/MemoryID.h
     core/MemoryID_operators.h
+    core/operations.h
     core/SuccessHeader.h
     core/Time.h
     core/aron_conversions.h
diff --git a/source/RobotAPI/libraries/armem/core/diskmemory/CoreSegment.h b/source/RobotAPI/libraries/armem/core/diskmemory/CoreSegment.h
index 76bb297e7..cccf81b00 100644
--- a/source/RobotAPI/libraries/armem/core/diskmemory/CoreSegment.h
+++ b/source/RobotAPI/libraries/armem/core/diskmemory/CoreSegment.h
@@ -22,7 +22,6 @@ namespace armarx::armem::d_ltm
     public:
 
         using Base::CoreSegmentBase;
-        using Base::operator=;
 
 
         // Conversion
diff --git a/source/RobotAPI/libraries/armem/core/diskmemory/Entity.h b/source/RobotAPI/libraries/armem/core/diskmemory/Entity.h
index 350222755..09b8ab78c 100644
--- a/source/RobotAPI/libraries/armem/core/diskmemory/Entity.h
+++ b/source/RobotAPI/libraries/armem/core/diskmemory/Entity.h
@@ -38,7 +38,6 @@ namespace armarx::armem::d_ltm
     public:
 
         using Base::EntityBase;
-        using Base::operator=;
 
 
         // Conversion
diff --git a/source/RobotAPI/libraries/armem/core/diskmemory/EntityInstance.cpp b/source/RobotAPI/libraries/armem/core/diskmemory/EntityInstance.cpp
index d22310fb2..e3bff18fa 100644
--- a/source/RobotAPI/libraries/armem/core/diskmemory/EntityInstance.cpp
+++ b/source/RobotAPI/libraries/armem/core/diskmemory/EntityInstance.cpp
@@ -15,12 +15,6 @@
 namespace armarx::armem::d_ltm
 {
 
-    EntityInstance::EntityInstance(const EntityInstance& other) :
-        Base(other),
-        path(other.path)
-    {
-    }
-
     bool EntityInstance::equalsDeep(const EntityInstance& other) const
     {
         return id() == other.id();
diff --git a/source/RobotAPI/libraries/armem/core/diskmemory/EntityInstance.h b/source/RobotAPI/libraries/armem/core/diskmemory/EntityInstance.h
index c27f49951..c94ee5dcd 100644
--- a/source/RobotAPI/libraries/armem/core/diskmemory/EntityInstance.h
+++ b/source/RobotAPI/libraries/armem/core/diskmemory/EntityInstance.h
@@ -22,11 +22,6 @@ namespace armarx::armem::d_ltm
 
         using Base::EntityInstanceBase;
 
-        EntityInstance(const EntityInstance& other);
-        EntityInstance(EntityInstance&& other) = default;
-        EntityInstance& operator=(const EntityInstance& other) = default;
-        EntityInstance& operator=(EntityInstance&& other) = default;
-
 
         /**
          * @brief Fill `*this` with the update's values.
diff --git a/source/RobotAPI/libraries/armem/core/diskmemory/EntitySnapshot.h b/source/RobotAPI/libraries/armem/core/diskmemory/EntitySnapshot.h
index be36a8a77..5005af5f7 100644
--- a/source/RobotAPI/libraries/armem/core/diskmemory/EntitySnapshot.h
+++ b/source/RobotAPI/libraries/armem/core/diskmemory/EntitySnapshot.h
@@ -24,7 +24,6 @@ namespace armarx::armem::d_ltm
     public:
 
         using Base::EntitySnapshotBase;
-        using Base::operator=;
 
 
         // Conversion
diff --git a/source/RobotAPI/libraries/armem/core/diskmemory/Memory.h b/source/RobotAPI/libraries/armem/core/diskmemory/Memory.h
index 7f7872f7a..de2cae3c7 100644
--- a/source/RobotAPI/libraries/armem/core/diskmemory/Memory.h
+++ b/source/RobotAPI/libraries/armem/core/diskmemory/Memory.h
@@ -22,7 +22,6 @@ namespace armarx::armem::d_ltm
     public:
 
         using Base::MemoryBase;
-        using Base::operator=;
 
 
         // Conversion
diff --git a/source/RobotAPI/libraries/armem/core/diskmemory/ProviderSegment.h b/source/RobotAPI/libraries/armem/core/diskmemory/ProviderSegment.h
index 8ad96ea06..eb7d300e0 100644
--- a/source/RobotAPI/libraries/armem/core/diskmemory/ProviderSegment.h
+++ b/source/RobotAPI/libraries/armem/core/diskmemory/ProviderSegment.h
@@ -22,7 +22,6 @@ namespace armarx::armem::d_ltm
     public:
 
         using Base::ProviderSegmentBase;
-        using Base::operator=;
 
 
         // Conversion
diff --git a/source/RobotAPI/libraries/armem/core/longtermmemory/CoreSegment.h b/source/RobotAPI/libraries/armem/core/longtermmemory/CoreSegment.h
index adb325791..797b9df1f 100644
--- a/source/RobotAPI/libraries/armem/core/longtermmemory/CoreSegment.h
+++ b/source/RobotAPI/libraries/armem/core/longtermmemory/CoreSegment.h
@@ -21,7 +21,6 @@ namespace armarx::armem::ltm
     public:
 
         using Base::CoreSegmentBase;
-        using Base::operator=;
 
 
         // Conversion
diff --git a/source/RobotAPI/libraries/armem/core/longtermmemory/Entity.h b/source/RobotAPI/libraries/armem/core/longtermmemory/Entity.h
index c564e60b6..79c783de9 100644
--- a/source/RobotAPI/libraries/armem/core/longtermmemory/Entity.h
+++ b/source/RobotAPI/libraries/armem/core/longtermmemory/Entity.h
@@ -36,7 +36,6 @@ namespace armarx::armem::ltm
     public:
 
         using Base::EntityBase;
-        using Base::operator=;
 
         Entity()
         {
diff --git a/source/RobotAPI/libraries/armem/core/longtermmemory/EntityInstance.h b/source/RobotAPI/libraries/armem/core/longtermmemory/EntityInstance.h
index ba72d68bf..6046f6ac5 100644
--- a/source/RobotAPI/libraries/armem/core/longtermmemory/EntityInstance.h
+++ b/source/RobotAPI/libraries/armem/core/longtermmemory/EntityInstance.h
@@ -21,11 +21,6 @@ namespace armarx::armem::ltm
 
         using Base::EntityInstanceBase;
 
-        EntityInstance(const EntityInstance& other) = default;
-        EntityInstance(EntityInstance&& other) = default;
-        EntityInstance& operator=(const EntityInstance& other) = default;
-        EntityInstance& operator=(EntityInstance&& other) = default;
-
 
         /**
          * @brief Fill `*this` with the update's values.
diff --git a/source/RobotAPI/libraries/armem/core/longtermmemory/EntitySnapshot.h b/source/RobotAPI/libraries/armem/core/longtermmemory/EntitySnapshot.h
index b55760247..b3d6211bd 100644
--- a/source/RobotAPI/libraries/armem/core/longtermmemory/EntitySnapshot.h
+++ b/source/RobotAPI/libraries/armem/core/longtermmemory/EntitySnapshot.h
@@ -23,7 +23,6 @@ namespace armarx::armem::ltm
     public:
 
         using Base::EntitySnapshotBase;
-        using Base::operator=;
 
 
         // Conversion
diff --git a/source/RobotAPI/libraries/armem/core/longtermmemory/ProviderSegment.h b/source/RobotAPI/libraries/armem/core/longtermmemory/ProviderSegment.h
index c18100e96..ed48ff071 100644
--- a/source/RobotAPI/libraries/armem/core/longtermmemory/ProviderSegment.h
+++ b/source/RobotAPI/libraries/armem/core/longtermmemory/ProviderSegment.h
@@ -21,7 +21,6 @@ namespace armarx::armem::ltm
     public:
 
         using Base::ProviderSegmentBase;
-        using Base::operator=;
 
 
         // Conversion
diff --git a/source/RobotAPI/libraries/armem/core/operations.cpp b/source/RobotAPI/libraries/armem/core/operations.cpp
new file mode 100644
index 000000000..e43995730
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/core/operations.cpp
@@ -0,0 +1,34 @@
+#include "operations.h"
+
+#include "workingmemory/EntityInstance.h"
+
+
+namespace armarx
+{
+
+    std::vector<aron::datanavigator::DictNavigatorPtr>
+    armem::getAronData(const wm::EntitySnapshot& snapshot)
+    {
+        std::vector<aron::datanavigator::DictNavigatorPtr> result;
+        snapshot.forEachChild([&result](const wm::EntityInstance& instance)
+        {
+            result.push_back(instance.data());
+            return true;
+        });
+        return result;
+    }
+
+
+    armem::EntityUpdate armem::toEntityUpdate(const wm::EntitySnapshot& snapshot)
+    {
+        EntityUpdate up;
+        up.entityID = snapshot.id().getEntityID();
+        up.timeCreated = snapshot.time();
+        up.instancesData = getAronData(snapshot);
+        return up;
+    }
+
+}
+
+
+
diff --git a/source/RobotAPI/libraries/armem/core/operations.h b/source/RobotAPI/libraries/armem/core/operations.h
new file mode 100644
index 000000000..9fc479dcf
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/core/operations.h
@@ -0,0 +1,42 @@
+#pragma once
+
+#if 0  // Not need at the moment.
+#include "workingmemory/Memory.h"
+#include "workingmemory/CoreSegment.h"
+#include "workingmemory/ProviderSegment.h"
+#include "workingmemory/Entity.h"
+#include "workingmemory/EntityInstance.h"
+#endif
+
+#include "workingmemory/EntitySnapshot.h"
+
+
+/*
+ * Functions performing some "advanced" operations on the memory
+ * data structure, which are using their public API but should not
+ * be part of it.
+ */
+
+namespace armarx::armem
+{
+
+    std::vector<aron::datanavigator::DictNavigatorPtr>
+    getAronData(const wm::EntitySnapshot& snapshot);
+
+    EntityUpdate toEntityUpdate(const wm::EntitySnapshot& snapshot);
+
+
+    template <class ContainerT>
+    Commit toCommit(const ContainerT& container)
+    {
+        Commit commit;
+        container.forEachSnapshot([&commit](const wm::EntitySnapshot & snapshot)
+        {
+            commit.add(toEntityUpdate(snapshot));
+            return true;
+        });
+        return commit;
+    }
+
+}
+
diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/CoreSegment.cpp b/source/RobotAPI/libraries/armem/core/workingmemory/CoreSegment.cpp
index 9e87538e0..eb437eb16 100644
--- a/source/RobotAPI/libraries/armem/core/workingmemory/CoreSegment.cpp
+++ b/source/RobotAPI/libraries/armem/core/workingmemory/CoreSegment.cpp
@@ -39,17 +39,6 @@ namespace armarx::armem::wm
     }
 
 
-    Commit CoreSegment::toCommit() const
-    {
-        Commit c;
-        for (const auto& [k, s] : _container)
-        {
-            c.append(s.toCommit());
-        }
-        return c;
-    }
-
-
     std::mutex& CoreSegment::mutex() const
     {
         return _mutex;
diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/Entity.cpp b/source/RobotAPI/libraries/armem/core/workingmemory/Entity.cpp
index 27661a6ce..e212c0d36 100644
--- a/source/RobotAPI/libraries/armem/core/workingmemory/Entity.cpp
+++ b/source/RobotAPI/libraries/armem/core/workingmemory/Entity.cpp
@@ -4,17 +4,5 @@
 namespace armarx::armem::wm
 {
 
-    Commit Entity::toCommit() const
-    {
-        Commit c;
-        for (const auto& [k, s] : _container)
-        {
-            EntityUpdate& up = c.add();
-            up.entityID = id();
-            up.timeCreated = k;
-            up.instancesData = s.getAronData();
-        }
-        return c;
-    }
 
 }
diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/Entity.h b/source/RobotAPI/libraries/armem/core/workingmemory/Entity.h
index 450a95c81..34e9b2abd 100644
--- a/source/RobotAPI/libraries/armem/core/workingmemory/Entity.h
+++ b/source/RobotAPI/libraries/armem/core/workingmemory/Entity.h
@@ -29,22 +29,9 @@ namespace armarx::armem::wm
     class Entity :
         public base::EntityBase<EntitySnapshot, Entity>
     {
-        using Base = base::EntityBase<EntitySnapshot, Entity>;
-
     public:
 
-        using Base::EntityBase;
-
-        Entity(const Entity& other) = default;
-        Entity(Entity&& other) = default;
-        Entity& operator=(const Entity& other) = default;
-        Entity& operator=(Entity&& other) = default;
-
-        /**
-         * @brief Convert the content of this segmnet into a commit
-         * @return The resulting commit
-         */
-        Commit toCommit() const;
+        using base::EntityBase<EntitySnapshot, Entity>::EntityBase;
 
     };
 
diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/EntityInstance.h b/source/RobotAPI/libraries/armem/core/workingmemory/EntityInstance.h
index 18d744c59..158b1c0f8 100644
--- a/source/RobotAPI/libraries/armem/core/workingmemory/EntityInstance.h
+++ b/source/RobotAPI/libraries/armem/core/workingmemory/EntityInstance.h
@@ -23,11 +23,6 @@ namespace armarx::armem::wm
 
         using Base::EntityInstanceBase;
 
-        EntityInstance(const EntityInstance& other) = default;
-        EntityInstance(EntityInstance&& other) = default;
-        EntityInstance& operator=(const EntityInstance& other) = default;
-        EntityInstance& operator=(EntityInstance&& other) = default;
-
 
         /**
          * @brief Fill `*this` with the update's values.
diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/EntitySnapshot.cpp b/source/RobotAPI/libraries/armem/core/workingmemory/EntitySnapshot.cpp
index 5d7506a0f..b5daa3192 100644
--- a/source/RobotAPI/libraries/armem/core/workingmemory/EntitySnapshot.cpp
+++ b/source/RobotAPI/libraries/armem/core/workingmemory/EntitySnapshot.cpp
@@ -1,20 +1,7 @@
 #include "EntitySnapshot.h"
 
-#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
-
-#include "error.h"
-
 
 namespace armarx::armem::wm
 {
-    std::vector<aron::datanavigator::DictNavigatorPtr> EntitySnapshot::getAronData() const
-    {
-        std::vector<aron::datanavigator::DictNavigatorPtr> ret;
-        for (const auto& aron : _container)
-        {
-            ret.push_back(aron.data());
-        }
-        return ret;
-    }
 
 }
diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/EntitySnapshot.h b/source/RobotAPI/libraries/armem/core/workingmemory/EntitySnapshot.h
index 90b03d1ae..c19a2f830 100644
--- a/source/RobotAPI/libraries/armem/core/workingmemory/EntitySnapshot.h
+++ b/source/RobotAPI/libraries/armem/core/workingmemory/EntitySnapshot.h
@@ -14,20 +14,9 @@ namespace armarx::armem::wm
     class EntitySnapshot :
         public base::EntitySnapshotBase<EntityInstance, EntitySnapshot>
     {
-        using Base = base::EntitySnapshotBase<EntityInstance, EntitySnapshot>;
-
     public:
 
-        using Base::EntitySnapshotBase;
-        // using Base::operator=;
-
-        EntitySnapshot(const EntitySnapshot& other) = default;
-        EntitySnapshot(EntitySnapshot&& other) = default;
-        EntitySnapshot& operator=(const EntitySnapshot& other) = default;
-        EntitySnapshot& operator=(EntitySnapshot&& other) = default;
-
-
-        std::vector<aron::datanavigator::DictNavigatorPtr> getAronData() const;
+        using base::EntitySnapshotBase<EntityInstance, EntitySnapshot>::EntitySnapshotBase;
 
     };
 }
diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/Memory.cpp b/source/RobotAPI/libraries/armem/core/workingmemory/Memory.cpp
index c69a222b3..7bff4f19e 100644
--- a/source/RobotAPI/libraries/armem/core/workingmemory/Memory.cpp
+++ b/source/RobotAPI/libraries/armem/core/workingmemory/Memory.cpp
@@ -71,15 +71,4 @@ namespace armarx::armem::wm
         return result;
     }
 
-
-    Commit Memory::toCommit() const
-    {
-        Commit c;
-        for (const auto& [k, s] : _container)
-        {
-            c.append(s.toCommit());
-        }
-        return c;
-    }
-
 }
diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/Memory.h b/source/RobotAPI/libraries/armem/core/workingmemory/Memory.h
index b6595c83d..e3684b3b6 100644
--- a/source/RobotAPI/libraries/armem/core/workingmemory/Memory.h
+++ b/source/RobotAPI/libraries/armem/core/workingmemory/Memory.h
@@ -20,10 +20,6 @@ namespace armarx::armem::wm
 
         using Base::MemoryBase;
 
-        Memory(const Memory& other) = default;
-        Memory(Memory&& other) = default;
-        Memory& operator=(const Memory& other) = default;
-        Memory& operator=(Memory&& other) = default;
 
         /**
          * @brief Perform the commit, locking the core segments.
@@ -38,12 +34,5 @@ namespace armarx::armem::wm
          */
         Base::UpdateResult updateLocking(const EntityUpdate& update);
 
-
-        /**
-         * @brief Convert the content of this memory into a commit
-         * @return The resulting commit
-         */
-        Commit toCommit() const;
-
     };
 }
diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/ProviderSegment.cpp b/source/RobotAPI/libraries/armem/core/workingmemory/ProviderSegment.cpp
index b67fa10f5..01aa4e39b 100644
--- a/source/RobotAPI/libraries/armem/core/workingmemory/ProviderSegment.cpp
+++ b/source/RobotAPI/libraries/armem/core/workingmemory/ProviderSegment.cpp
@@ -1,21 +1,8 @@
 #include "ProviderSegment.h"
 
-#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
-
-#include "error.h"
-
 
 namespace armarx::armem::wm
 {
 
-    Commit ProviderSegment::toCommit() const
-    {
-        Commit c;
-        for (const auto& [k, s] : _container)
-        {
-            c.append(s.toCommit());
-        }
-        return c;
-    }
 
 }
diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/ProviderSegment.h b/source/RobotAPI/libraries/armem/core/workingmemory/ProviderSegment.h
index e837469d8..75b5d3b36 100644
--- a/source/RobotAPI/libraries/armem/core/workingmemory/ProviderSegment.h
+++ b/source/RobotAPI/libraries/armem/core/workingmemory/ProviderSegment.h
@@ -14,22 +14,9 @@ namespace armarx::armem::wm
     class ProviderSegment :
         public base::ProviderSegmentBase<Entity, ProviderSegment>
     {
-        using Base = base::ProviderSegmentBase<Entity, ProviderSegment>;
-
     public:
 
-        using Base::ProviderSegmentBase;
-
-        ProviderSegment(const ProviderSegment& other) = default;
-        ProviderSegment(ProviderSegment&& other) = default;
-        ProviderSegment& operator=(const ProviderSegment& other) = default;
-        ProviderSegment& operator=(ProviderSegment&& other) = default;
-
-        /**
-         * @brief Convert the content of this segmnet into a commit
-         * @return The resulting commit
-         */
-        Commit toCommit() const;
+        using base::ProviderSegmentBase<Entity, ProviderSegment>::ProviderSegmentBase;
 
     };
 
diff --git a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp
index b61a3ba13..60f134edc 100644
--- a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp
+++ b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp
@@ -279,7 +279,7 @@ namespace armarx::armem::server
             result.memory = toIce<data::MemoryPtr>(merged_result);
 
             // also move results of ltm to wm
-            //this->commit(ltm_converted.toCommit());
+            //this->commit(toCommit(ltm_converted));
 
             // mark removed entries of wm in viewer
             // TODO
-- 
GitLab