swap & deep_swap

There are two possible interpretation of “swapping two arrays”: either use 3 moves like std::swap, i.e. swapping the pointer to the data in memory, or making a deep swap, i.e. really swapping all the elements in memeory.

swap

  • swap just exchange the (shared) pointer to the data in memory, it does not affect the data them self. This distinction of importance for views in particular.
  • For the regular type, std::swap and swap are equivalent. For the views, std::swap is explicitely deleted, since it is incorrect due to the lack of move constructor for a view. Use swap instead.
  • Example :
#include <triqs/arrays.hpp>
#include <iostream>
using itertools::range;
using triqs::arrays::vector;
int main() {
  triqs::arrays::vector<double> V(3), W(4);
  V()     = 3;
  W()     = 4; // initialize
  auto VV = V(range(0, 2));
  auto VW = W(range(0, 2));

  std::cout << "V = " << V << " W = " << W << " V view " << VV << " W view " << VW << std::endl;
  swap(V, W);
  std::cout << "V = " << V << " W = " << W << " V view " << VV << " W view " << VW << std::endl;
  swap(VV, VW);
  std::cout << "V = " << V << " W = " << W << " V view " << VV << " W view " << VW << std::endl;
}

deep_swap

Warning

Currently implemented only for triqs::vector and triqs::vector_view.

  • deep_swap swaps the data in memory.
  • Example (compare with swap) :
#include <triqs/arrays.hpp>
#include <iostream>
using itertools::range;
using triqs::arrays::vector;
int main() {
  triqs::arrays::vector<double> V(3), W(3);
  V()     = 3;
  W()     = 5; // initialize
  auto VV = V(range(0, 2));
  auto VW = W(range(0, 2));

  std::cout << "V = " << V << " W = " << W << " V view " << VV << " W view " << VW << std::endl;
  deep_swap(V, W);
  std::cout << "V = " << V << " W = " << W << " V view " << VV << " W view " << VW << std::endl;
  deep_swap(VV, VW);
  std::cout << "V = " << V << " W = " << W << " V view " << VV << " W view " << VW << std::endl;
}