From: Matthias Maier Date: Mon, 4 May 2015 11:04:40 +0000 (+0200) Subject: Bugfix: Do not reinitialize in move operator X-Git-Tag: v8.3.0-rc1~202^2~2 X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=740cfb3b44f28beac2e76370dcbd374d7699916c;p=dealii.git Bugfix: Do not reinitialize in move operator --- diff --git a/include/deal.II/lac/block_vector.h b/include/deal.II/lac/block_vector.h index 95e7bbf2d3..a1a9eaac36 100644 --- a/include/deal.II/lac/block_vector.h +++ b/include/deal.II/lac/block_vector.h @@ -204,8 +204,7 @@ public: #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. @@ -430,9 +429,6 @@ BlockVector::operator= (BlockVector &&v) { swap(v); - // be nice and reset v to zero - v.reinit(0, 0, false); - return *this; } #endif diff --git a/tests/lac/block_vector_move_operations.cc b/tests/lac/block_vector_move_operations.cc new file mode 100644 index 0000000000..68a8fa1021 --- /dev/null +++ b/tests/lac/block_vector_move_operations.cc @@ -0,0 +1,63 @@ +// --------------------------------------------------------------------- +// +// Copyright (C) 2012 - 2015 by the deal.II authors +// +// This file is part of the deal.II library. +// +// The deal.II library is free software; you can use it, redistribute +// it, and/or modify it under the terms of the GNU Lesser General +// Public License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// The full text of the license can be found in the file LICENSE at +// the top level of the deal.II distribution. +// +// --------------------------------------------------------------------- + + +#include "../tests.h" +#include + +#define PRINTME(name, var) \ + deallog << "Block vector: " name << ":" << std::endl; \ + for (unsigned int i = 0; i < var.n_blocks(); ++i) \ + deallog << "[block " << i << " ] " << var.block(i); + +int main() +{ + initlog(); + + { + BlockVector temp(5, 2); + BlockVector w(std::move(temp)); + PRINTME("move constructor", w); + } + + deallog << std::endl; + + { + BlockVector u(5, 2); + for (unsigned int i = 0; i < 5; ++i) + for (unsigned int j = 0; j < 2; ++j) + u.block(i)[j] = (double)(10 * i + j); + + PRINTME("BlockVector", u); + + BlockVector v; + v = u; + PRINTME("copy assignemnt", v); + PRINTME("old object", u); + + v = 0.; + v = std::move(u); + PRINTME("move assignemnt", v); + deallog << "old object size: " << u.n_blocks() << std::endl; + + // and swap again with different sizes + BlockVector w; + w = std::move(v); + PRINTME("move assignemnt", w); + deallog << "old object size: " << v.n_blocks() << std::endl; + } +} + + diff --git a/tests/lac/block_vector_move_operations.with_cxx11=on.output b/tests/lac/block_vector_move_operations.with_cxx11=on.output new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/lac/vector_move_operations.cc b/tests/lac/vector_move_operations.cc index 9fbc51378a..951c5003c4 100644 --- a/tests/lac/vector_move_operations.cc +++ b/tests/lac/vector_move_operations.cc @@ -16,19 +16,14 @@ #include "../tests.h" #include -#include - -#define PRINTME(name, var) \ - deallog << "Block vector: " name << ":" << std::endl; \ - for (unsigned int i = 0; i < var.n_blocks(); ++i) \ - deallog << "[block " << i << " ] " << var.block(i); int main() { initlog(); { - Vector w(Vector(10)); + Vector temp(10); + Vector w(std::move(temp)); deallog << "move constructor: " << w; } @@ -55,38 +50,5 @@ int main() deallog << "move assignment: " << u; deallog << "old object size: " << v.size() << std::endl; } - - deallog << std::endl; - - { - BlockVector w(BlockVector(5, 2)); - PRINTME("move constructor", w); - } - - deallog << std::endl; - - { - BlockVector u(5, 2); - for (unsigned int i = 0; i < 5; ++i) - for (unsigned int j = 0; j < 2; ++j) - u.block(i)[j] = (double)(10 * i + j); - - PRINTME("BlockVector", u); - - BlockVector v; - v = u; - PRINTME("copy assignemnt", v); - PRINTME("old object", u); - - v = std::move(u); - PRINTME("move assignemnt", v); - deallog << "old object size: " << u.n_blocks() << std::endl; - - // and swap again with different sizes - u = std::move(v); - PRINTME("move assignemnt", u); - deallog << "old object size: " << v.n_blocks() << std::endl; - } } - diff --git a/tests/lac/vector_move_operations.with_cxx11=on.output b/tests/lac/vector_move_operations.with_cxx11=on.output index 29f001490d..25f8614359 100644 --- a/tests/lac/vector_move_operations.with_cxx11=on.output +++ b/tests/lac/vector_move_operations.with_cxx11=on.output @@ -8,43 +8,3 @@ DEAL::move assignment: 1.00000 2.00000 3.00000 4.00000 5.00000 6.00000 7.00000 8 DEAL::old object size: 0 DEAL::move assignment: 1.00000 2.00000 3.00000 4.00000 5.00000 6.00000 7.00000 8.00000 9.00000 10.0000 DEAL::old object size: 0 -DEAL:: -DEAL::Block vector: move constructor: -DEAL::[block 0 ] 0.00000 0.00000 -DEAL::[block 1 ] 0.00000 0.00000 -DEAL::[block 2 ] 0.00000 0.00000 -DEAL::[block 3 ] 0.00000 0.00000 -DEAL::[block 4 ] 0.00000 0.00000 -DEAL:: -DEAL::Block vector: BlockVector: -DEAL::[block 0 ] 0.00000 1.00000 -DEAL::[block 1 ] 10.0000 11.0000 -DEAL::[block 2 ] 20.0000 21.0000 -DEAL::[block 3 ] 30.0000 31.0000 -DEAL::[block 4 ] 40.0000 41.0000 -DEAL::Block vector: copy assignemnt: -DEAL::[block 0 ] 0.00000 1.00000 -DEAL::[block 1 ] 10.0000 11.0000 -DEAL::[block 2 ] 20.0000 21.0000 -DEAL::[block 3 ] 30.0000 31.0000 -DEAL::[block 4 ] 40.0000 41.0000 -DEAL::Block vector: old object: -DEAL::[block 0 ] 0.00000 1.00000 -DEAL::[block 1 ] 10.0000 11.0000 -DEAL::[block 2 ] 20.0000 21.0000 -DEAL::[block 3 ] 30.0000 31.0000 -DEAL::[block 4 ] 40.0000 41.0000 -DEAL::Block vector: move assignemnt: -DEAL::[block 0 ] 0.00000 1.00000 -DEAL::[block 1 ] 10.0000 11.0000 -DEAL::[block 2 ] 20.0000 21.0000 -DEAL::[block 3 ] 30.0000 31.0000 -DEAL::[block 4 ] 40.0000 41.0000 -DEAL::old object size: 0 -DEAL::Block vector: move assignemnt: -DEAL::[block 0 ] 0.00000 1.00000 -DEAL::[block 1 ] 10.0000 11.0000 -DEAL::[block 2 ] 20.0000 21.0000 -DEAL::[block 3 ] 30.0000 31.0000 -DEAL::[block 4 ] 40.0000 41.0000 -DEAL::old object size: 0 diff --git a/tests/trilinos/vector_move_operations.cc b/tests/trilinos/vector_move_operations.cc index 1558c2d1c5..97e495da86 100644 --- a/tests/trilinos/vector_move_operations.cc +++ b/tests/trilinos/vector_move_operations.cc @@ -45,11 +45,14 @@ int main (int argc, char **argv) IndexSet local_owned(10); local_owned.add_range (0,10); - TrilinosWrappers::MPI::Vector u(local_owned, MPI_COMM_WORLD); - for (unsigned int i = 0; i < u.size(); ++i) - u[i] = (double)(i+1); + TrilinosWrappers::MPI::Vector temp(local_owned, MPI_COMM_WORLD); + for (unsigned int i = 0; i < temp.size(); ++i) + temp[i] = (double)(i+1); - PRINTME("Vector", u); + PRINTME("Vector", temp); + + TrilinosWrappers::MPI::Vector u(std::move(temp)); + PRINTME("move constructor", u); TrilinosWrappers::MPI::Vector v; v = u; @@ -72,12 +75,15 @@ int main (int argc, char **argv) index.add_range(0,2); } - TrilinosWrappers::MPI::BlockVector u(local_owned, MPI_COMM_WORLD); + TrilinosWrappers::MPI::BlockVector temp(local_owned, MPI_COMM_WORLD); for (unsigned int i = 0; i < 5; ++i) for (unsigned int j = 0; j < 2; ++j) - u.block(i)[j] = (double)(10 * i + j); + temp.block(i)[j] = (double)(10 * i + j); + + PRINTBLOCK("BlockVector", temp); - PRINTBLOCK("BlockVector", u); + TrilinosWrappers::MPI::BlockVector u(std::move(temp)); + PRINTME("move constructor", u); TrilinosWrappers::MPI::BlockVector v; v = u; diff --git a/tests/trilinos/vector_move_operations.with_cxx11=on.output b/tests/trilinos/vector_move_operations.with_cxx11=on.output index ab9bb97986..5cee774607 100644 --- a/tests/trilinos/vector_move_operations.with_cxx11=on.output +++ b/tests/trilinos/vector_move_operations.with_cxx11=on.output @@ -1,6 +1,8 @@ DEAL::Vector: Vector: DEAL::1.00000 2.00000 3.00000 4.00000 5.00000 6.00000 7.00000 8.00000 9.00000 10.0000 +DEAL::Vector: move constructor: +DEAL::1.00000 2.00000 3.00000 4.00000 5.00000 6.00000 7.00000 8.00000 9.00000 10.0000 DEAL::Vector: copy assignemnt: DEAL::1.00000 2.00000 3.00000 4.00000 5.00000 6.00000 7.00000 8.00000 9.00000 10.0000 DEAL::Vector: old object: @@ -15,6 +17,12 @@ DEAL::[block 1 ] 10.0000 11.0000 DEAL::[block 2 ] 20.0000 21.0000 DEAL::[block 3 ] 30.0000 31.0000 DEAL::[block 4 ] 40.0000 41.0000 +DEAL::Block vector: move constructor: +DEAL::[block 0 ] 0.00000 1.00000 +DEAL::[block 1 ] 10.0000 11.0000 +DEAL::[block 2 ] 20.0000 21.0000 +DEAL::[block 3 ] 30.0000 31.0000 +DEAL::[block 4 ] 40.0000 41.0000 DEAL::Block vector: copy assignemnt: DEAL::[block 0 ] 0.00000 1.00000 DEAL::[block 1 ] 10.0000 11.0000