]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Add move constructor and operator to Vector and BlockVector
authorMatthias Maier <tamiko@43-1.org>
Fri, 1 May 2015 19:47:51 +0000 (21:47 +0200)
committerMatthias Maier <tamiko@43-1.org>
Sat, 2 May 2015 09:21:40 +0000 (11:21 +0200)
include/deal.II/lac/block_vector.h
include/deal.II/lac/block_vector.templates.h
include/deal.II/lac/vector.h
include/deal.II/lac/vector.templates.h

index 0690e456da909e5b48ed0412d0b6b03286002112..6b1ac989cf3de446b3de521d3cf8a0e47de472f4 100644 (file)
@@ -99,12 +99,24 @@ public:
                         const size_type block_size = 0);
 
   /**
-   * Copy-Constructor. Dimension set to that of V, all components are copied
-   * from V
+   * Copy Constructor. Dimension set to that of @p v, all components are
+   * copied from @p v.
    */
   BlockVector (const BlockVector<Number> &V);
 
 
+#ifdef DEAL_II_WITH_CXX11
+  /**
+   * Move constructor. Creates a new vector by stealing the internal data
+   * of the vector @p v.
+   *
+   * @note This constructor is only available if deal.II is configured with
+   * C++11 support.
+   */
+  BlockVector (BlockVector<Number> &&v);
+#endif
+
+
 #ifndef DEAL_II_EXPLICIT_CONSTRUCTOR_BUG
   /**
    * Copy constructor taking a BlockVector of another data type. This will
@@ -180,27 +192,39 @@ public:
    * Copy operator: fill all components of the vector with the given scalar
    * value.
    */
-  BlockVector &operator = (const value_type s);
+  BlockVector &operator= (const value_type s);
 
   /**
    * Copy operator for arguments of the same type. Resize the present vector
    * if necessary.
    */
-  BlockVector &
-  operator= (const BlockVector &V);
+  BlockVector<Number> &
+  operator= (const BlockVector<Number> &v);
+
+#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.
+   *
+   * @note This operator is only available if deal.II is configured with
+   * C++11 support.
+   */
+  BlockVector<Number> &operator= (BlockVector<Number> &&v);
+#endif
 
   /**
    * Copy operator for template arguments of different types. Resize the
    * present vector if necessary.
    */
   template <class Number2>
-  BlockVector &
+  BlockVector<Number> &
   operator= (const BlockVector<Number2> &V);
 
   /**
    * Copy a regular vector into a block vector.
    */
-  BlockVector &
+  BlockVector<Number> &
   operator= (const Vector<Number> &V);
 
 #ifdef DEAL_II_WITH_TRILINOS
@@ -208,9 +232,10 @@ public:
    * A copy constructor from a Trilinos block vector to a deal.II block
    * vector.
    */
-  BlockVector &
+  BlockVector<Number> &
   operator= (const TrilinosWrappers::BlockVector &V);
 #endif
