From 0596330e7150abfce0a35bf37d39f982803abf24 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jakub=20Klinkovsk=C3=BD?= <klinkovsky@mmg.fjfi.cvut.cz>
Date: Thu, 30 Dec 2021 21:35:07 +0100
Subject: [PATCH] Fixed move-semantics in Mesh and its subclasses

---
 src/TNL/Meshes/Mesh.h                         |  6 +-
 src/TNL/Meshes/Mesh.hpp                       | 13 +---
 .../MeshDetails/layers/DualGraphLayer.h       |  9 +--
 .../MeshDetails/layers/EntityTags/Layer.h     | 28 ++-----
 .../layers/EntityTags/LayerFamily.h           | 22 +++---
 .../Meshes/MeshDetails/layers/StorageLayer.h  | 43 ++++-------
 .../layers/SubentityStorageLayer.h            | 77 ++++++++-----------
 .../layers/SuperentityStorageLayer.h          | 22 +++---
 8 files changed, 85 insertions(+), 135 deletions(-)

diff --git a/src/TNL/Meshes/Mesh.h b/src/TNL/Meshes/Mesh.h
index 2513982f39..808830904d 100644
--- a/src/TNL/Meshes/Mesh.h
+++ b/src/TNL/Meshes/Mesh.h
@@ -93,10 +93,14 @@ class Mesh
 
       Mesh( const Mesh& mesh );
 
+      Mesh( Mesh&& mesh ) = default;
+
       template< typename Device_ >
       Mesh( const Mesh< MeshConfig, Device_ >& mesh );
 
-      Mesh& operator=( const Mesh& mesh );
+      Mesh& operator=( const Mesh& mesh ) = default;
+
+      Mesh& operator=( Mesh&& mesh ) = default;
 
       template< typename Device_ >
       Mesh& operator=( const Mesh< MeshConfig, Device_ >& mesh );
diff --git a/src/TNL/Meshes/Mesh.hpp b/src/TNL/Meshes/Mesh.hpp
index c928783f47..efb2b432d9 100644
--- a/src/TNL/Meshes/Mesh.hpp
+++ b/src/TNL/Meshes/Mesh.hpp
@@ -59,17 +59,6 @@ Mesh( const Mesh< MeshConfig, Device_ >& mesh )
    points = mesh.getPoints();
 }
 
-template< typename MeshConfig, typename Device >
-Mesh< MeshConfig, Device >&
-Mesh< MeshConfig, Device >::
-operator=( const Mesh& mesh )
-{
-   points = mesh.getPoints();
-   StorageBaseType::operator=( mesh );
-   EntityTagsLayerFamily::operator=( mesh );
-   return *this;
-}
-
 template< typename MeshConfig, typename Device >
    template< typename Device_ >
 Mesh< MeshConfig, Device >&
@@ -114,7 +103,7 @@ getEntity( const GlobalIndexType entityIndex ) const
 template< typename MeshConfig, typename Device >
    template< int Dimension >
 void
