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