+
   /**
    * Reinitialize the BlockVector to contain <tt>n_blocks</tt> blocks of size
    * <tt>block_size</tt> each.
@@ -378,12 +403,12 @@ BlockVector<Number>::BlockVector (const std::vector<size_type>    &block_sizes,
 template <typename Number>
 inline
 BlockVector<Number> &
-BlockVector<Number>::operator = (const value_type s)
+BlockVector<Number>::operator= (const value_type s)
 {
 
   AssertIsFinite(s);
 
-  BaseClass::operator = (s);
+  BaseClass::operator= (s);
   return *this;
 }
 
@@ -392,21 +417,37 @@ BlockVector<Number>::operator = (const value_type s)
 template <typename Number>
 inline
 BlockVector<Number> &
-BlockVector<Number>::operator = (const BlockVector &v)
+BlockVector<Number>::operator= (const BlockVector<Number> &v)
 {
   reinit (v, true);
-  BaseClass::operator = (v);
+  BaseClass::operator= (v);
   return *this;
 }
 
 
 
+#ifdef DEAL_II_WITH_CXX11
+template <typename Number>
+inline
+BlockVector<Number> &
+BlockVector<Number>::operator= (BlockVector<Number> &&v)
+{
+  swap(v);
+  // be nice and reset v to zero
+  v.reinit(0, 0, false);
+
+  return *this;
+}
+#endif
+
+
+
 template <typename Number>
 inline
 BlockVector<Number> &
-BlockVector<Number>::operator = (const Vector<Number> &v)
+BlockVector<Number>::operator= (const Vector<Number> &v)
 {
-  BaseClass::operator = (v);
+  BaseClass::operator= (v);
   return *this;
 }
 
@@ -416,10 +457,10 @@ template <typename Number>
 template <typename Number2>
 inline
 BlockVector<Number> &
-BlockVector<Number>::operator = (const BlockVector<Number2> &v)
+BlockVector<Number>::operator= (const BlockVector<Number2> &v)
 {
   reinit (v, true);
-  BaseClass::operator = (v);
+  BaseClass::operator= (v);
   return *this;
 }
 
index 37fe84c8f26eae34bfe6c86cac5dbe2309f588ea..b223c6c20334a410582b7757331bf0fbf55264ae 100644 (file)
@@ -61,6 +61,17 @@ BlockVector<Number>::BlockVector (const BlockVector<Number> &v)
 }
 
 
+#ifdef DEAL_II_WITH_CXX11
+template <typename Number>
+BlockVector<Number>::BlockVector (BlockVector<Number> &&v)
+  {
+    swap(v);
+    // be nice and reset v to zero
+    v.reinit(0, 0, false);
+  }
+#endif
+
+
 #ifndef DEAL_II_EXPLICIT_CONSTRUCTOR_BUG
 
 template <typename Number>
@@ -151,9 +162,9 @@ BlockVector<Number>::~BlockVector ()
 template <typename Number>
 inline
 BlockVector<Number> &
-BlockVector<Number>::operator = (const TrilinosWrappers::BlockVector &v)
+BlockVector<Number>::operator= (const TrilinosWrappers::BlockVector &v)
 {
-  BaseClass::operator = (v);
+  BaseClass::operator= (v);
   return *this;
 }
 #endif
index 21de7dc93349e8d63e989c57f9edc369a39d3188..318486ea5d7286a392cee375835bdda5f01d555a 100644 (file)
@@ -156,7 +156,7 @@ public:
   Vector ();
 
   /**
-   * Copy-constructor. Sets the dimension to that of the given vector, and
+   * Copy constructor. Sets the dimension to that of the given vector, and
    * copies all elements.
    *
    * We would like to make this constructor explicit, but standard containers
@@ -164,6 +164,17 @@ public:
    */
   Vector (const Vector<Number> &v);
 
+#ifdef DEAL_II_WITH_CXX11
+  /**
+   * Move constructor. Creates a new vector by stealing the internal data
+   * of the vector @p v.
+   *
+   * @note This constructor is only available if deal.II is configured with
+   * C++11 support.
+   */
+  Vector (Vector<Number> &&v);
+#endif
+
 
 #ifndef DEAL_II_EXPLICIT_CONSTRUCTOR_BUG
   /**
@@ -325,7 +336,7 @@ public:
    *
    * @dealiiOperationIsMultithreaded
    */
-  Vector<Number> &operator = (const Number s);
+  Vector<Number> &operator= (const Number s);
 
   /**
    * Copy the given vector. Resize the present vector if necessary.
@@ -334,6 +345,18 @@ public:
    */
   Vector<Number> &operator= (const Vector<Number> &v);
 
+#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.
+   *
+   * @note This operator is only available if deal.II is configured with
+   * C++11 support.
+   */
+  Vector<Number> &operator= (Vector<Number> &&v);
+#endif
+
   /**
    * Copy the given vector. Resize the present vector if necessary.
    *
@@ -354,7 +377,7 @@ public:
    * during configuration time.
    */
   Vector<Number> &
-  operator = (const PETScWrappers::Vector &v);
+  operator= (const PETScWrappers::Vector &v);
 
   /**
    * Another copy operator: copy the values from a parallel PETSc wrapper
@@ -367,7 +390,7 @@ public:
    * the other jobs do something else.
    */
   Vector<Number> &
