]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Do not clear vectors in move operators/constructors for distributed data structures
authorMatthias Maier <tamiko@43-1.org>
Sat, 2 May 2015 08:10:57 +0000 (10:10 +0200)
committerMatthias Maier <tamiko@43-1.org>
Sat, 2 May 2015 10:18:11 +0000 (12:18 +0200)
include/deal.II/lac/petsc_parallel_block_vector.h
include/deal.II/lac/petsc_parallel_vector.h
include/deal.II/lac/trilinos_parallel_block_vector.h
include/deal.II/lac/trilinos_vector.h
source/lac/petsc_parallel_vector.cc
source/lac/trilinos_block_vector.cc
source/lac/trilinos_vector.cc
tests/trilinos/vector_move_operations.cc

index 73e1b79a04cda0919dd6deb964b61a814cbe223e..5294689154dfabcacc752302f5cd1956484cecec 100644 (file)
@@ -113,12 +113,7 @@ namespace PETScWrappers
        * @note This operator is only available if deal.II is configured with
        * C++11 support.
        */
-      BlockVector (BlockVector &&v)
-      {
-        swap(v);
-        // be nice and reset v to zero
-        v.reinit(0, v.get_mpi_communicator(), 0, 0, false);
-      }
+      BlockVector (BlockVector &&v);
 #endif
 
       /**
@@ -168,20 +163,12 @@ namespace PETScWrappers
 #ifdef DEAL_II_WITH_CXX11
       /**
        * Move the given vector. This operator replaces the present vector with
-       * @p v by efficiently swapping the internal data structures. @p v is
-       * left empty.
+       * @p v by efficiently swapping the internal data structures.
        *
        * @note This operator is only available if deal.II is configured with
        * C++11 support.
        */
-      BlockVector &operator= (BlockVector &&v)
-      {
-        swap(v);
-        // be nice and reset v to zero
-        v.reinit(0, v.get_mpi_communicator(), 0, 0, false);
-
-        return *this;
-      }
+      BlockVector &operator= (BlockVector &&v);
 #endif
 
       /**
@@ -371,6 +358,14 @@ namespace PETScWrappers
         this->components[i] = v.components[i];
     }
 
+#ifdef DEAL_II_WITH_CXX11
+    inline
+    BlockVector::BlockVector (BlockVector &&v)
+    {
+      swap(v);
+    }
+#endif
+
     inline
     BlockVector::BlockVector (const std::vector<IndexSet> &parallel_partitioning,
                               const MPI_Comm              &communicator)
@@ -414,6 +409,16 @@ namespace PETScWrappers
       return *this;
     }
 
+#ifdef DEAL_II_WITH_CXX11
+    inline
+    BlockVector &
+    BlockVector::operator= (BlockVector &&v)
+    {
+      swap(v);
+      return *this;
+    }
+#endif
+
     inline
     BlockVector::~BlockVector ()
     {}
index 216606114363b1254fb1933f1a2fc8cd4353125b..a34a0376d6bc1824dc3f1ccc2546bfc7141053bf 100644 (file)
@@ -197,12 +197,7 @@ namespace PETScWrappers
        * @note This operator is only available if deal.II is configured with
        * C++11 support.
        */
-      Vector (Vector &&v)
-      {
-        swap(v);
-        // be nice and reset v to zero
-        v.reinit(v.communicator, 0, 0, false);
-      }
+      Vector (Vector &&v);
 #endif
 
       /**
@@ -291,20 +286,12 @@ namespace PETScWrappers
 #ifdef DEAL_II_WITH_CXX11
       /**
        * Move the given vector. This operator replaces the present vector with
-       * @p v by efficiently swapping the internal data structures. @p v is
-       * left empty.
+       * @p v by efficiently swapping the internal data structures.
        *
        * @note This operator is only available if deal.II is configured with
        * C++11 support.
        */
-      Vector &operator= (Vector &&v)
-      {
-        swap(v);
-        // be nice and reset v to zero
-        v.reinit(v.communicator, 0, 0, false);
-
-        return *this;
-      }
+      Vector &operator= (Vector &&v);
 #endif
 
       /**
@@ -565,6 +552,17 @@ namespace PETScWrappers
 
 
 
+#ifdef DEAL_II_WITH_CXX11
+    inline
+    Vector & Vector::operator= (Vector &&v)
+    {
+      swap(v);
+      return *this;
+    }
+#endif
+
+
+
     template <typename number>
     inline
     Vector &
index 3deb3b709d6d2539a3a6ef9b80e846faffcd7aa4..79b5ce176ca27eb1baebd4dea56997f6f61cb4c6 100644 (file)
@@ -138,11 +138,7 @@ namespace TrilinosWrappers
        * @note This constructor is only available if deal.II is configured with
        * C++11 support.
        */
-      BlockVector (BlockVector &&v)
-      {
-        swap(v);
-        v.reinit (0);
-      }
+      BlockVector (BlockVector &&v);
 #endif
 
       /**
@@ -171,20 +167,12 @@ namespace TrilinosWrappers
 #ifdef DEAL_II_WITH_CXX11
       /**
        * Move the given vector. This operator replaces the present vector with
-       * @p v by efficiently swapping the internal data structures. @p v is
-       * left empty.
+       * @p v by efficiently swapping the internal data structures.
        *
        * @note This operator is only available if deal.II is configured with
        * C++11 support.
        */