-Mesh< MeshConfig, Device >:: 
+Mesh< MeshConfig, Device >::
 setEntitiesCount( const typename MeshTraitsType::GlobalIndexType& entitiesCount )
 {
    StorageBaseType::setEntitiesCount( DimensionTag< Dimension >(), entitiesCount );
diff --git a/src/TNL/Meshes/MeshDetails/layers/DualGraphLayer.h b/src/TNL/Meshes/MeshDetails/layers/DualGraphLayer.h
index 3ca05fc00c..0292ccd53e 100644
--- a/src/TNL/Meshes/MeshDetails/layers/DualGraphLayer.h
+++ b/src/TNL/Meshes/MeshDetails/layers/DualGraphLayer.h
@@ -33,6 +33,8 @@ public:
 
    explicit DualGraphLayer( const DualGraphLayer& ) = default;
 
+   DualGraphLayer( DualGraphLayer&& ) = default;
+
    template< typename Device_ >
    DualGraphLayer( const DualGraphLayer< MeshConfig, Device_ >& other )
    {
@@ -41,6 +43,8 @@ public:
 
    DualGraphLayer& operator=( const DualGraphLayer& ) = default;
 
+   DualGraphLayer& operator=( DualGraphLayer&& ) = default;
+
    template< typename Device_ >
    DualGraphLayer& operator=( const DualGraphLayer< MeshConfig, Device_ >& other )
    {
@@ -167,11 +171,6 @@ template< typename MeshConfig,
 class DualGraphLayer< MeshConfig, Device, false >
 {
 public:
-   DualGraphLayer& operator=( const DualGraphLayer& other )
-   {
-      return *this;
-   }
-
    template< typename Device_ >
    DualGraphLayer& operator=( const DualGraphLayer< MeshConfig, Device_ >& other )
    {
diff --git a/src/TNL/Meshes/MeshDetails/layers/EntityTags/Layer.h b/src/TNL/Meshes/MeshDetails/layers/EntityTags/Layer.h
index b722535a51..985541c1bb 100644
--- a/src/TNL/Meshes/MeshDetails/layers/EntityTags/Layer.h
+++ b/src/TNL/Meshes/MeshDetails/layers/EntityTags/Layer.h
@@ -38,10 +38,7 @@ public:
 
    Layer() = default;
 
-   explicit Layer( const Layer& other )
-   {
-      operator=( other );
-   }
+   explicit Layer( const Layer& other ) = default;
 
    template< typename Device_ >
    Layer( const Layer< MeshConfig, Device_, DimensionTag >& other )
@@ -49,24 +46,13 @@ public:
       operator=( other );
    }
 
-   Layer& operator=( const Layer& other )
-   {
-      tags.setLike( other.tags );
-      boundaryIndices.setLike( other.boundaryIndices );
-      interiorIndices.setLike( other.interiorIndices );
-      tags = other.tags;
-      boundaryIndices = other.boundaryIndices;
-      interiorIndices = other.interiorIndices;
-      ghostsOffset = other.ghostsOffset;
-      return *this;
-   }
+   Layer& operator=( const Layer& other ) = default;
+
+   Layer& operator=( Layer&& other ) = default;
 
    template< typename Device_ >
    Layer& operator=( const Layer< MeshConfig, Device_, DimensionTag >& other )
    {
-      tags.setLike( other.tags );
-      boundaryIndices.setLike( other.boundaryIndices );
-      interiorIndices.setLike( other.interiorIndices );
       tags = other.tags;
       boundaryIndices = other.boundaryIndices;
       interiorIndices = other.interiorIndices;
@@ -254,10 +240,12 @@ protected:
    using TagType         = typename MeshTraits< MeshConfig, Device >::EntityTagsArrayType::ValueType;
 
    Layer() = default;
-   explicit Layer( const Layer& other ) {}
+   explicit Layer( const Layer& other ) = default;
+   Layer( Layer&& other ) = default;
    template< typename Device_ >
    Layer( const Layer< MeshConfig, Device_, DimensionTag >& other ) {}
-   Layer& operator=( const Layer& other ) { return *this; }
+   Layer& operator=( const Layer& other ) = default;
+   Layer& operator=( Layer&& other ) = default;
    template< typename Device_ >
    Layer& operator=( const Layer< MeshConfig, Device_, DimensionTag >& other ) { return *this; }
 
diff --git a/src/TNL/Meshes/MeshDetails/layers/EntityTags/LayerFamily.h b/src/TNL/Meshes/MeshDetails/layers/EntityTags/LayerFamily.h
index 712bee34ee..de0bac7c64 100644
--- a/src/TNL/Meshes/MeshDetails/layers/EntityTags/LayerFamily.h
+++ b/src/TNL/Meshes/MeshDetails/layers/EntityTags/LayerFamily.h
@@ -56,10 +56,9 @@ protected:
 
    LayerInheritor() = default;
 
-   explicit LayerInheritor( const LayerInheritor& other )
-   {
-      operator=( other );
-   }
+   explicit LayerInheritor( const LayerInheritor& other ) = default;
+
+   LayerInheritor( LayerInheritor&& other ) = default;
 
    template< typename Device_ >
    LayerInheritor( const LayerInheritor< MeshConfig, Device_, Dimension >& other )
@@ -67,12 +66,9 @@ protected:
       operator=( other );
    }
 
-   LayerInheritor& operator=( const LayerInheritor& other )
-   {
-      LayerType::operator=( other );
-      BaseType::operator=( other );
-      return *this;
-   }
+   LayerInheritor& operator=( const LayerInheritor& other ) = default;
+
+   LayerInheritor& operator=( LayerInheritor&& other ) = default;
 
    template< typename Device_ >
    LayerInheritor& operator=( const LayerInheritor< MeshConfig, Device_, Dimension >& other )
@@ -114,10 +110,12 @@ protected:
    void getGhostEntitiesOffset() const;
 
    LayerInheritor() = default;
-   explicit LayerInheritor( const LayerInheritor& other ) {}
+   explicit LayerInheritor( const LayerInheritor& other ) = default;
+   LayerInheritor( LayerInheritor&& other ) = default;
    template< typename Device_ >
    LayerInheritor( const LayerInheritor< MeshConfig, Device_, DimensionTag< MeshConfig::meshDimension + 1 > >& other ) {}
-   LayerInheritor& operator=( const LayerInheritor& other ) { return *this; }
+   LayerInheritor& operator=( const LayerInheritor& other ) = default;
+   LayerInheritor& operator=( LayerInheritor&& other ) = default;
    template< typename Device_ >
    LayerInheritor& operator=( const LayerInheritor< MeshConfig, Device_, DimensionTag< MeshConfig::meshDimension + 1 > >& other ) { return *this; }
 
diff --git a/src/TNL/Meshes/MeshDetails/layers/StorageLayer.h b/src/TNL/Meshes/MeshDetails/layers/StorageLayer.h
index 84f3128341..6d88caaa6b 100644
--- a/src/TNL/Meshes/MeshDetails/layers/StorageLayer.h
+++ b/src/TNL/Meshes/MeshDetails/layers/StorageLayer.h
@@ -52,10 +52,9 @@ class StorageLayerFamily
 public:
    StorageLayerFamily() = default;
 
-   explicit StorageLayerFamily( const StorageLayerFamily& other )
-   {
-      operator=( other );
-   }
+   explicit StorageLayerFamily( const StorageLayerFamily& other ) = default;
+
+   StorageLayerFamily( StorageLayerFamily&& other ) = default;
 
    template< typename Device_ >
    StorageLayerFamily( const StorageLayerFamily< MeshConfig, Device_ >& other )
@@ -63,12 +62,9 @@ public:
       operator=( other );
    }
 
-   StorageLayerFamily& operator=( const StorageLayerFamily& layer )
-   {
-      BaseType::operator=( layer );
-      DualGraphLayer< MeshConfig, Device >::operator=( layer );
-      return *this;
-   }
+   StorageLayerFamily& operator=( const StorageLayerFamily& layer ) = default;
+
+   StorageLayerFamily& operator=( StorageLayerFamily&& layer ) = default;
 
    template< typename Device_ >
    StorageLayerFamily& operator=( const StorageLayerFamily< MeshConfig, Device_ >& layer )
@@ -224,10 +220,7 @@ public:
 
    StorageLayer() = default;
 
-   explicit StorageLayer( const StorageLayer& other )
-   {
-      operator=( other );
-   }
+   explicit StorageLayer( const StorageLayer& other ) = default;
 
    template< typename Device_ >
    StorageLayer( const StorageLayer< MeshConfig, Device_, DimensionTag >& other )
@@ -235,14 +228,9 @@ public:
       operator=( other );
    }
 
-   StorageLayer& operator=( const StorageLayer& other )
-   {
-      entitiesCount = other.entitiesCount;
-      SubentityStorageBaseType::operator=( other );
-      SuperentityStorageBaseType::operator=( other );
-      BaseType::operator=( other );
-      return *this;
-   }
+   StorageLayer& operator=( const StorageLayer& other ) = default;
+
+   StorageLayer& operator=( StorageLayer&& other ) = default;
 
    template< typename Device_ >
    StorageLayer& operator=( const StorageLayer< MeshConfig, Device_, DimensionTag >& other )
@@ -303,15 +291,16 @@ protected:
 
    StorageLayer() = default;
 
-   explicit StorageLayer( const StorageLayer& other ) {}
+   explicit StorageLayer( const StorageLayer& other ) = default;
+
+   StorageLayer( StorageLayer&& other ) = default;
 
    template< typename Device_ >
    StorageLayer( const StorageLayer< MeshConfig, Device_, DimensionTag >& other ) {}
 
-   StorageLayer& operator=( const StorageLayer& other )
-   {
-      return *this;
-   }
+   StorageLayer& operator=( const StorageLayer& other ) = default;
+
+   StorageLayer& operator=( StorageLayer&& other ) = default;
 
    template< typename Device_ >
    StorageLayer& operator=( const StorageLayer< MeshConfig, Device_, DimensionTag >& other )
diff --git a/src/TNL/Meshes/MeshDetails/layers/SubentityStorageLayer.h b/src/TNL/Meshes/MeshDetails/layers/SubentityStorageLayer.h
index 31cd80a189..0cefa9d15d 100644
--- a/src/TNL/Meshes/MeshDetails/layers/SubentityStorageLayer.h
+++ b/src/TNL/Meshes/MeshDetails/layers/SubentityStorageLayer.h
@@ -120,10 +120,9 @@ protected:
 
    SubentityStorageLayer() = default;
 
-   explicit SubentityStorageLayer( const SubentityStorageLayer& other )
-   {
-      operator=( other );
-   }
+   explicit SubentityStorageLayer( const SubentityStorageLayer& other ) = default;
+
+   SubentityStorageLayer( SubentityStorageLayer&& other ) = default;
 
    template< typename Device_ >
    SubentityStorageLayer( const SubentityStorageLayer< MeshConfig, Device_, EntityTopology, SubdimensionTag >& other )
@@ -131,12 +130,9 @@ protected:
       operator=( other );
    }
 
-   SubentityStorageLayer& operator=( const SubentityStorageLayer& other )
-   {
-      BaseType::operator=( other );
-      matrix = other.matrix;
-      return *this;
-   }
+   SubentityStorageLayer& operator=( const SubentityStorageLayer& other ) = default;
+
+   SubentityStorageLayer& operator=( SubentityStorageLayer&& other ) = default;
 
    template< typename Device_ >
    SubentityStorageLayer& operator=( const SubentityStorageLayer< MeshConfig, Device_, EntityTopology, SubdimensionTag >& other )
@@ -225,10 +221,9 @@ protected:
 
    SubentityStorageLayer() = default;
 
-   explicit SubentityStorageLayer( const SubentityStorageLayer& other )
-   {
-      operator=( other );
-   }
+   explicit SubentityStorageLayer( const SubentityStorageLayer& other ) = default;
+
+   SubentityStorageLayer( SubentityStorageLayer&& other ) = default;
 
    template< typename Device_ >
    SubentityStorageLayer( const SubentityStorageLayer< MeshConfig, Device_, EntityTopology, SubdimensionTag >& other )
@@ -236,13 +231,9 @@ protected:
       operator=( other );
    }
 