-  operator = (const PETScWrappers::MPI::Vector &v);
+  operator= (const PETScWrappers::MPI::Vector &v);
 #endif
 
 
@@ -384,7 +407,7 @@ public:
    * the other jobs do something else.
    */
   Vector<Number> &
-  operator = (const TrilinosWrappers::MPI::Vector &v);
+  operator= (const TrilinosWrappers::MPI::Vector &v);
 
   /**
    * Another copy operator: copy the values from a sequential Trilinos wrapper
@@ -392,7 +415,7 @@ public:
    * during configuration time.
    */
   Vector<Number> &
-  operator = (const TrilinosWrappers::Vector &v);
+  operator= (const TrilinosWrappers::Vector &v);
 #endif
 
   /**
@@ -401,7 +424,7 @@ public:
    * of different sizes makes not much sense anyway.
    */
   template <typename Number2>
-  bool operator == (const Vector<Number2> &v) const;
+  bool operator== (const Vector<Number2> &v) const;
 
   /**
    * Test for inequality. This function assumes that the present vector and
@@ -1077,7 +1100,7 @@ namespace internal
 template <typename Number>
 inline
 Vector<Number> &
-Vector<Number>::operator = (const Vector<Number> &v)
+Vector<Number>::operator= (const Vector<Number> &v)
 {
   dealii::internal::Vector::copy_vector (v, *this);
   return *this;
@@ -1085,11 +1108,27 @@ Vector<Number>::operator = (const Vector<Number> &v)
 
 
 
+#ifdef DEAL_II_WITH_CXX11
+template <typename Number>
+inline
+Vector<Number> &
+Vector<Number>::operator= (Vector<Number> &&v)
+{
+  swap(v);
+  // be nice and reset v to zero
+  v.reinit(0, false);
+
+  return *this;
+}
+#endif
+
+
+
 template <typename Number>
 template <typename Number2>
 inline
 Vector<Number> &
-Vector<Number>::operator = (const Vector<Number2> &v)
+Vector<Number>::operator= (const Vector<Number2> &v)
 {
   internal::Vector::copy_vector (v, *this);
   return *this;
@@ -1333,7 +1372,7 @@ void
 Vector<Number>::save (Archive &ar, const unsigned int) const
 {
   // forward to serialization function in the base class.
-  ar   &static_cast<const Subscriptor &>(*this);
+  ar &static_cast<const Subscriptor &>(*this);
 
   ar &vec_size &max_vec_size ;
   ar &boost::serialization::make_array(val, max_vec_size);
index eef22765074a21c76ba34d72e11ed94f7bcfb6dd..a4f7c4ac3449049f3deb1e91f294ae408bb88d41 100644 (file)
@@ -558,7 +558,6 @@ namespace internal
 
 
 
-
 template <typename Number>
 Vector<Number>::Vector (const Vector<Number> &v)
   :
@@ -575,8 +574,20 @@ Vector<Number>::Vector (const Vector<Number> &v)
 }
 
 
-#ifndef DEAL_II_EXPLICIT_CONSTRUCTOR_BUG
 
+#ifdef DEAL_II_WITH_CXX11
+template <typename Number>
+Vector<Number>::Vector (Vector<Number> &&v)
+{
+  swap(v);
+  // be nice and reset v to zero
+  v.reinit(0, false);
+}
+#endif
+
+
+
+#ifndef DEAL_II_EXPLICIT_CONSTRUCTOR_BUG
 template <typename Number>
 template <typename OtherNumber>
 Vector<Number>::Vector (const Vector<OtherNumber> &v)
@@ -592,11 +603,10 @@ Vector<Number>::Vector (const Vector<OtherNumber> &v)
       std::copy (v.begin(), v.end(), begin());
     }
 }
-
 #endif
 
-#ifdef DEAL_II_WITH_PETSC
 
+#ifdef DEAL_II_WITH_PETSC
 
 template <typename Number>
 Vector<Number>::Vector (const PETScWrappers::Vector &v)
@@ -647,6 +657,7 @@ Vector<Number>::Vector (const PETScWrappers::MPI::Vector &v)
 
 #endif
 
+
 #ifdef DEAL_II_WITH_TRILINOS
 
 template <typename Number>
@@ -707,6 +718,7 @@ Vector<Number>::Vector (const TrilinosWrappers::Vector &v)
 
 #endif
 
+
 template <typename Number>
 template <typename Number2>
 void Vector<Number>::reinit (const Vector<Number2> &v,
@@ -715,18 +727,6 @@ void Vector<Number>::reinit (const Vector<Number2> &v,
   reinit (v.size(), fast);
 }
 
-// Moved to vector.h as an inline function by Luca Heltai on
-// 2009/04/12 to prevent strange compiling errors, after making swap
-// virtual.
-// template <typename Number>
-// void
-// Vector<Number>::swap (Vector<Number> &v)
-// {
-//   std::swap (vec_size,     v.vec_size);
-//   std::swap (max_vec_size, v.max_vec_size);
-//   std::swap (val,          v.val);
-// }
-
 
 
 template <typename Number>
@@ -830,7 +830,7 @@ namespace internal
 
 template <typename Number>
 Vector<Number> &
-Vector<Number>::operator = (const Number s)
+Vector<Number>::operator= (const Number s)
 {
   AssertIsFinite(s);
   if (s != Number())
@@ -852,7 +852,7 @@ Vector<Number>::operator = (const Number s)
 #ifdef DEAL_II_BOOST_BIND_COMPILER_BUG
 template <>
 Vector<std::complex<float> > &
-Vector<std::complex<float> >::operator = (const std::complex<float> s)
+Vector<std::complex<float> >::operator= (const std::complex<float> s)
 {
   AssertIsFinite(s);
   if (s != std::complex<float>())
@@ -1769,7 +1769,7 @@ void Vector<Number>::ratio (const Vector<Number> &a,
 
 template <typename Number>
 Vector<Number> &
-Vector<Number>::operator = (const BlockVector<Number> &v)
+Vector<Number>::operator= (const BlockVector<Number> &v)
 {
   if (v.size() != vec_size)
     reinit (v.size(), true);
@@ -1788,7 +1788,7 @@ Vector<Number>::operator = (const BlockVector<Number> &v)
 
 template <typename Number>
 Vector<Number> &
-Vector<Number>::operator = (const PETScWrappers::Vector &v)
+Vector<Number>::operator= (const PETScWrappers::Vector &v)
 {
   if (v.size() != vec_size)
     reinit (v.size(), true);
@@ -1815,7 +1815,7 @@ Vector<Number>::operator = (const PETScWrappers::Vector &v)
 
 template <typename Number>
 Vector<Number> &
-Vector<Number>::operator = (const PETScWrappers::MPI::Vector &v)
+Vector<Number>::operator= (const PETScWrappers::MPI::Vector &v)
 {
   // do this in a two-stage process:
   // first convert to a sequential petsc
@@ -1833,7 +1833,7 @@ Vector<Number>::operator = (const PETScWrappers::MPI::Vector &v)
 
 template <typename Number>
 Vector<Number> &
-Vector<Number>::operator = (const TrilinosWrappers::MPI::Vector &v)
+Vector<Number>::operator= (const TrilinosWrappers::MPI::Vector &v)
 {
   // Generate a localized version
   // of the Trilinos vectors and
@@ -1848,7 +1848,7 @@ Vector<Number>::operator = (const TrilinosWrappers::MPI::Vector &v)
 
 template <typename Number>
 Vector<Number> &
-Vector<Number>::operator = (const TrilinosWrappers::Vector &v)
+Vector<Number>::operator= (const TrilinosWrappers::Vector &v)
 {
   if (v.size() != vec_size)
     reinit (v.size(), true);
@@ -1871,7 +1871,7 @@ Vector<Number>::operator = (const TrilinosWrappers::Vector &v)
 template <typename Number>
 template <typename Number2>
 bool
-Vector<Number>::operator == (const Vector<Number2> &v) const
+Vector<Number>::operator== (const Vector<Number2> &v) const
 {
   Assert (vec_size!=0, ExcEmptyObject());
   Assert (vec_size == v.size(), ExcDimensionMismatch(vec_size, v.size()));

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.