//: C07:Valarray2.cpp {-bor}{-dmc}
// Z knihy "Myslíme v jazyce C++, část 2" od Bruce Eckela a Chucka Allisona.
// (c) 1995-2004 MindView, Inc. Všechna práva vyhrazena.
// Přečtěte si podmínky používání zdrojových kódů umístěné v souboru 
// 'Licence.txt' dodávaném spolu s balíčkem kódu dostupným na www.MindView.net.
// Ukazuje části a masky.
#include "PrintValarray.h"
using namespace std;

int main() {
  int data[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
  valarray<int> v(data, 12);
  valarray<int> r1(v[slice(0, 4, 3)]);
  print("slice(0,4,3)", r1);
  // Podmíněně vytáhnout
  valarray<int> r2(v[v > 6]);
  print("prvky > 6", r2);
  // Umocnění provního sloupce
  v[slice(0, 4, 3)] *= valarray<int>(v[slice(0, 4, 3)]);
  print("po umocnění prvního sloupce", v);
  // Obnoveni
  int idx[] = { 1, 4, 7, 10 };
  valarray<int> save(idx, 4);
  v[slice(0, 4, 3)] = save;
  print("v obnoveno", v);
  // Vytažení 2-d podmnožiny: { { 1, 3, 5 }, { 7, 9, 11 } }
  valarray<size_t> siz(2);
  siz[0] = 2;
  siz[1] = 3;
  valarray<size_t> gap(2);
  gap[0] = 6;
  gap[1] = 2;
  valarray<int> r3(v[gslice(0, siz, gap)]);
  print("2-d část", r3);
  // Vytažení podmnožiny pomocí logické masky (prvků typu bool)
  valarray<bool> mask(false, 5);
  mask[1] = mask[2] = mask[4] = true;
  valarray<int> r4(v[mask]);
  print("v[mask]", r4);
  // Vytažení podmnožiny pomocí indexové masky (prvků typu size_t)
  size_t idx2[] = { 2, 2, 3, 6 };
  valarray<size_t> mask2(idx2, 4);
  valarray<int> r5(v[mask2]);
  print("v[mask2]", r5);
  // Použití indexové masky v přiřazení
  valarray<char> text("nyní už je čas", 14);
  valarray<char> caps("NUJČ", 4);
  valarray<size_t> idx3(4);
  idx3[0] = 0;
  idx3[1] = 5;
  idx3[2] = 8;
  idx3[3] = 11;
  text[idx3] = caps;
  print("velkými písmeny", text);
} ///:~
