From ae29782781ba559b92635484a8620784538bb116 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Fri, 15 Jun 2018 16:45:07 +0200
Subject: [PATCH] adapt graph implementation for changes in core of the library

---
 alib2graph_data/src/edge/Edge.hpp             |  8 ++--
 alib2graph_data/src/edge/EdgeBase.hpp         |  4 +-
 .../src/edge/capacity/CapacityEdge.hpp        |  8 ++--
 .../src/edge/weighted/WeightedEdge.hpp        |  8 ++--
 alib2graph_data/src/graph/GraphBase.hpp       |  4 +-
 .../src/graph/directed/DirectedGraph.hpp      | 12 ++---
 .../src/graph/directed/DirectedMultiGraph.hpp | 12 ++---
 .../src/graph/mixed/MixedGraph.hpp            | 12 ++---
 .../src/graph/mixed/MixedMultiGraph.hpp       | 12 ++---
 .../src/graph/undirected/UndirectedGraph.hpp  | 12 ++---
 .../graph/undirected/UndirectedMultiGraph.hpp | 12 ++---
 .../graph/weighted/WeightedGraphClasses.hpp   | 48 +++++++------------
 alib2graph_data/src/grid/GridBase.hpp         |  4 +-
 .../src/grid/square/SquareGrid4.hpp           | 12 ++---
 .../src/grid/square/SquareGrid8.hpp           | 12 ++---
 .../src/grid/square/WeightedSquareGrid4.hpp   | 12 ++---
 .../src/grid/square/WeightedSquareGrid8.hpp   | 12 ++---
 alib2graph_data/src/node/Node.cpp             |  4 +-
 alib2graph_data/src/node/Node.hpp             |  4 +-
 alib2graph_data/src/node/NodeBase.hpp         |  4 +-
 20 files changed, 92 insertions(+), 124 deletions(-)