-   SubentityStorageLayer& operator=( const SubentityStorageLayer& other )
-   {
-      BaseType::operator=( other );
-      subentitiesCounts = other.subentitiesCounts;
-      matrix = other.matrix;
-      return *this;
-   }
+   SubentityStorageLayer& operator=( const SubentityStorageLayer& other ) = default;
+
+   SubentityStorageLayer& operator=( SubentityStorageLayer&& other ) = default;
 
    template< typename Device_ >
    SubentityStorageLayer& operator=( const SubentityStorageLayer< MeshConfig, Device_, EntityTopology, SubdimensionTag >& other )
@@ -315,7 +306,7 @@ protected:
 private:
    NeighborCountsArray subentitiesCounts;
    SubentityMatrixType matrix;
-   
+
    // friend class is needed for templated assignment operators
    template< typename MeshConfig_, typename Device_, typename EntityTopology_, typename SubdimensionTag_, bool Storage_, bool dynamicTopology_ >
    friend class SubentityStorageLayer;
@@ -350,10 +341,9 @@ protected:
 
    SubentityStorageLayer() = default;
 
-   explicit SubentityStorageLayer( const SubentityStorageLayer& other )
-   {
-      operator=( other );
-   }
+   explicit SubentityStorageLayer( const SubentityStorageLayer& other ) = default;
+
+   SubentityStorageLayer( SubentityStorageLayer&& other ) = default;
 
    template< typename Device_ >
    SubentityStorageLayer( const SubentityStorageLayer< MeshConfig, Device_, EntityTopology, SubdimensionTag >& other )