-      BlockVector &operator= (BlockVector &&v)
-      {
-        swap(v);
-        // be nice and reset v to zero
-        v.reinit (0);
-
-        return *this;
-      }
+      BlockVector &operator= (BlockVector &&v);
 #endif
 
       /**
@@ -412,6 +400,16 @@ namespace TrilinosWrappers
 
 
 
+#ifdef DEAL_II_WITH_CXX11
+    inline
+    BlockVector::BlockVector (BlockVector &&v)
+    {
+      swap(v);
+    }
+#endif
+
+
+
     inline
     bool
     BlockVector::is_compressed () const
index c561202d75534b1f56e20cdb9cf9f313cfdc1c4c..542473c1891ba32ec06d1c2477595fa65adb5e00 100644 (file)
@@ -294,12 +294,7 @@ namespace TrilinosWrappers
        * @note This constructor is only available if deal.II is configured with
        * C++11 support.
        */
-      Vector (Vector &&v)
-      {
-        swap(v);
-        // be nice and reset v to zero
-        v.clear();
-      }
+      Vector (Vector &&v);
 #endif
 
       /**
@@ -354,20 +349,12 @@ namespace TrilinosWrappers
 #ifdef DEAL_II_WITH_CXX11
       /**
        * Move the given vector. This operator replaces the present vector with
-       * @p v by efficiently swapping the internal data structures. @p v is
-       * left empty.
+       * @p v by efficiently swapping the internal data structures.
        *
        * @note This operator is only available if deal.II is configured with
        * C++11 support.
        */
-      Vector &operator= (Vector &&v)
-      {
-        swap(v);
-        // be nice and reset v to zero
-        v.clear();
-
-        return *this;
-      }
+      Vector &operator= (Vector &&v);
 #endif
 
       /**
index 1bae4a90459a69d00e04624da4d10b813ff1d4a0..898b98e23c480954e2fda762ab71c20cdea8d82d 100644 (file)
@@ -1,6 +1,6 @@
 // ---------------------------------------------------------------------
 //
-// Copyright (C) 2004 - 2014 by the deal.II authors
+// Copyright (C) 2004 - 2015 by the deal.II authors
 //
 // This file is part of the deal.II library.
 //
@@ -43,6 +43,15 @@ namespace PETScWrappers
 
 
 
+#ifdef DEAL_II_WITH_CXX11
+    Vector::Vector (Vector &&v)
+    {
+      swap(v);
+    }
+#endif
+
+
+
     Vector::Vector (const MPI_Comm &communicator,
                     const size_type n,
                     const size_type local_size)
index d7714f8401862dd529820a290f1dfb43aa228e43..cb7e3d59fec33b2ddb625ff7bb5c4508cea128e4 100644 (file)
@@ -1,6 +1,6 @@
 // ---------------------------------------------------------------------
 //
-// Copyright (C) 2008 - 2014 by the deal.II authors
+// Copyright (C) 2008 - 2015 by the deal.II authors
 //
 // This file is part of the deal.II library.
 //
@@ -76,6 +76,17 @@ namespace TrilinosWrappers
 
 
 
+#ifdef DEAL_II_WITH_CXX11
+    BlockVector &
+    BlockVector::operator= (BlockVector &&v)
+    {
+      swap(v);
+      return *this;
+    }
+#endif
+
+
+
     BlockVector &
     BlockVector::operator = (const ::dealii::TrilinosWrappers::BlockVector &v)
     {
index eadd00c906e247a30a1f4c6c7a690a0322466017..a4301fbeb2e7ed1e56e3fd0287fa0c2ab072feb5 100644 (file)
@@ -125,6 +125,15 @@ namespace TrilinosWrappers
 
 
 
+#ifdef DEAL_II_WITH_CXX11
+    Vector::Vector (Vector &&v)
+    {
+      swap(v);
+    }
+#endif
+
+
+
     Vector::Vector (const Epetra_Map &input_map,
                     const VectorBase &v)
       :
@@ -421,6 +430,16 @@ namespace TrilinosWrappers
 
 
 
+#ifdef DEAL_II_WITH_CXX11
+      Vector & Vector::operator= (Vector &&v)
+      {
+        swap(v);
+        return *this;
+      }
+#endif
+
+
+
     Vector &
     Vector::operator = (const TrilinosWrappers::Vector &v)
     {
index 1a57fbaae13454497f1010413ae663e080b03f10..1558c2d1c5b8084763284402a9e63da825610336 100644 (file)
@@ -56,6 +56,7 @@ int main (int argc, char **argv)
     PRINTME("copy assignemnt", v);
     PRINTME("old object", u);
 
+    v.clear();
     v = std::move(u);
     PRINTME("move assignemnt", v);
     deallog << "old object size: " << u.size() << std::endl;
@@ -83,6 +84,7 @@ int main (int argc, char **argv)
     PRINTBLOCK("copy assignemnt", v);
     PRINTBLOCK("old object", u);
 
+    v.reinit(0);
     v = std::move(u);
     PRINTBLOCK("move assignemnt", v);
     deallog << "old object size: " << u.n_blocks() << std::endl;

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.