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 + -
显示快捷键?