@@ -361,13 +351,9 @@ protected:
       operator=( other );
    }
 
-   SubentityStorageLayer& operator=( const SubentityStorageLayer& other )
-   {
-      BaseType::operator=( other );
-      subentitiesCounts = other.subentitiesCounts;
-      matrix = other.matrix;
-      return *this;
-   }
+   SubentityStorageLayer& operator=( const SubentityStorageLayer& other ) = default;
+
+   SubentityStorageLayer& operator=( SubentityStorageLayer&& other ) = default;
 
    template< typename Device_ >
    SubentityStorageLayer& operator=( const SubentityStorageLayer< MeshConfig, Device_, EntityTopology, SubdimensionTag >& other )
@@ -434,7 +420,7 @@ protected:
 private:
    NeighborCountsArray subentitiesCounts;
    SubentityMatrixType matrix;
-   
+
    // friend class is needed for templated assignment operators
    template< typename MeshConfig_, typename Device_, typename EntityTopology_, typename SubdimensionTag_, bool Storage_, bool dynamicTopology_ >
    friend class SubentityStorageLayer;
@@ -469,10 +455,9 @@ protected:
 
    SubentityStorageLayer() = default;
 
-   explicit SubentityStorageLayer( const SubentityStorageLayer& other )
-   {
-      operator=( other );
-   }
+   explicit SubentityStorageLayer( const SubentityStorageLayer& other ) = default;
+
+   SubentityStorageLayer( SubentityStorageLayer&& other ) = default;
 
    template< typename Device_ >
    SubentityStorageLayer( const SubentityStorageLayer< MeshConfig, Device_, EntityTopology, SubdimensionTag >& other )