diff --git a/alib2graph_data/src/edge/Edge.hpp b/alib2graph_data/src/edge/Edge.hpp
index ec99c3f209..bced6eefe7 100644
--- a/alib2graph_data/src/edge/Edge.hpp
+++ b/alib2graph_data/src/edge/Edge.hpp
@@ -39,9 +39,9 @@ class Edge : public ext::pair<TNode, TNode>, public EdgeBase {
 // ObjectBase interface
 
  public:
-  EdgeBase *clone() const override;
+  EdgeBase *clone() const & override;
 
-  EdgeBase *plunder() &&override;
+  EdgeBase *clone() && override;
 
   int compare(const object::ObjectBase &other) const override;
 
@@ -78,12 +78,12 @@ std::string Edge<TNode>::name() const {
 // ---------------------------------------------------------------------------------------------------------------------
 
 template<typename TNode>
-EdgeBase *Edge<TNode>::clone() const {
+EdgeBase *Edge<TNode>::clone() const & {
   return new Edge(*this);
 }
 
 template<typename TNode>
-EdgeBase *Edge<TNode>::plunder() &&{
+EdgeBase *Edge<TNode>::clone() &&{
   return new Edge(std::move(*this));
 }
 
diff --git a/alib2graph_data/src/edge/EdgeBase.hpp b/alib2graph_data/src/edge/EdgeBase.hpp
index 0690b5bb12..6b28024b15 100644
--- a/alib2graph_data/src/edge/EdgeBase.hpp
+++ b/alib2graph_data/src/edge/EdgeBase.hpp
@@ -21,8 +21,8 @@ class EdgeBase : public object::ObjectBase {
 // ---------------------------------------------------------------------------------------------------------------------
 
  public:
-  virtual EdgeBase *clone() const = 0;
-  virtual EdgeBase *plunder() &&= 0;
+  virtual EdgeBase *clone() const & = 0;
+  virtual EdgeBase *clone() && = 0;
 
 // ---------------------------------------------------------------------------------------------------------------------
 };
diff --git a/alib2graph_data/src/edge/capacity/CapacityEdge.hpp b/alib2graph_data/src/edge/capacity/CapacityEdge.hpp
index 6a41773575..a033742bc0 100644
--- a/alib2graph_data/src/edge/capacity/CapacityEdge.hpp
+++ b/alib2graph_data/src/edge/capacity/CapacityEdge.hpp
@@ -49,9 +49,9 @@ class CapacityEdge : public ext::pair<TNode, TNode>, public EdgeBase {
 // ObjectBase interface
 
  public:
-  EdgeBase *clone() const override;
+  EdgeBase *clone() const & override;
 
-  EdgeBase *plunder() &&override;
+  EdgeBase *clone() && override;
 
   int compare(const object::ObjectBase &other) const override;
 
@@ -100,12 +100,12 @@ std::string CapacityEdge<TNode, TCapacity>::name() const {
 // ---------------------------------------------------------------------------------------------------------------------
 
 template<typename TNode, typename TCapacity>
-EdgeBase *CapacityEdge<TNode, TCapacity>::clone() const {
+EdgeBase *CapacityEdge<TNode, TCapacity>::clone() const & {
   return new CapacityEdge(*this);
 }
 
 template<typename TNode, typename TCapacity>
-EdgeBase *CapacityEdge<TNode, TCapacity>::plunder() &&{
+EdgeBase *CapacityEdge<TNode, TCapacity>::clone() &&{
   return new CapacityEdge(std::move(*this));
 }
 
diff --git a/alib2graph_data/src/edge/weighted/WeightedEdge.hpp b/alib2graph_data/src/edge/weighted/WeightedEdge.hpp
index 6050955c87..5a57cbeca5 100644
--- a/alib2graph_data/src/edge/weighted/WeightedEdge.hpp
+++ b/alib2graph_data/src/edge/weighted/WeightedEdge.hpp
@@ -49,9 +49,9 @@ class WeightedEdge : public ext::pair<TNode, TNode>, public EdgeBase {
 // ObjectBase interface
 
  public:
-  EdgeBase *clone() const override;
+  EdgeBase *clone() const & override;
 
-  EdgeBase *plunder() &&override;
+  EdgeBase *clone() && override;
 
   int compare(const object::ObjectBase &other) const override;
 
@@ -100,12 +100,12 @@ std::string WeightedEdge<TNode, TWeight>::name() const {
 // ---------------------------------------------------------------------------------------------------------------------
 
 template<typename TNode, typename TWeight>
-EdgeBase *WeightedEdge<TNode, TWeight>::clone() const {
+EdgeBase *WeightedEdge<TNode, TWeight>::clone() const & {
   return new WeightedEdge(*this);
 }
 
 template<typename TNode, typename TWeight>
-EdgeBase *WeightedEdge<TNode, TWeight>::plunder() &&{
+EdgeBase *WeightedEdge<TNode, TWeight>::clone() &&{
   return new WeightedEdge(std::move(*this));
 }
 
diff --git a/alib2graph_data/src/graph/GraphBase.hpp b/alib2graph_data/src/graph/GraphBase.hpp
index ef3e66e71e..9375beaec8 100644
--- a/alib2graph_data/src/graph/GraphBase.hpp
+++ b/alib2graph_data/src/graph/GraphBase.hpp
@@ -21,8 +21,8 @@ class GraphBase : public object::ObjectBase {
 // ---------------------------------------------------------------------------------------------------------------------
 
  public:
-  virtual GraphBase *clone() const = 0;
-  virtual GraphBase *plunder() &&= 0;
+  virtual GraphBase *clone() const & = 0;
+  virtual GraphBase *clone() && = 0;
 
 // ---------------------------------------------------------------------------------------------------------------------
 };
diff --git a/alib2graph_data/src/graph/directed/DirectedGraph.hpp b/alib2graph_data/src/graph/directed/DirectedGraph.hpp
index 3ecb372ed5..518fe69942 100644
--- a/alib2graph_data/src/graph/directed/DirectedGraph.hpp
+++ b/alib2graph_data/src/graph/directed/DirectedGraph.hpp
@@ -33,7 +33,6 @@ class DirectedGraph : public GraphInterface<TNode, TEdge> {
  public:
   using node_type = TNode;
   using edge_type = TEdge;
-  using normalized_type = DirectedGraph<>;
 
 // ---------------------------------------------------------------------------------------------------------------------
 
@@ -58,9 +57,9 @@ class DirectedGraph : public GraphInterface<TNode, TEdge> {
 // =====================================================================================================================
 // ObjectBase interface
  public:
-  GraphBase *clone() const override;
+  GraphBase *clone() const & override;
 
-  GraphBase *plunder() &&override;
+  GraphBase *clone() && override;
 
   int compare(const object::ObjectBase &other) const override;
 
@@ -319,12 +318,12 @@ std::string DirectedGraph<TNode, TEdge>::name() const {
 // ---------------------------------------------------------------------------------------------------------------------
 
 template<typename TNode, typename TEdge>
-GraphBase *DirectedGraph<TNode, TEdge>::clone() const {
+GraphBase *DirectedGraph<TNode, TEdge>::clone() const & {
   return new DirectedGraph(*this);
 }
 
 template<typename TNode, typename TEdge>
-GraphBase *DirectedGraph<TNode, TEdge>::plunder() &&{
+GraphBase *DirectedGraph<TNode, TEdge>::clone() && {
   return new DirectedGraph(std::move(*this));
 }
 
@@ -392,8 +391,7 @@ namespace core {
  */
 
 template<typename TNode, typename TEdge>
-struct normalize<graph::DirectedGraph<TNode, TEdge>, typename std::enable_if<!std::is_same<
-    graph::DirectedGraph<TNode, TEdge>, graph::DirectedGraph<> >::value>::type> {
+struct normalize < graph::DirectedGraph < TNode, TEdge > > {
   static graph::DirectedGraph<> eval(graph::DirectedGraph<TNode, TEdge> &&value) {
     graph::DirectedGraph<> graph;
 
diff --git a/alib2graph_data/src/graph/directed/DirectedMultiGraph.hpp b/alib2graph_data/src/graph/directed/DirectedMultiGraph.hpp
index 1898e1f349..0de48f20e5 100644
--- a/alib2graph_data/src/graph/directed/DirectedMultiGraph.hpp
+++ b/alib2graph_data/src/graph/directed/DirectedMultiGraph.hpp
@@ -33,7 +33,6 @@ class DirectedMultiGraph : public GraphInterface<TNode, TEdge> {
  public:
   using node_type = TNode;
   using edge_type = TEdge;
-  using normalized_type = DirectedMultiGraph<>;
 
 // ---------------------------------------------------------------------------------------------------------------------
 
@@ -58,9 +57,9 @@ class DirectedMultiGraph : public GraphInterface<TNode, TEdge> {
 // =====================================================================================================================
 // ObjectBase interface
  public:
-  GraphBase *clone() const override;
+  GraphBase *clone() const & override;
 
-  GraphBase *plunder() &&override;
+  GraphBase *clone() && override;
 
   int compare(const object::ObjectBase &other) const override;
 
@@ -295,12 +294,12 @@ std::string DirectedMultiGraph<TNode, TEdge>::name() const {
 // ---------------------------------------------------------------------------------------------------------------------
 
 template<typename TNode, typename TEdge>
-GraphBase *DirectedMultiGraph<TNode, TEdge>::clone() const {
+GraphBase *DirectedMultiGraph<TNode, TEdge>::clone() const & {
   return new DirectedMultiGraph(*this);
 }
 
 template<typename TNode, typename TEdge>
-GraphBase *DirectedMultiGraph<TNode, TEdge>::plunder() &&{
+GraphBase *DirectedMultiGraph<TNode, TEdge>::clone() && {
   return new DirectedMultiGraph(std::move(*this));
 }
 
@@ -367,8 +366,7 @@ namespace core {
  */
 
 template<typename TNode, typename TEdge>
-struct normalize<graph::DirectedMultiGraph<TNode, TEdge>, typename std::enable_if<!std::is_same<
-    graph::DirectedMultiGraph<TNode, TEdge>, graph::DirectedMultiGraph<> >::value>::type> {
+struct normalize < graph::DirectedMultiGraph < TNode, TEdge > > {
   static graph::DirectedMultiGraph<> eval(graph::DirectedMultiGraph<TNode, TEdge> &&value) {
     graph::DirectedMultiGraph<> graph;
 
diff --git a/alib2graph_data/src/graph/mixed/MixedGraph.hpp b/alib2graph_data/src/graph/mixed/MixedGraph.hpp
index 0eaee788aa..a54e1a9d66 100644
--- a/alib2graph_data/src/graph/mixed/MixedGraph.hpp
+++ b/alib2graph_data/src/graph/mixed/MixedGraph.hpp
@@ -32,7 +32,6 @@ class MixedGraph : public GraphInterface<TNode, TEdge> {
  public:
   using node_type = TNode;
   using edge_type = TEdge;
-  using normalized_type = MixedGraph<>;
 
 // ---------------------------------------------------------------------------------------------------------------------
 
@@ -64,9 +63,9 @@ class MixedGraph : public GraphInterface<TNode, TEdge> {
 // =====================================================================================================================
 // ObjectBase interface
  public:
-  GraphBase *clone() const override;
+  GraphBase *clone() const & override;
 
-  GraphBase *plunder() &&override;
+  GraphBase *clone() && override;
 
   int compare(const object::ObjectBase &other) const override;
 
@@ -432,12 +431,12 @@ std::string MixedGraph<TNode, TEdge>::name() const {
 // ---------------------------------------------------------------------------------------------------------------------
 
 template<typename TNode, typename TEdge>
-GraphBase *MixedGraph<TNode, TEdge>::clone() const {
+GraphBase *MixedGraph<TNode, TEdge>::clone() const & {
   return new MixedGraph(*this);
 }
 
 template<typename TNode, typename TEdge>
-GraphBase *MixedGraph<TNode, TEdge>::plunder() &&{
+GraphBase *MixedGraph<TNode, TEdge>::clone() && {
   return new MixedGraph(std::move(*this));
 }
 
@@ -515,8 +514,7 @@ namespace core {
  */
 
 template<typename TNode, typename TEdge>
-struct normalize<graph::MixedGraph<TNode, TEdge>, typename std::enable_if<!std::is_same<
-    graph::MixedGraph<TNode, TEdge>, graph::MixedGraph<> >::value>::type> {
+struct normalize < graph::MixedGraph < TNode, TEdge > > {
   static graph::MixedGraph<> eval(graph::MixedGraph<TNode, TEdge> &&value) {
     graph::MixedGraph<> graph;
 
diff --git a/alib2graph_data/src/graph/mixed/MixedMultiGraph.hpp b/alib2graph_data/src/graph/mixed/MixedMultiGraph.hpp
index 695c528bf5..bfdeca6d68 100644
--- a/alib2graph_data/src/graph/mixed/MixedMultiGraph.hpp
+++ b/alib2graph_data/src/graph/mixed/MixedMultiGraph.hpp
@@ -32,7 +32,6 @@ class MixedMultiGraph : public GraphInterface<TNode, TEdge> {
  public:
   using node_type = TNode;
   using edge_type = TEdge;
-  using normalized_type = MixedMultiGraph<>;
 
 // ---------------------------------------------------------------------------------------------------------------------
 
@@ -65,9 +64,9 @@ class MixedMultiGraph : public GraphInterface<TNode, TEdge> {
 // =====================================================================================================================
 // ObjectBase interface
  public:
-  GraphBase *clone() const override;
+  GraphBase *clone() const & override;
 
-  GraphBase *plunder() &&override;
+  GraphBase *clone() && override;
 
   int compare(const object::ObjectBase &other) const override;
 
@@ -379,12 +378,12 @@ std::string MixedMultiGraph<TNode, TEdge>::name() const {
 // ---------------------------------------------------------------------------------------------------------------------
 
 template<typename TNode, typename TEdge>
-GraphBase *MixedMultiGraph<TNode, TEdge>::clone() const {
+GraphBase *MixedMultiGraph<TNode, TEdge>::clone() const & {
   return new MixedMultiGraph(*this);
 }
 
 template<typename TNode, typename TEdge>
-GraphBase *MixedMultiGraph<TNode, TEdge>::plunder() &&{
+GraphBase *MixedMultiGraph<TNode, TEdge>::clone() && {
   return new MixedMultiGraph(std::move(*this));
 }
 
@@ -462,8 +461,7 @@ namespace core {
  */
 
 template<typename TNode, typename TEdge>
-struct normalize<graph::MixedMultiGraph<TNode, TEdge>, typename std::enable_if<!std::is_same<
-    graph::MixedMultiGraph<TNode, TEdge>, graph::MixedMultiGraph<> >::value>::type> {
+struct normalize < graph::MixedMultiGraph < TNode, TEdge > > {
   static graph::MixedMultiGraph<> eval(graph::MixedMultiGraph<TNode, TEdge> &&value) {
     graph::MixedMultiGraph<> graph;
 
diff --git a/alib2graph_data/src/graph/undirected/UndirectedGraph.hpp b/alib2graph_data/src/graph/undirected/UndirectedGraph.hpp
index a082437d4b..d93c3890b8 100644
--- a/alib2graph_data/src/graph/undirected/UndirectedGraph.hpp
+++ b/alib2graph_data/src/graph/undirected/UndirectedGraph.hpp
@@ -33,7 +33,6 @@ class UndirectedGraph : public GraphInterface<TNode, TEdge> {
  public:
   using node_type = TNode;
   using edge_type = TEdge;
-  using normalized_type = UndirectedGraph<>;
 
 // ---------------------------------------------------------------------------------------------------------------------
 
@@ -55,9 +54,9 @@ class UndirectedGraph : public GraphInterface<TNode, TEdge> {
 // =====================================================================================================================
 // ObjectBase interface
  public:
-  GraphBase *clone() const override;
+  GraphBase *clone() const & override;
 
-  GraphBase *plunder() &&override;
+  GraphBase *clone() && override;
 
   int compare(const object::ObjectBase &other) const override;
 
@@ -284,12 +283,12 @@ std::string UndirectedGraph<TNode, TEdge>::name() const {
 // ---------------------------------------------------------------------------------------------------------------------
 
 template<typename TNode, typename TEdge>
-GraphBase *UndirectedGraph<TNode, TEdge>::clone() const {
+GraphBase *UndirectedGraph<TNode, TEdge>::clone() const & {
   return new UndirectedGraph(*this);
 }
 
 template<typename TNode, typename TEdge>
-GraphBase *UndirectedGraph<TNode, TEdge>::plunder() &&{
+GraphBase *UndirectedGraph<TNode, TEdge>::clone() && {
   return new UndirectedGraph(std::move(*this));
 }
 
@@ -357,8 +356,7 @@ namespace core {
  */
 
 template<typename TNode, typename TEdge>
-struct normalize<graph::UndirectedGraph<TNode, TEdge>, typename std::enable_if<!std::is_same<
-    graph::UndirectedGraph<TNode, TEdge>, graph::UndirectedGraph<> >::value>::type> {
+struct normalize < graph::UndirectedGraph < TNode, TEdge > > {
   static graph::UndirectedGraph<> eval(graph::UndirectedGraph<TNode, TEdge> &&value) {
     graph::UndirectedGraph<> graph;
 
diff --git a/alib2graph_data/src/graph/undirected/UndirectedMultiGraph.hpp b/alib2graph_data/src/graph/undirected/UndirectedMultiGraph.hpp
index cb87d22b5e..5eced05aee 100644
--- a/alib2graph_data/src/graph/undirected/UndirectedMultiGraph.hpp
+++ b/alib2graph_data/src/graph/undirected/UndirectedMultiGraph.hpp
@@ -33,7 +33,6 @@ class UndirectedMultiGraph : public GraphInterface<TNode, TEdge> {
  public:
   using node_type = TNode;
   using edge_type = TEdge;
-  using normalized_type = UndirectedMultiGraph<>;
 
 // ---------------------------------------------------------------------------------------------------------------------
 
@@ -55,9 +54,9 @@ class UndirectedMultiGraph : public GraphInterface<TNode, TEdge> {
 // =====================================================================================================================
 // ObjectBase interface
  public:
-  GraphBase *clone() const override;
+  GraphBase *clone() const & override;
 
-  GraphBase *plunder() &&override;
+  GraphBase *clone() && override;
 
   int compare(const object::ObjectBase &other) const override;
 
@@ -262,12 +261,12 @@ std::string UndirectedMultiGraph<TNode, TEdge>::name() const {
 // ---------------------------------------------------------------------------------------------------------------------
 
 template<typename TNode, typename TEdge>
-GraphBase *UndirectedMultiGraph<TNode, TEdge>::clone() const {
+GraphBase *UndirectedMultiGraph<TNode, TEdge>::clone() const & {
   return new UndirectedMultiGraph(*this);
 }
 
 template<typename TNode, typename TEdge>
-GraphBase *UndirectedMultiGraph<TNode, TEdge>::plunder() &&{
+GraphBase *UndirectedMultiGraph<TNode, TEdge>::clone() && {
   return new UndirectedMultiGraph(std::move(*this));
 }
 
@@ -335,8 +334,7 @@ namespace core {
  */
 
 template<typename TNode, typename TEdge>
-struct normalize<graph::UndirectedMultiGraph<TNode, TEdge>, typename std::enable_if<!std::is_same<
-    graph::UndirectedMultiGraph<TNode, TEdge>, graph::UndirectedMultiGraph<> >::value>::type> {
+struct normalize < graph::UndirectedMultiGraph < TNode, TEdge > > {
   static graph::UndirectedMultiGraph<> eval(graph::UndirectedMultiGraph<TNode, TEdge> &&value) {
     graph::UndirectedMultiGraph<> graph;
 
diff --git a/alib2graph_data/src/graph/weighted/WeightedGraphClasses.hpp b/alib2graph_data/src/graph/weighted/WeightedGraphClasses.hpp
index fbacb9a8e9..344bc200e2 100644
--- a/alib2graph_data/src/graph/weighted/WeightedGraphClasses.hpp
+++ b/alib2graph_data/src/graph/weighted/WeightedGraphClasses.hpp
@@ -30,13 +30,12 @@ class WeightedUndirectedGraph : public UndirectedGraph<TNode, TEdge> {
  public:
   using node_type = TNode;
   using edge_type = TEdge;
-  using normalized_type = WeightedUndirectedGraph<>;
 
-  GraphBase *clone() const override {
+  GraphBase *clone() const & override {
     return new WeightedUndirectedGraph(*this);
   }
 
-  GraphBase *plunder() &&override {
+  GraphBase *clone() && override {
     return new WeightedUndirectedGraph(std::move(*this));
   }
 };
@@ -48,13 +47,12 @@ class WeightedUndirectedMultiGraph : public UndirectedMultiGraph<TNode, TEdge> {
  public:
   using node_type = TNode;
   using edge_type = TEdge;
-  using normalized_type = WeightedUndirectedMultiGraph<>;
 
-  GraphBase *clone() const override {
+  GraphBase *clone() const & override {
     return new WeightedUndirectedMultiGraph(*this);
   }
 
-  GraphBase *plunder() &&override {
+  GraphBase *clone() &&override {
     return new WeightedUndirectedMultiGraph(std::move(*this));
   }
 };
@@ -66,13 +64,12 @@ class WeightedDirectedGraph : public DirectedGraph<TNode, TEdge> {
  public:
   using node_type = TNode;
   using edge_type = TEdge;
-  using normalized_type = WeightedDirectedGraph<>;
 
-  GraphBase *clone() const override {
+  GraphBase *clone() const & override {
     return new WeightedDirectedGraph(*this);
   }
 
-  GraphBase *plunder() &&override {
+  GraphBase *clone() && override {
     return new WeightedDirectedGraph(std::move(*this));
   }
 };
@@ -84,13 +81,12 @@ class WeightedDirectedMultiGraph : public DirectedMultiGraph<TNode, TEdge> {
  public:
   using node_type = TNode;
   using edge_type = TEdge;
-  using normalized_type = WeightedDirectedMultiGraph<>;
 
-  GraphBase *clone() const override {
+  GraphBase *clone() const & override {
     return new WeightedDirectedMultiGraph(*this);
   }
 
-  GraphBase *plunder() &&override {
+  GraphBase *clone() && override {
     return new WeightedDirectedMultiGraph(std::move(*this));
   }
 };
@@ -102,13 +98,12 @@ class WeightedMixedGraph : public MixedGraph<TNode, TEdge> {
  public:
   using node_type = TNode;
   using edge_type = TEdge;
-  using normalized_type = WeightedMixedGraph<>;
 
-  GraphBase *clone() const override {
+  GraphBase *clone() const & override {
     return new WeightedMixedGraph(*this);
   }
 
-  GraphBase *plunder() &&override {
+  GraphBase *clone() && override {
     return new WeightedMixedGraph(std::move(*this));
   }
 };
@@ -120,13 +115,12 @@ class WeightedMixedMultiGraph : public MixedMultiGraph<TNode, TEdge> {
  public:
   using node_type = TNode;
   using edge_type = TEdge;
-  using normalized_type = WeightedMixedMultiGraph<>;
 
-  GraphBase *clone() const override {
+  GraphBase *clone() const & override {
     return new WeightedMixedMultiGraph(*this);
   }
 
-  GraphBase *plunder() &&override {
+  GraphBase *clone() && override {
     return new WeightedMixedMultiGraph(std::move(*this));
   }
 };
@@ -145,8 +139,7 @@ namespace core {
  */
 
 template<typename TNode, typename TEdge>
-struct normalize<graph::WeightedUndirectedGraph<TNode, TEdge>, typename std::enable_if<!std::is_same<
-    graph::WeightedUndirectedGraph<TNode, TEdge>, graph::WeightedUndirectedGraph<> >::value>::type> {
+struct normalize < graph::WeightedUndirectedGraph < TNode, TEdge > > {
   static graph::WeightedUndirectedGraph<> eval(graph::WeightedUndirectedGraph<TNode, TEdge> &&value) {
     graph::WeightedUndirectedGraph<> graph;
 
@@ -175,8 +168,7 @@ struct normalize<graph::WeightedUndirectedGraph<TNode, TEdge>, typename std::ena
  */
 
 template<typename TNode, typename TEdge>
-struct normalize<graph::WeightedUndirectedMultiGraph<TNode, TEdge>, typename std::enable_if<!std::is_same<
-    graph::WeightedUndirectedMultiGraph<TNode, TEdge>, graph::WeightedUndirectedMultiGraph<> >::value>::type> {
+struct normalize < graph::WeightedUndirectedMultiGraph < TNode, TEdge > > {
   static graph::WeightedUndirectedMultiGraph<> eval(graph::WeightedUndirectedMultiGraph<TNode, TEdge> &&value) {
     graph::WeightedUndirectedMultiGraph<> graph;
 
@@ -205,8 +197,7 @@ struct normalize<graph::WeightedUndirectedMultiGraph<TNode, TEdge>, typename std
  */
 
 template<typename TNode, typename TEdge>
-struct normalize<graph::WeightedDirectedGraph<TNode, TEdge>, typename std::enable_if<!std::is_same<
-    graph::WeightedDirectedGraph<TNode, TEdge>, graph::WeightedDirectedGraph<> >::value>::type> {
+struct normalize < graph::WeightedDirectedGraph < TNode, TEdge > > {
   static graph::WeightedDirectedGraph<> eval(graph::WeightedDirectedGraph<TNode, TEdge> &&value) {
     graph::WeightedDirectedGraph<> graph;
 
@@ -248,8 +239,7 @@ struct normalize<graph::WeightedDirectedGraph<TNode, TEdge>, typename std::enabl
  */
 
 template<typename TNode, typename TEdge>
-struct normalize<graph::WeightedDirectedMultiGraph<TNode, TEdge>, typename std::enable_if<!std::is_same<
-    graph::WeightedDirectedMultiGraph<TNode, TEdge>, graph::WeightedDirectedMultiGraph<> >::value>::type> {
+struct normalize < graph::WeightedDirectedMultiGraph < TNode, TEdge > > {
   static graph::WeightedDirectedMultiGraph<> eval(graph::WeightedDirectedMultiGraph<TNode, TEdge> &&value) {
     graph::WeightedDirectedMultiGraph<> graph;
 
@@ -292,8 +282,7 @@ struct normalize<graph::WeightedDirectedMultiGraph<TNode, TEdge>, typename std::
  */
 
 template<typename TNode, typename TEdge>
-struct normalize<graph::WeightedMixedGraph<TNode, TEdge>, typename std::enable_if<!std::is_same<
-    graph::WeightedMixedGraph<TNode, TEdge>, graph::WeightedMixedGraph<> >::value>::type> {
+struct normalize < graph::WeightedMixedGraph < TNode, TEdge > > {
   static graph::WeightedMixedGraph<> eval(graph::WeightedMixedGraph<TNode, TEdge> &&value) {
     graph::WeightedMixedGraph<> graph;
 
@@ -349,8 +338,7 @@ struct normalize<graph::WeightedMixedGraph<TNode, TEdge>, typename std::enable_i
  */
 
 template<typename TNode, typename TEdge>
-struct normalize<graph::WeightedMixedMultiGraph<TNode, TEdge>, typename std::enable_if<!std::is_same<
-    graph::WeightedMixedMultiGraph<TNode, TEdge>, graph::WeightedMixedMultiGraph<> >::value>::type> {
+struct normalize < graph::WeightedMixedMultiGraph < TNode, TEdge > > {
   static graph::WeightedMixedMultiGraph<> eval(graph::WeightedMixedMultiGraph<TNode, TEdge> &&value) {
     graph::WeightedMixedMultiGraph<> graph;
 
diff --git a/alib2graph_data/src/grid/GridBase.hpp b/alib2graph_data/src/grid/GridBase.hpp
index a5f900359c..b236b77fd6 100644
--- a/alib2graph_data/src/grid/GridBase.hpp
+++ b/alib2graph_data/src/grid/GridBase.hpp
@@ -21,8 +21,8 @@ class GridBase : public object::ObjectBase {
 // ---------------------------------------------------------------------------------------------------------------------
 
  public:
-  virtual GridBase *clone() const = 0;
-  virtual GridBase *plunder() &&= 0;
+  virtual GridBase *clone() const & = 0;
+  virtual GridBase *clone() && = 0;
 
 // ---------------------------------------------------------------------------------------------------------------------
 };
diff --git a/alib2graph_data/src/grid/square/SquareGrid4.hpp b/alib2graph_data/src/grid/square/SquareGrid4.hpp
index dcc54ccb14..1e072e790b 100644
--- a/alib2graph_data/src/grid/square/SquareGrid4.hpp
+++ b/alib2graph_data/src/grid/square/SquareGrid4.hpp
@@ -26,7 +26,6 @@ class SquareGrid4 final : public SquareGrid<TCoordinate, TEdge> {
   using edge_type = TEdge;
   using node_type = ext::pair<TCoordinate, TCoordinate>;
   using direction_type = SquareGridDirections;
-  using normalized_type = SquareGrid4<>;
 
 // =====================================================================================================================
 // Constructor, Destructor, Operators
@@ -36,9 +35,9 @@ class SquareGrid4 final : public SquareGrid<TCoordinate, TEdge> {
 // =====================================================================================================================
 // ObjectBase interface
  public:
-  GridBase *clone() const override;
+  GridBase *clone() const & override;
 
-  GridBase *plunder() &&override;
+  GridBase *clone() && override;
 
   int compare(const object::ObjectBase &other) const override;
 
@@ -108,12 +107,12 @@ std::string SquareGrid4<TCoordinate, TEdge>::name() const {
 // ---------------------------------------------------------------------------------------------------------------------
 
 template<typename TCoordinate, typename TEdge>
-GridBase *SquareGrid4<TCoordinate, TEdge>::clone() const {
+GridBase *SquareGrid4<TCoordinate, TEdge>::clone() const & {
   return new SquareGrid4(*this);
 }
 
 template<typename TCoordinate, typename TEdge>
-GridBase *SquareGrid4<TCoordinate, TEdge>::plunder() &&{
+GridBase *SquareGrid4<TCoordinate, TEdge>::clone() && {
   return new SquareGrid4(std::move(*this));
 }
 
@@ -155,8 +154,7 @@ namespace core {
  */
 
 template<typename TCoordinate, typename TEdge>
-struct normalize<grid::SquareGrid4<TCoordinate, TEdge>, typename std::enable_if<!std::is_same<
-    grid::SquareGrid4<TCoordinate, TEdge>, grid::SquareGrid4<> >::value>::type> {
+struct normalize < grid::SquareGrid4 < TCoordinate, TEdge > > {
   static grid::SquareGrid4<> eval(grid::SquareGrid4<TCoordinate, TEdge> &&value) {
     grid::SquareGrid4<> grid(value.getHeight(), value.getWidth());
 
diff --git a/alib2graph_data/src/grid/square/SquareGrid8.hpp b/alib2graph_data/src/grid/square/SquareGrid8.hpp
index c8362e0620..554369c4da 100644
--- a/alib2graph_data/src/grid/square/SquareGrid8.hpp
+++ b/alib2graph_data/src/grid/square/SquareGrid8.hpp
@@ -26,7 +26,6 @@ class SquareGrid8 final : public SquareGrid<TCoordinate, TEdge> {
   using edge_type = TEdge;
   using node_type = ext::pair<TCoordinate, TCoordinate>;
   using direction_type = SquareGridDirections;
-  using normalized_type = SquareGrid8<>;
 
 // =====================================================================================================================
 // Constructor, Destructor, Operators
@@ -36,9 +35,9 @@ class SquareGrid8 final : public SquareGrid<TCoordinate, TEdge> {
 // =====================================================================================================================
 // ObjectBase interface
  public:
-  GridBase *clone() const override;
+  GridBase *clone() const & override;
 
-  GridBase *plunder() &&override;
+  GridBase *clone() && override;
 
   int compare(const object::ObjectBase &other) const override;
 
@@ -100,12 +99,12 @@ std::string SquareGrid8<TCoordinate, TEdge>::name() const {
 // ---------------------------------------------------------------------------------------------------------------------
 
 template<typename TCoordinate, typename TEdge>
-GridBase *SquareGrid8<TCoordinate, TEdge>::clone() const {
+GridBase *SquareGrid8<TCoordinate, TEdge>::clone() const & {
   return new SquareGrid8(*this);
 }
 
 template<typename TCoordinate, typename TEdge>
-GridBase *SquareGrid8<TCoordinate, TEdge>::plunder() &&{
+GridBase *SquareGrid8<TCoordinate, TEdge>::clone() && {
   return new SquareGrid8(std::move(*this));
 }
 
@@ -147,8 +146,7 @@ namespace core {
  */
 
 template<typename TCoordinate, typename TEdge>
-struct normalize<grid::SquareGrid8<TCoordinate, TEdge>, typename std::enable_if<!std::is_same<
-    grid::SquareGrid8<TCoordinate, TEdge>, grid::SquareGrid8<> >::value>::type> {
+struct normalize < grid::SquareGrid8 < TCoordinate, TEdge > > {
   static grid::SquareGrid8<> eval(grid::SquareGrid8<TCoordinate, TEdge> &&value) {
     grid::SquareGrid8<> grid(value.getHeight(), value.getWidth());
 
diff --git a/alib2graph_data/src/grid/square/WeightedSquareGrid4.hpp b/alib2graph_data/src/grid/square/WeightedSquareGrid4.hpp
index 5641fb41c7..e209e48064 100644
--- a/alib2graph_data/src/grid/square/WeightedSquareGrid4.hpp
+++ b/alib2graph_data/src/grid/square/WeightedSquareGrid4.hpp
@@ -26,7 +26,6 @@ class WeightedSquareGrid4 final : public SquareGrid<TCoordinate, TEdge> {
   using edge_type = TEdge;
   using node_type = ext::pair<TCoordinate, TCoordinate>;
   using direction_type = SquareGridDirections;
-  using normalized_type = WeightedSquareGrid4<>;
 
 // ---------------------------------------------------------------------------------------------------------------------
  protected:
@@ -47,9 +46,9 @@ class WeightedSquareGrid4 final : public SquareGrid<TCoordinate, TEdge> {
 // =====================================================================================================================
 // ObjectBase interface
  public:
-  GridBase *clone() const override;
+  GridBase *clone() const & override;
 
-  GridBase *plunder() &&override;
+  GridBase *clone() && override;
 
   int compare(const object::ObjectBase &other) const override;
 
@@ -132,12 +131,12 @@ std::string WeightedSquareGrid4<TCoordinate, TEdge>::name() const {
 // ---------------------------------------------------------------------------------------------------------------------
 
 template<typename TCoordinate, typename TEdge>
-GridBase *WeightedSquareGrid4<TCoordinate, TEdge>::clone() const {
+GridBase *WeightedSquareGrid4<TCoordinate, TEdge>::clone() const & {
   return new WeightedSquareGrid4(*this);
 }
 
 template<typename TCoordinate, typename TEdge>
-GridBase *WeightedSquareGrid4<TCoordinate, TEdge>::plunder() &&{
+GridBase *WeightedSquareGrid4<TCoordinate, TEdge>::clone() && {
   return new WeightedSquareGrid4(std::move(*this));
 }
 
@@ -179,8 +178,7 @@ namespace core {
  */
 
 template<typename TCoordinate, typename TEdge>
-struct normalize<grid::WeightedSquareGrid4<TCoordinate, TEdge>, typename std::enable_if<!std::is_same<
-    grid::WeightedSquareGrid4<TCoordinate, TEdge>, grid::WeightedSquareGrid4<> >::value>::type> {
+struct normalize < grid::WeightedSquareGrid4 < TCoordinate, TEdge > > {
   static grid::WeightedSquareGrid4<> eval(grid::WeightedSquareGrid4<TCoordinate, TEdge> &&value) {
     grid::WeightedSquareGrid4<> grid(value.getHeight(), value.getWidth(), value.getUnit());
 
diff --git a/alib2graph_data/src/grid/square/WeightedSquareGrid8.hpp b/alib2graph_data/src/grid/square/WeightedSquareGrid8.hpp
index ea21daf95b..83c0c9e02f 100644
--- a/alib2graph_data/src/grid/square/WeightedSquareGrid8.hpp
+++ b/alib2graph_data/src/grid/square/WeightedSquareGrid8.hpp
@@ -26,7 +26,6 @@ class WeightedSquareGrid8 final : public SquareGrid<TCoordinate, TEdge> {
   using edge_type = TEdge;
   using node_type = ext::pair<TCoordinate, TCoordinate>;
   using direction_type = SquareGridDirections;
-  using normalized_type = WeightedSquareGrid8<>;
 
 // ---------------------------------------------------------------------------------------------------------------------
  protected:
@@ -48,9 +47,9 @@ class WeightedSquareGrid8 final : public SquareGrid<TCoordinate, TEdge> {
 // =====================================================================================================================
 // ObjectBase interface
  public:
-  GridBase *clone() const override;
+  GridBase *clone() const & override;
 
-  GridBase *plunder() &&override;
+  GridBase *clone() && override;
 
   int compare(const object::ObjectBase &other) const override;
 
@@ -132,12 +131,12 @@ std::string WeightedSquareGrid8<TCoordinate, TEdge>::name() const {
 // ---------------------------------------------------------------------------------------------------------------------
 
 template<typename TCoordinate, typename TEdge>
-GridBase *WeightedSquareGrid8<TCoordinate, TEdge>::clone() const {
+GridBase *WeightedSquareGrid8<TCoordinate, TEdge>::clone() const & {
   return new WeightedSquareGrid8(*this);
 }
 
 template<typename TCoordinate, typename TEdge>
-GridBase *WeightedSquareGrid8<TCoordinate, TEdge>::plunder() &&{
+GridBase *WeightedSquareGrid8<TCoordinate, TEdge>::clone() && {
   return new WeightedSquareGrid8(std::move(*this));
 }
 
@@ -179,8 +178,7 @@ namespace core {
  */
 
 template<typename TCoordinate, typename TEdge>
-struct normalize<grid::WeightedSquareGrid8<TCoordinate, TEdge>, typename std::enable_if<!std::is_same<
-    grid::WeightedSquareGrid8<TCoordinate, TEdge>, grid::WeightedSquareGrid8<> >::value>::type> {
+struct normalize < grid::WeightedSquareGrid8 < TCoordinate, TEdge > > {
   static grid::WeightedSquareGrid8<> eval(grid::WeightedSquareGrid8<TCoordinate, TEdge> &&value) {
     grid::WeightedSquareGrid8<> grid(value.getHeight(), value.getWidth(), value.getUnit());
 
diff --git a/alib2graph_data/src/node/Node.cpp b/alib2graph_data/src/node/Node.cpp
index 6a49ab86f6..0f47ae5cf9 100644
--- a/alib2graph_data/src/node/Node.cpp
+++ b/alib2graph_data/src/node/Node.cpp
@@ -30,11 +30,11 @@ std::string Node::name() const {
 
 // ---------------------------------------------------------------------------------------------------------------------
 
-NodeBase *Node::clone() const {
+NodeBase *Node::clone() const & {
   return new Node(*this);
 }
 
-NodeBase *Node::plunder() &&{
+NodeBase *Node::clone() && {
   return new Node(std::move(*this));
 }
 
diff --git a/alib2graph_data/src/node/Node.hpp b/alib2graph_data/src/node/Node.hpp
index 4bb864ea2f..101d559063 100644
--- a/alib2graph_data/src/node/Node.hpp
+++ b/alib2graph_data/src/node/Node.hpp
@@ -45,9 +45,9 @@ class Node : public NodeBase {
 // ObjectBase interface
 
  public:
-  NodeBase *clone() const override;
+  NodeBase *clone() const & override;
 
-  NodeBase *plunder() &&override;
+  NodeBase *clone() && override;
 
   int compare(const object::ObjectBase &other) const override;
 
diff --git a/alib2graph_data/src/node/NodeBase.hpp b/alib2graph_data/src/node/NodeBase.hpp
index 67f60d1ba1..9cf4480c24 100644
--- a/alib2graph_data/src/node/NodeBase.hpp
+++ b/alib2graph_data/src/node/NodeBase.hpp
@@ -21,8 +21,8 @@ class NodeBase : public object::ObjectBase {
 // ---------------------------------------------------------------------------------------------------------------------
 
  public:
-  virtual NodeBase *clone() const = 0;
-  virtual NodeBase *plunder() &&= 0;
+  virtual NodeBase *clone() const & = 0;
+  virtual NodeBase *clone() && = 0;
 
 // ---------------------------------------------------------------------------------------------------------------------
 };
-- 
GitLab