test_list_ops.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 277 行
CPP
277 行
/* Boost.MultiIndex test for standard list operations. * * Copyright 2003-2008 Joaquin M Lopez Munoz. * 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) * * See http://www.boost.org/libs/multi_index for library home page. */#include "test_list_ops.hpp"#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */#include <algorithm>#include <vector>#include "pre_multi_index.hpp"#include <boost/multi_index_container.hpp>#include <boost/multi_index/identity.hpp>#include <boost/multi_index/ordered_index.hpp>#include <boost/multi_index/sequenced_index.hpp>#include <boost/multi_index/random_access_index.hpp>#include <boost/test/test_tools.hpp>using namespace boost::multi_index;#undef _#define _ ,#undef CHECK_EQUAL#define CHECK_EQUAL(p,check_range) \{\ int v[]=check_range;\ std::size_t size_v=sizeof(v)/sizeof(int);\ BOOST_CHECK(std::size_t(std::distance((p).begin(),(p).end()))==size_v);\ BOOST_CHECK(std::equal((p).begin(),(p).end(),&v[0]));\}#undef CHECK_VOID_RANGE#define CHECK_VOID_RANGE(p) BOOST_CHECK((p).first==(p).second)struct is_even{ bool operator()(int x)const{return x%2==0;}};template <int m>struct same_integral_div{ bool operator()(int x,int y)const{return (x/m)==(y/m);}};template <typename Container,typename Compare>bool is_sorted( const Container& c,const Compare& comp=Compare()){ if(c.empty())return true; typedef typename Container::const_iterator const_iterator; for(const_iterator it(c.begin());;){ const_iterator it2=it; ++it2; if(it2==c.end())return true; if(comp(*it2,*it))return false; it=it2; }}#if BOOST_WORKAROUND(__MWERKS__,<=0x3003)/* The "ISO C++ Template Parser" option makes CW8.3 incorrectly fail at * expressions of the form sizeof(x) where x is an array local to a * template function. */#pragma parse_func_templ off#endiftemplate<typename Sequence>static void test_list_ops_unique_seq(BOOST_EXPLICIT_TEMPLATE_TYPE(Sequence)){ typedef typename nth_index<Sequence,1>::type sequenced_index; Sequence ss,ss2; sequenced_index &si=get<1>(ss),&si2=get<1>(ss2); si.push_front(0); /* 0 */ si.push_front(4); /* 40 */ ss.insert(2); /* 402 */ ss.insert(5); /* 4025 */ si.push_front(3); /* 34025 */ si.push_back(6); /* 340256 */ si.push_back(1); /* 3402561 */ si.insert(project<1>(ss,ss.find(2)),8); /* 34082561 */ si2=si; CHECK_EQUAL(si,{3 _ 4 _ 0 _ 8 _ 2 _ 5 _ 6 _ 1}); si.remove(8); CHECK_EQUAL(si,{3 _ 4 _ 0 _ 2 _ 5 _ 6 _ 1}); si.remove_if(is_even()); CHECK_EQUAL(si,{3 _ 5 _ 1}); si.splice(si.end(),si2); CHECK_EQUAL(si,{3 _ 5 _ 1 _ 4 _ 0 _ 8 _ 2 _ 6}); CHECK_EQUAL(si2,{3 _ 5 _ 1}); si.splice(project<1>(ss,ss.find(4)),si,project<1>(ss,ss.find(8))); CHECK_EQUAL(si,{3 _ 5 _ 1 _ 8 _ 4 _ 0 _ 2 _ 6}); si2.clear(); si2.splice(si2.begin(),si,si.begin()); si.splice(si.end(),si2,si2.begin()); CHECK_EQUAL(si,{5 _ 1 _ 8 _ 4 _ 0 _ 2 _ 6 _ 3}); BOOST_CHECK(si2.empty()); si2.splice(si2.end(),si,project<1>(ss,ss.find(0)),project<1>(ss,ss.find(6))); CHECK_EQUAL(si,{5 _ 1 _ 8 _ 4 _ 6 _ 3}); CHECK_EQUAL(si2,{0 _ 2}); si.splice(si.begin(),si,si.begin(),si.begin()); CHECK_EQUAL(si,{5 _ 1 _ 8 _ 4 _ 6 _ 3}); si.splice(project<1>(ss,ss.find(8)),si,project<1>(ss,ss.find(4)),si.end()); CHECK_EQUAL(si,{5 _ 1 _ 4 _ 6 _ 3 _ 8}); si.sort(); si2.sort(); BOOST_CHECK(is_sorted(si,std::less<int>())); BOOST_CHECK(is_sorted(si2,std::less<int>())); si.merge(si2); BOOST_CHECK(is_sorted(si,std::less<int>())); BOOST_CHECK(si2.empty()); { Sequence ss3(ss); sequenced_index &si3=get<1>(ss3); si3.sort(std::greater<int>()); si.reverse(); BOOST_CHECK(si==si3); } si2.splice(si2.end(),si,project<1>(ss,ss.find(6)),project<1>(ss,ss.find(3))); CHECK_EQUAL(si2,{6 _ 5 _ 4}); si.merge(si2,std::greater<int>()); BOOST_CHECK(is_sorted(si,std::greater<int>())); BOOST_CHECK(si2.empty());}template<typename Sequence>static void test_list_ops_non_unique_seq( BOOST_EXPLICIT_TEMPLATE_TYPE(Sequence)){ typedef typename Sequence::iterator iterator; Sequence ss; for(int i=0;i<10;++i){ ss.push_back(i); ss.push_back(i); ss.push_front(i); ss.push_front(i); } /* 9988776655443322110000112233445566778899 */ ss.unique(); CHECK_EQUAL( ss, {9 _ 8 _ 7 _ 6 _ 5 _ 4 _ 3 _ 2 _ 1 _ 0 _ 1 _ 2 _ 3 _ 4 _ 5 _ 6 _ 7 _ 8 _ 9}); iterator it=ss.begin(); for(int j=0;j<9;++j,++it){} /* it points to o */ Sequence ss2; ss2.splice(ss2.end(),ss,ss.begin(),it); ss2.reverse(); ss.merge(ss2); CHECK_EQUAL( ss, {0 _ 1 _ 1 _ 2 _ 2 _ 3 _ 3 _ 4 _ 4 _ 5 _ 5 _ 6 _ 6 _ 7 _ 7 _ 8 _ 8 _ 9 _ 9}); ss.unique(same_integral_div<3>()); CHECK_EQUAL(ss,{0 _ 3 _ 6 _ 9}); ss.unique(same_integral_div<1>()); CHECK_EQUAL(ss,{0 _ 3 _ 6 _ 9}); /* testcases for bugs reported at * http://lists.boost.org/boost-users/2006/09/22604.php */ { Sequence ss,ss2; ss.push_back(0); ss2.push_back(0); ss.splice(ss.end(),ss2,ss2.begin()); CHECK_EQUAL(ss,{0 _ 0}); BOOST_CHECK(ss2.empty()); ss.clear(); ss2.clear(); ss.push_back(0); ss2.push_back(0); ss.splice(ss.end(),ss2,ss2.begin(),ss2.end()); CHECK_EQUAL(ss,{0 _ 0}); BOOST_CHECK(ss2.empty()); ss.clear(); ss2.clear(); ss.push_back(0); ss2.push_back(0); ss.merge(ss2); CHECK_EQUAL(ss,{0 _ 0}); BOOST_CHECK(ss2.empty()); typedef typename Sequence::value_type value_type; ss.clear(); ss2.clear(); ss.push_back(0); ss2.push_back(0); ss.merge(ss2,std::less<value_type>()); CHECK_EQUAL(ss,{0 _ 0}); BOOST_CHECK(ss2.empty()); }}#if BOOST_WORKAROUND(__MWERKS__,<=0x3003)#pragma parse_func_templ reset#endifvoid test_list_ops(){ typedef multi_index_container< int, indexed_by< ordered_unique<identity<int> >, sequenced<> > > sequenced_set; /* MSVC++ 6.0 chokes on test_list_ops_unique_seq without this * explicit instantiation */ sequenced_set ss; test_list_ops_unique_seq<sequenced_set>(); typedef multi_index_container< int, indexed_by< ordered_unique<identity<int> >, random_access<> > > random_access_set; random_access_set rs; test_list_ops_unique_seq<random_access_set>(); typedef multi_index_container< int, indexed_by<sequenced<> > > int_list; int_list il; test_list_ops_non_unique_seq<int_list>(); typedef multi_index_container< int, indexed_by<random_access<> > > int_vector; int_vector iv; test_list_ops_non_unique_seq<int_vector>();}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?