@@ -480,12 +465,9 @@ protected:
       operator=( other );
    }
 
-   SubentityStorageLayer& operator=( const SubentityStorageLayer& other )
-   {
-      BaseType::operator=( other );
-      matrix = other.matrix;
-      return *this;
-   }
+   SubentityStorageLayer& operator=( const SubentityStorageLayer& other ) = default;
+
+   SubentityStorageLayer& operator=( SubentityStorageLayer&& other ) = default;
 
    template< typename Device_ >
    SubentityStorageLayer& operator=( const SubentityStorageLayer< MeshConfig, Device_, EntityTopology, SubdimensionTag >& other )
@@ -533,7 +515,7 @@ protected:
 
 private:
    SubentityMatrixType matrix;
-   
+
    // friend class is needed for templated assignment operators
    template< typename MeshConfig_, typename Device_, typename EntityTopology_, typename SubdimensionTag_, bool Storage_, bool dynamicTopology_ >
    friend class SubentityStorageLayer;
@@ -584,9 +566,12 @@ protected:
    using GlobalIndexType = typename MeshConfig::GlobalIndexType;
 
    SubentityStorageLayer() = default;
-   explicit SubentityStorageLayer( const SubentityStorageLayer& other ) {}
+   explicit SubentityStorageLayer( const SubentityStorageLayer& other ) = default;
+   SubentityStorageLayer( SubentityStorageLayer&& other ) = default;
    template< typename Device_ >
    SubentityStorageLayer( const SubentityStorageLayer< MeshConfig, Device_, EntityTopology, SubdimensionTag >& other ) {}
