123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250 |
- /* Boost.MultiIndex test for iterators.
- *
- * Copyright 2003-2013 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_iterators.hpp"
- #include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
- #include "pre_multi_index.hpp"
- #include "employee.hpp"
- #include <boost/detail/lightweight_test.hpp>
- #include <boost/next_prior.hpp>
- using namespace boost::multi_index;
- template<typename Index>
- void test_non_const_iterators(Index& i,int target)
- {
- typedef typename Index::iterator iterator;
- typedef typename Index::reverse_iterator reverse_iterator;
- int n=0;
- for(iterator it=i.begin();it!=i.end();++it){
- BOOST_TEST(i.iterator_to(*it)==it);
- n+=it->id;
- }
- int m=0;
- for(reverse_iterator rit=i.rbegin();rit!=i.rend();++rit){
- m+=rit->id;
- }
- int p=0;
- for(iterator it2=i.end();it2!=i.begin();){
- --it2;
- p+=it2->id;
- }
- int q=0;
- for(reverse_iterator rit2=i.rend();rit2!=i.rbegin();){
- --rit2;
- q+=rit2->id;
- }
- BOOST_TEST(n==target&&n==m&&n==p&&n==q);
- }
- template<typename Index>
- void test_const_iterators(const Index& i,int target)
- {
- typedef typename Index::const_iterator const_iterator;
- typedef typename Index::const_reverse_iterator const_reverse_iterator;
- BOOST_TEST(i.cbegin()==i.begin());
- BOOST_TEST(i.cend()==i.end());
- BOOST_TEST(i.crbegin()==i.rbegin());
- BOOST_TEST(i.crend()==i.rend());
- int n=0;
- for(const_iterator it=i.begin();it!=i.end();++it){
- BOOST_TEST(i.iterator_to(*it)==it);
- n+=it->id;
- }
- int m=0;
- for(const_reverse_iterator rit=i.rbegin();rit!=i.rend();++rit){
- m+=rit->id;
- }
- int p=0;
- for(const_iterator it2=i.end();it2!=i.begin();){
- --it2;
- p+=it2->id;
- }
- int q=0;
- for(const_reverse_iterator rit2=i.rend();rit2!=i.rbegin();){
- --rit2;
- q+=rit2->id;
- }
- BOOST_TEST(n==target&&n==m&&n==p&&n==q);
- }
- template<typename Index>
- void test_non_const_hashed_iterators(Index& i,int target)
- {
- typedef typename Index::iterator iterator;
- typedef typename Index::local_iterator local_iterator;
- typedef typename Index::size_type size_type;
- int n=0;
- for(iterator it=i.begin();it!=i.end();++it){
- BOOST_TEST(i.iterator_to(*it)==it);
- n+=it->id;
- }
- int m=0;
- for(size_type buc=0;buc<i.bucket_count();++buc){
- for(local_iterator it=i.begin(buc);it!=i.end(buc);++it){
- BOOST_TEST(i.local_iterator_to(*it)==it);
- m+=it->id;
- }
- }
- BOOST_TEST(n==target&&n==m);
- }
- template<typename Index>
- void test_const_hashed_iterators(const Index& i,int target)
- {
- typedef typename Index::const_iterator const_iterator;
- typedef typename Index::const_local_iterator const_local_iterator;
- typedef typename Index::size_type size_type;
- BOOST_TEST(i.cbegin()==i.begin());
- BOOST_TEST(i.cend()==i.end());
- int n=0;
- for(const_iterator it=i.begin();it!=i.end();++it){
- BOOST_TEST(i.iterator_to(*it)==it);
- n+=it->id;
- }
- int m=0;
- for(size_type buc=0;buc<i.bucket_count();++buc){
- BOOST_TEST(i.cbegin(buc)==i.begin(buc));
- BOOST_TEST(i.cend(buc)==i.end(buc));
- for(const_local_iterator it=i.begin(buc);it!=i.end(buc);++it){
- BOOST_TEST(i.local_iterator_to(*it)==it);
- m+=it->id;
- }
- }
- BOOST_TEST(n==target&&n==m);
- }
- template<typename Index>
- void test_non_const_rnd_iterators(Index& i,int target)
- {
- typedef typename Index::iterator iterator;
- typedef typename Index::reverse_iterator reverse_iterator;
- typedef typename Index::difference_type difference_type;
- iterator middle=i.begin()+(i.end()-i.begin())/2;
- difference_type off=middle-i.begin();
- reverse_iterator rmiddle=i.rbegin()+off;
- bool odd=((i.end()-i.begin())%2)!=0;
- int n=0;
- for(iterator it=i.begin();it!=middle;++it){
- BOOST_TEST(i.iterator_to(*it)==it);
- n+=it->id;
- n+=it[off].id;
- }
- if(odd)n+=(boost::prior(i.end()))->id;
- int m=0;
- for(reverse_iterator rit=i.rbegin();rit!=rmiddle;++rit){
- m+=rit->id;
- m+=(rit+off)->id;
- }
- if(odd)m+=(boost::prior(i.rend()))->id;
- int p=0;
- for(iterator it2=i.end();it2!=middle;){
- --it2;
- p+=it2->id;
- p+=(it2-off)->id;
- }
- if(odd)p-=middle->id;
- int q=0;
- for(reverse_iterator rit2=i.rend();rit2!=rmiddle;){
- --rit2;
- q+=rit2->id;
- q+=(rit2-off)->id;
- }
- if(odd)q-=rmiddle->id;
- BOOST_TEST(n==target&&n==m&&n==p&&n==q);
- }
- template<typename Index>
- void test_const_rnd_iterators(const Index& i,int target)
- {
- typedef typename Index::const_iterator const_iterator;
- typedef typename Index::const_reverse_iterator const_reverse_iterator;
- typedef typename Index::difference_type difference_type;
- BOOST_TEST(i.cbegin()==i.begin());
- BOOST_TEST(i.cend()==i.end());
- BOOST_TEST(i.crbegin()==i.rbegin());
- BOOST_TEST(i.crend()==i.rend());
- const_iterator middle=i.begin()+(i.end()-i.begin())/2;
- difference_type off=middle-i.begin();
- const_reverse_iterator rmiddle=i.rbegin()+off;
- bool odd=((i.end()-i.begin())%2)!=0;
- int n=0;
- for(const_iterator it=i.begin();it!=middle;++it){
- BOOST_TEST(i.iterator_to(*it)==it);
- n+=it->id;
- n+=it[off].id;
- }
- if(odd)n+=(boost::prior(i.end()))->id;
- int m=0;
- for(const_reverse_iterator rit=i.rbegin();rit!=rmiddle;++rit){
- m+=rit->id;
- m+=(rit+off)->id;
- }
- if(odd)m+=(boost::prior(i.rend()))->id;
- int p=0;
- for(const_iterator it2=i.end();it2!=middle;){
- --it2;
- p+=it2->id;
- p+=(it2-off)->id;
- }
- if(odd)p-=middle->id;
- int q=0;
- for(const_reverse_iterator rit2=i.rend();rit2!=rmiddle;){
- --rit2;
- q+=rit2->id;
- q+=(rit2-off)->id;
- }
- if(odd)q-=rmiddle->id;
- BOOST_TEST(n==target&&n==m&&n==p&&n==q);
- }
- void test_iterators()
- {
- employee_set es;
- es.insert(employee(0,"Joe",31,1123));
- es.insert(employee(1,"Robert",27,5601));
- es.insert(employee(2,"John",40,7889));
- es.insert(employee(3,"Albert",20,9012));
- es.insert(employee(4,"John",57,1002));
- int target=0+1+2+3+4;
- test_non_const_iterators (es,target);
- test_const_iterators (es,target);
- test_non_const_hashed_iterators(get<1>(es),target);
- test_const_hashed_iterators (get<1>(es),target);
- test_non_const_iterators (get<2>(es),target);
- test_const_iterators (get<2>(es),target);
- test_non_const_iterators (get<3>(es),target);
- test_const_iterators (get<3>(es),target);
- test_non_const_hashed_iterators(get<4>(es),target);
- test_const_hashed_iterators (get<4>(es),target);
- test_non_const_rnd_iterators (get<5>(es),target);
- test_const_rnd_iterators (get<5>(es),target);
- }
|