test_iterators.cpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. /* Boost.MultiIndex test for iterators.
  2. *
  3. * Copyright 2003-2013 Joaquin M Lopez Munoz.
  4. * Distributed under the Boost Software License, Version 1.0.
  5. * (See accompanying file LICENSE_1_0.txt or copy at
  6. * http://www.boost.org/LICENSE_1_0.txt)
  7. *
  8. * See http://www.boost.org/libs/multi_index for library home page.
  9. */
  10. #include "test_iterators.hpp"
  11. #include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
  12. #include "pre_multi_index.hpp"
  13. #include "employee.hpp"
  14. #include <boost/detail/lightweight_test.hpp>
  15. #include <boost/next_prior.hpp>
  16. using namespace boost::multi_index;
  17. template<typename Index>
  18. void test_non_const_iterators(Index& i,int target)
  19. {
  20. typedef typename Index::iterator iterator;
  21. typedef typename Index::reverse_iterator reverse_iterator;
  22. int n=0;
  23. for(iterator it=i.begin();it!=i.end();++it){
  24. BOOST_TEST(i.iterator_to(*it)==it);
  25. n+=it->id;
  26. }
  27. int m=0;
  28. for(reverse_iterator rit=i.rbegin();rit!=i.rend();++rit){
  29. m+=rit->id;
  30. }
  31. int p=0;
  32. for(iterator it2=i.end();it2!=i.begin();){
  33. --it2;
  34. p+=it2->id;
  35. }
  36. int q=0;
  37. for(reverse_iterator rit2=i.rend();rit2!=i.rbegin();){
  38. --rit2;
  39. q+=rit2->id;
  40. }
  41. BOOST_TEST(n==target&&n==m&&n==p&&n==q);
  42. }
  43. template<typename Index>
  44. void test_const_iterators(const Index& i,int target)
  45. {
  46. typedef typename Index::const_iterator const_iterator;
  47. typedef typename Index::const_reverse_iterator const_reverse_iterator;
  48. BOOST_TEST(i.cbegin()==i.begin());
  49. BOOST_TEST(i.cend()==i.end());
  50. BOOST_TEST(i.crbegin()==i.rbegin());
  51. BOOST_TEST(i.crend()==i.rend());
  52. int n=0;
  53. for(const_iterator it=i.begin();it!=i.end();++it){
  54. BOOST_TEST(i.iterator_to(*it)==it);
  55. n+=it->id;
  56. }
  57. int m=0;
  58. for(const_reverse_iterator rit=i.rbegin();rit!=i.rend();++rit){
  59. m+=rit->id;
  60. }
  61. int p=0;
  62. for(const_iterator it2=i.end();it2!=i.begin();){
  63. --it2;
  64. p+=it2->id;
  65. }
  66. int q=0;
  67. for(const_reverse_iterator rit2=i.rend();rit2!=i.rbegin();){
  68. --rit2;
  69. q+=rit2->id;
  70. }
  71. BOOST_TEST(n==target&&n==m&&n==p&&n==q);
  72. }
  73. template<typename Index>
  74. void test_non_const_hashed_iterators(Index& i,int target)
  75. {
  76. typedef typename Index::iterator iterator;
  77. typedef typename Index::local_iterator local_iterator;
  78. typedef typename Index::size_type size_type;
  79. int n=0;
  80. for(iterator it=i.begin();it!=i.end();++it){
  81. BOOST_TEST(i.iterator_to(*it)==it);
  82. n+=it->id;
  83. }
  84. int m=0;
  85. for(size_type buc=0;buc<i.bucket_count();++buc){
  86. for(local_iterator it=i.begin(buc);it!=i.end(buc);++it){
  87. BOOST_TEST(i.local_iterator_to(*it)==it);
  88. m+=it->id;
  89. }
  90. }
  91. BOOST_TEST(n==target&&n==m);
  92. }
  93. template<typename Index>
  94. void test_const_hashed_iterators(const Index& i,int target)
  95. {
  96. typedef typename Index::const_iterator const_iterator;
  97. typedef typename Index::const_local_iterator const_local_iterator;
  98. typedef typename Index::size_type size_type;
  99. BOOST_TEST(i.cbegin()==i.begin());
  100. BOOST_TEST(i.cend()==i.end());
  101. int n=0;
  102. for(const_iterator it=i.begin();it!=i.end();++it){
  103. BOOST_TEST(i.iterator_to(*it)==it);
  104. n+=it->id;
  105. }
  106. int m=0;
  107. for(size_type buc=0;buc<i.bucket_count();++buc){
  108. BOOST_TEST(i.cbegin(buc)==i.begin(buc));
  109. BOOST_TEST(i.cend(buc)==i.end(buc));
  110. for(const_local_iterator it=i.begin(buc);it!=i.end(buc);++it){
  111. BOOST_TEST(i.local_iterator_to(*it)==it);
  112. m+=it->id;
  113. }
  114. }
  115. BOOST_TEST(n==target&&n==m);
  116. }
  117. template<typename Index>
  118. void test_non_const_rnd_iterators(Index& i,int target)
  119. {
  120. typedef typename Index::iterator iterator;
  121. typedef typename Index::reverse_iterator reverse_iterator;
  122. typedef typename Index::difference_type difference_type;
  123. iterator middle=i.begin()+(i.end()-i.begin())/2;
  124. difference_type off=middle-i.begin();
  125. reverse_iterator rmiddle=i.rbegin()+off;
  126. bool odd=((i.end()-i.begin())%2)!=0;
  127. int n=0;
  128. for(iterator it=i.begin();it!=middle;++it){
  129. BOOST_TEST(i.iterator_to(*it)==it);
  130. n+=it->id;
  131. n+=it[off].id;
  132. }
  133. if(odd)n+=(boost::prior(i.end()))->id;
  134. int m=0;
  135. for(reverse_iterator rit=i.rbegin();rit!=rmiddle;++rit){
  136. m+=rit->id;
  137. m+=(rit+off)->id;
  138. }
  139. if(odd)m+=(boost::prior(i.rend()))->id;
  140. int p=0;
  141. for(iterator it2=i.end();it2!=middle;){
  142. --it2;
  143. p+=it2->id;
  144. p+=(it2-off)->id;
  145. }
  146. if(odd)p-=middle->id;
  147. int q=0;
  148. for(reverse_iterator rit2=i.rend();rit2!=rmiddle;){
  149. --rit2;
  150. q+=rit2->id;
  151. q+=(rit2-off)->id;
  152. }
  153. if(odd)q-=rmiddle->id;
  154. BOOST_TEST(n==target&&n==m&&n==p&&n==q);
  155. }
  156. template<typename Index>
  157. void test_const_rnd_iterators(const Index& i,int target)
  158. {
  159. typedef typename Index::const_iterator const_iterator;
  160. typedef typename Index::const_reverse_iterator const_reverse_iterator;
  161. typedef typename Index::difference_type difference_type;
  162. BOOST_TEST(i.cbegin()==i.begin());
  163. BOOST_TEST(i.cend()==i.end());
  164. BOOST_TEST(i.crbegin()==i.rbegin());
  165. BOOST_TEST(i.crend()==i.rend());
  166. const_iterator middle=i.begin()+(i.end()-i.begin())/2;
  167. difference_type off=middle-i.begin();
  168. const_reverse_iterator rmiddle=i.rbegin()+off;
  169. bool odd=((i.end()-i.begin())%2)!=0;
  170. int n=0;
  171. for(const_iterator it=i.begin();it!=middle;++it){
  172. BOOST_TEST(i.iterator_to(*it)==it);
  173. n+=it->id;
  174. n+=it[off].id;
  175. }
  176. if(odd)n+=(boost::prior(i.end()))->id;
  177. int m=0;
  178. for(const_reverse_iterator rit=i.rbegin();rit!=rmiddle;++rit){
  179. m+=rit->id;
  180. m+=(rit+off)->id;
  181. }
  182. if(odd)m+=(boost::prior(i.rend()))->id;
  183. int p=0;
  184. for(const_iterator it2=i.end();it2!=middle;){
  185. --it2;
  186. p+=it2->id;
  187. p+=(it2-off)->id;
  188. }
  189. if(odd)p-=middle->id;
  190. int q=0;
  191. for(const_reverse_iterator rit2=i.rend();rit2!=rmiddle;){
  192. --rit2;
  193. q+=rit2->id;
  194. q+=(rit2-off)->id;
  195. }
  196. if(odd)q-=rmiddle->id;
  197. BOOST_TEST(n==target&&n==m&&n==p&&n==q);
  198. }
  199. void test_iterators()
  200. {
  201. employee_set es;
  202. es.insert(employee(0,"Joe",31,1123));
  203. es.insert(employee(1,"Robert",27,5601));
  204. es.insert(employee(2,"John",40,7889));
  205. es.insert(employee(3,"Albert",20,9012));
  206. es.insert(employee(4,"John",57,1002));
  207. int target=0+1+2+3+4;
  208. test_non_const_iterators (es,target);
  209. test_const_iterators (es,target);
  210. test_non_const_hashed_iterators(get<1>(es),target);
  211. test_const_hashed_iterators (get<1>(es),target);
  212. test_non_const_iterators (get<2>(es),target);
  213. test_const_iterators (get<2>(es),target);
  214. test_non_const_iterators (get<3>(es),target);
  215. test_const_iterators (get<3>(es),target);
  216. test_non_const_hashed_iterators(get<4>(es),target);
  217. test_const_hashed_iterators (get<4>(es),target);
  218. test_non_const_rnd_iterators (get<5>(es),target);
  219. test_const_rnd_iterators (get<5>(es),target);
  220. }