zip_iterator_test.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 834 行 · 第 1/2 页

CPP
834
字号
// (C) Copyright Dave Abrahams and Thomas Becker 2003. Distributed// under the Boost Software License, Version 1.0. (See accompanying// file LICENSE_1_0.txt or copy at// http://www.boost.org/LICENSE_1_0.txt)//// File: // =====// zip_iterator_test_main.cpp// Author:// =======// Thomas Becker// Created:// ========// Jul 15, 2003// Purpose:// ========// Test driver for zip_iterator.hpp// Compilers Tested:// =================// Metrowerks Codewarrior Pro 7.2, 8.3// gcc 2.95.3// gcc 3.2// Microsoft VC 6sp5 (test fails due to some compiler bug)// Microsoft VC 7 (works)// Microsoft VC 7.1// Intel 5// Intel 6// Intel 7.1// Intel 8// Borland 5.5.1 (broken due to lack of support from Boost.Tuples)///////////////////////////////////////////////////////////////////////////////// Includes///////////////////////////////////////////////////////////////////////////////#include <boost/iterator/zip_iterator.hpp>#include <boost/iterator/zip_iterator.hpp> // 2nd #include tests #include guard.#include <iostream>#include <vector>#include <list>#include <set>#include <functional>#include <boost/tuple/tuple.hpp>#include <boost/iterator/transform_iterator.hpp>#include <boost/iterator/is_readable_iterator.hpp>#include <boost/type_traits/is_same.hpp>#include <boost/detail/workaround.hpp>#include <stddef.h>template <class It>struct pure_traversal  : boost::detail::pure_traversal_tag<        typename boost::iterator_traversal<It>::type    >{};  ///////////////////////////////////////////////////////////////////////////////// Das Main Funktion///////////////////////////////////////////////////////////////////////////////  int main( void ){  std::cout << "\n"            << "***********************************************\n"            << "*                                             *\n"            << "* Test driver for boost::zip_iterator         *\n"            << "* Copyright Thomas Becker 2003                *\n"            << "*                                             *\n"            << "***********************************************\n\n"            << std::flush;  size_t num_successful_tests = 0;  size_t num_failed_tests = 0;    /////////////////////////////////////////////////////////////////////////////  //  // Zip iterator construction and dereferencing  //  /////////////////////////////////////////////////////////////////////////////    std::cout << "Zip iterator construction and dereferencing: "            << std::flush;    std::vector<double> vect1(3);  vect1[0] = 42.;  vect1[1] = 43.;  vect1[2] = 44.;  std::set<int> intset;  intset.insert(52);  intset.insert(53);  intset.insert(54);  //  typedef  boost::zip_iterator<      boost::tuples::tuple<          std::set<int>::iterator        , std::vector<double>::iterator      >  > zit_mixed;  zit_mixed zip_it_mixed = zit_mixed(    boost::make_tuple(        intset.begin()      , vect1.begin()    )  );  boost::tuples::tuple<int, double> val_tuple(       *zip_it_mixed);    boost::tuples::tuple<const int&, double&> ref_tuple(      *zip_it_mixed);  double dblOldVal = boost::tuples::get<1>(ref_tuple);  boost::tuples::get<1>(ref_tuple) -= 41.;  if( 52 == boost::tuples::get<0>(val_tuple) &&      42. == boost::tuples::get<1>(val_tuple) &&      52 == boost::tuples::get<0>(ref_tuple)  &&      1. == boost::tuples::get<1>(ref_tuple)  &&      1. == *vect1.begin()    )  {    ++num_successful_tests;    std::cout << "OK" << std::endl;  }  else  {    ++num_failed_tests = 0;    std::cout << "not OK" << std::endl;  }  // Undo change to vect1  boost::tuples::get<1>(ref_tuple) = dblOldVal;  /////////////////////////////////////////////////////////////////////////////  //  // Zip iterator with 12 components  //  /////////////////////////////////////////////////////////////////////////////  std::cout << "Zip iterators with 12 components:            "            << std::flush;              // Declare 12 containers  //  std::list<int> li1;  li1.push_back(1);  std::set<int> se1;  se1.insert(2);  std::vector<int> ve1;  ve1.push_back(3);  //  std::list<int> li2;  li2.push_back(4);  std::set<int> se2;  se2.insert(5);  std::vector<int> ve2;  ve2.push_back(6);  //  std::list<int> li3;  li3.push_back(7);  std::set<int> se3;  se3.insert(8);  std::vector<int> ve3;  ve3.push_back(9);  //  std::list<int> li4;  li4.push_back(10);  std::set<int> se4;  se4.insert(11);  std::vector<int> ve4;  ve4.push_back(12);  // typedefs for cons lists of iterators.  typedef boost::tuples::cons<    std::set<int>::iterator,     boost::tuples::tuple<      std::vector<int>::iterator,      std::list<int>::iterator,       std::set<int>::iterator,       std::vector<int>::iterator,      std::list<int>::iterator,       std::set<int>::iterator,       std::vector<int>::iterator,      std::list<int>::iterator,       std::set<int>::iterator,       std::vector<int>::const_iterator      >::inherited    > cons_11_its_type;  //  typedef boost::tuples::cons<    std::list<int>::const_iterator,     cons_11_its_type    > cons_12_its_type;  // typedefs for cons lists for dereferencing the zip iterator  // made from the cons list above.  typedef boost::tuples::cons<    const int&,     boost::tuples::tuple<      int&,      int&,      const int&,      int&,      int&,      const int&,      int&,      int&,      const int&,      const int&      >::inherited    > cons_11_refs_type;  //  typedef boost::tuples::cons<    const int&,     cons_11_refs_type    > cons_12_refs_type;  // typedef for zip iterator with 12 elements  typedef boost::zip_iterator<cons_12_its_type> zip_it_12_type;  // Declare a 12-element zip iterator.  zip_it_12_type zip_it_12(    cons_12_its_type(      li1.begin(),       cons_11_its_type(        se1.begin(),        boost::make_tuple(          ve1.begin(),          li2.begin(),           se2.begin(),           ve2.begin(),          li3.begin(),           se3.begin(),           ve3.begin(),          li4.begin(),           se4.begin(),           ve4.begin()          )        )      )    );  // Dereference, mess with the result a little.  cons_12_refs_type zip_it_12_dereferenced(*zip_it_12);  boost::tuples::get<9>(zip_it_12_dereferenced) = 42;    // Make a copy and move it a little to force some instantiations.  zip_it_12_type zip_it_12_copy(zip_it_12);  ++zip_it_12_copy;  if( boost::tuples::get<11>(zip_it_12.get_iterator_tuple()) == ve4.begin() &&      boost::tuples::get<11>(zip_it_12_copy.get_iterator_tuple()) == ve4.end() &&      1 == boost::tuples::get<0>(zip_it_12_dereferenced) &&      12 == boost::tuples::get<11>(zip_it_12_dereferenced) &&      42 == *(li4.begin())    )  {    ++num_successful_tests;    std::cout << "OK" << std::endl;  }  else  {    ++num_failed_tests = 0;    std::cout << "not OK" << std::endl;  }  /////////////////////////////////////////////////////////////////////////////  //  // Zip iterator incrementing and dereferencing  //  /////////////////////////////////////////////////////////////////////////////  std::cout << "Zip iterator ++ and *:                       "            << std::flush;  std::vector<double> vect2(3);  vect2[0] = 2.2;  vect2[1] = 3.3;  vect2[2] = 4.4;    boost::zip_iterator<    boost::tuples::tuple<      std::vector<double>::const_iterator,       std::vector<double>::const_iterator      >     >  zip_it_begin(    boost::make_tuple(     vect1.begin(),     vect2.begin()     )  );  boost::zip_iterator<    boost::tuples::tuple<      std::vector<double>::const_iterator,       std::vector<double>::const_iterator      >     >  zip_it_run(    boost::make_tuple(     vect1.begin(),     vect2.begin()     )  );  boost::zip_iterator<    boost::tuples::tuple<      std::vector<double>::const_iterator,       std::vector<double>::const_iterator      >     >  zip_it_end(    boost::make_tuple(     vect1.end(),     vect2.end()     )  );  if( zip_it_run == zip_it_begin &&      42. == boost::tuples::get<0>(*zip_it_run) &&      2.2 == boost::tuples::get<1>(*zip_it_run) &&      43. == boost::tuples::get<0>(*(++zip_it_run)) &&      3.3 == boost::tuples::get<1>(*zip_it_run) &&      44. == boost::tuples::get<0>(*(++zip_it_run)) &&      4.4 == boost::tuples::get<1>(*zip_it_run) &&      zip_it_end == ++zip_it_run    )  {    ++num_successful_tests;    std::cout << "OK" << std::endl;  }  else  {    ++num_failed_tests = 0;    std::cout << "not OK" << std::endl;  }  /////////////////////////////////////////////////////////////////////////////  //  // Zip iterator decrementing and dereferencing  //  /////////////////////////////////////////////////////////////////////////////    std::cout << "Zip iterator -- and *:                       "            << std::flush;  if( zip_it_run == zip_it_end &&      zip_it_end == zip_it_run-- &&      44. == boost::tuples::get<0>(*zip_it_run) &&      4.4 == boost::tuples::get<1>(*zip_it_run) &&      43. == boost::tuples::get<0>(*(--zip_it_run)) &&      3.3 == boost::tuples::get<1>(*zip_it_run) &&      42. == boost::tuples::get<0>(*(--zip_it_run)) &&      2.2 == boost::tuples::get<1>(*zip_it_run) &&      zip_it_begin == zip_it_run    )  {    ++num_successful_tests;    std::cout << "OK" << std::endl;  }  else  {    ++num_failed_tests = 0;    std::cout << "not OK" << std::endl;  }  /////////////////////////////////////////////////////////////////////////////  //  // Zip iterator copy construction and equality  //  /////////////////////////////////////////////////////////////////////////////    std::cout << "Zip iterator copy construction and equality: "             << std::flush;  boost::zip_iterator<    boost::tuples::tuple<      std::vector<double>::const_iterator,       std::vector<double>::const_iterator      >    > zip_it_run_copy(zip_it_run);  if(zip_it_run == zip_it_run && zip_it_run == zip_it_run_copy)  {    ++num_successful_tests;    std::cout << "OK" << std::endl;  }  else  {    ++num_failed_tests = 0;    std::cout << "not OK" << std::endl;  }  /////////////////////////////////////////////////////////////////////////////  //  // Zip iterator inequality  //  /////////////////////////////////////////////////////////////////////////////    std::cout << "Zip iterator inequality:                     "            << std::flush;  

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?