+   SubentityStorageLayer& operator=( const SubentityStorageLayer& other ) = default;
+   SubentityStorageLayer& operator=( SubentityStorageLayer&& other ) = default;
    template< typename Device_ >
    SubentityStorageLayer& operator=( const SubentityStorageLayer< MeshConfig, Device_, EntityTopology, SubdimensionTag >& other ) { return *this; }
 
diff --git a/src/TNL/Meshes/MeshDetails/layers/SuperentityStorageLayer.h b/src/TNL/Meshes/MeshDetails/layers/SuperentityStorageLayer.h
index 4a15cf19e4..5a802735c8 100644
--- a/src/TNL/Meshes/MeshDetails/layers/SuperentityStorageLayer.h
+++ b/src/TNL/Meshes/MeshDetails/layers/SuperentityStorageLayer.h
@@ -105,10 +105,9 @@ protected:
 
    SuperentityStorageLayer() = default;
 
-   explicit SuperentityStorageLayer( const SuperentityStorageLayer& other )
-   {
-      operator=( other );
-   }
+   explicit SuperentityStorageLayer( const SuperentityStorageLayer& other ) = default;
+
+   SuperentityStorageLayer( SuperentityStorageLayer&& other ) = default;
 
    template< typename Device_ >
    SuperentityStorageLayer( const SuperentityStorageLayer< MeshConfig, Device_, EntityDimensionTag, SuperdimensionTag >& other )
@@ -116,13 +115,9 @@ protected:
       operator=( other );
    }
 
-   SuperentityStorageLayer& operator=( const SuperentityStorageLayer& other )
-   {
-      BaseType::operator=( other );
-      superentitiesCounts = other.superentitiesCounts;
-      matrix = other.matrix;
-      return *this;
-   }
+   SuperentityStorageLayer& operator=( const SuperentityStorageLayer& other ) = default;
+
+   SuperentityStorageLayer& operator=( SuperentityStorageLayer&& other ) = default;
 
    template< typename Device_ >
    SuperentityStorageLayer& operator=( const SuperentityStorageLayer< MeshConfig, Device_, EntityDimensionTag, SuperdimensionTag >& other )
@@ -208,9 +203,12 @@ class SuperentityStorageLayer< MeshConfig, Device, EntityDimensionTag, EntityDim
 
 protected:
    SuperentityStorageLayer() = default;
-   explicit SuperentityStorageLayer( const SuperentityStorageLayer& other ) {}
+   explicit SuperentityStorageLayer( const SuperentityStorageLayer& other ) = default;
+   SuperentityStorageLayer( SuperentityStorageLayer&& other ) = default;
    template< typename Device_ >
    SuperentityStorageLayer( const SuperentityStorageLayer< MeshConfig, Device_, EntityDimensionTag, SuperdimensionTag >& other ) {}
+   SuperentityStorageLayer& operator=( const SuperentityStorageLayer& other ) = default;
+   SuperentityStorageLayer& operator=( SuperentityStorageLayer&& other ) = default;
    template< typename Device_ >
    SuperentityStorageLayer& operator=( const SuperentityStorageLayer< MeshConfig, Device_, EntityDimensionTag, SuperdimensionTag >& other ) { return *this; }
 
-- 
GitLab