iterators.cpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. // Copyright 2002 The Trustees of Indiana University.
  2. // Use, modification and distribution is subject to the Boost Software
  3. // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  4. // http://www.boost.org/LICENSE_1_0.txt)
  5. // Boost.MultiArray Library
  6. // Authors: Ronald Garcia
  7. // Jeremy Siek
  8. // Andrew Lumsdaine
  9. // See http://www.boost.org/libs/multi_array for documentation.
  10. //
  11. // iterators.cpp - checking out iterator stuffs.
  12. // The tests assume that the array has shape 2x3x4
  13. //
  14. #define MULTIARRAY_TEST_ASSIGN
  15. #include "generative_tests.hpp"
  16. #include <boost/concept_check.hpp> // for ignore_unused_variable_warning
  17. #include <boost/mpl/if.hpp>
  18. #include <boost/type_traits/is_same.hpp>
  19. // iterator-test-specific code
  20. template <typename Array>
  21. void assign_if_not_const(Array& A, const mutable_array_tag&) {
  22. typedef typename Array::iterator iterator3;
  23. typedef typename Array::template subarray<2>::type::iterator iterator2;
  24. typedef typename Array::template subarray<1>::type::iterator iterator1;
  25. int num = 0;
  26. for (iterator3 i = A.begin(); i != A.end(); ++i)
  27. for(iterator2 ii = (*i).begin(); ii != (*i).end(); ++ii)
  28. for(iterator1 iii = (*ii).begin(); iii != (*ii).end(); ++iii)
  29. *iii = num++;
  30. }
  31. template <typename Array>
  32. struct ittraits_const {
  33. typedef typename Array::const_iterator iterator3;
  34. typedef typename boost::subarray_gen<Array,2>::type::const_iterator
  35. iterator2;
  36. typedef typename boost::subarray_gen<Array,1>::type::const_iterator
  37. iterator1;
  38. typedef typename Array::const_reverse_iterator riterator3;
  39. typedef typename boost::subarray_gen<Array,2>::type::const_reverse_iterator
  40. riterator2;
  41. typedef typename boost::subarray_gen<Array,1>::type::const_reverse_iterator
  42. riterator1;
  43. };
  44. template <typename Array>
  45. struct ittraits_mutable {
  46. typedef typename Array::iterator iterator3;
  47. typedef typename boost::subarray_gen<Array,2>::type::iterator iterator2;
  48. typedef typename boost::subarray_gen<Array,1>::type::iterator iterator1;
  49. typedef typename Array::reverse_iterator riterator3;
  50. typedef typename boost::subarray_gen<Array,2>::type::reverse_iterator
  51. riterator2;
  52. typedef typename boost::subarray_gen<Array,1>::type::reverse_iterator
  53. riterator1;
  54. };
  55. // Meta-program chooses ittraits implementation.
  56. template <typename Array, typename ConstTag>
  57. struct ittraits_generator :
  58. boost::mpl::if_< boost::is_same<ConstTag,const_array_tag>,
  59. ittraits_const<Array>,
  60. ittraits_mutable<Array> >
  61. {};
  62. template <typename Array>
  63. void construct_iterators(Array&) {
  64. // Default constructed iterators and
  65. // const iterators constructed from iterators.
  66. {
  67. typename Array::iterator i1;
  68. typename Array::const_iterator ci1;
  69. typename Array::reverse_iterator r1;
  70. typename Array::const_reverse_iterator cr1;
  71. #if 0 // RG - MSVC fails to compile these
  72. typename Array::const_iterator ci2 =
  73. typename Array::iterator();
  74. typename Array::const_reverse_iterator cr2 =
  75. typename Array::reverse_iterator();
  76. #endif
  77. typename Array::const_iterator ci2 = i1;
  78. typename Array::const_reverse_iterator cr2 = cr1;
  79. boost::ignore_unused_variable_warning(cr2);
  80. }
  81. }
  82. template <typename Array, typename IterTraits>
  83. void test_iterators(Array& A, const IterTraits&) {
  84. // Iterator comparison and arithmetic
  85. {
  86. typedef typename IterTraits::iterator3 iterator;
  87. iterator i1 = A.begin();
  88. iterator i2 = A.end();
  89. BOOST_TEST(i1 < i2);
  90. BOOST_TEST((i2 - i1) == typename iterator::difference_type(2));
  91. }
  92. // Standard Array Iteration
  93. {
  94. typedef typename IterTraits::iterator3 iterator3;
  95. typedef typename IterTraits::iterator2 iterator2;
  96. typedef typename IterTraits::iterator1 iterator1;
  97. int vals = 0;
  98. for (iterator3 i = A.begin(); i != A.end(); ++i)
  99. for(iterator2 ii = (*i).begin(); ii != (*i).end(); ++ii)
  100. for(iterator1 iii = (*ii).begin(); iii != (*ii).end(); ++iii)
  101. BOOST_TEST(*iii == vals++);
  102. }
  103. // Using operator->() on iterators
  104. {
  105. typedef typename IterTraits::iterator3 iterator3;
  106. typedef typename IterTraits::iterator2 iterator2;
  107. typedef typename IterTraits::iterator1 iterator1;
  108. int vals = 0;
  109. for (iterator3 i = A.begin(); i != A.end(); ++i)
  110. for(iterator2 ii = i->begin(); ii != i->end(); ++ii)
  111. for(iterator1 iii = ii->begin(); iii != ii->end(); ++iii)
  112. BOOST_TEST(*iii == vals++);
  113. }
  114. // Reverse Iterator Hierarchy Test
  115. {
  116. typedef typename IterTraits::riterator3 riterator3;
  117. typedef typename IterTraits::riterator2 riterator2;
  118. typedef typename IterTraits::riterator1 riterator1;
  119. int check_iter_val = A.num_elements()-1;
  120. for (riterator3 i = A.rbegin(); i != (riterator3)A.rend(); ++i)
  121. for(riterator2 ii = (*i).rbegin(); ii != (riterator2)(*i).rend(); ++ii)
  122. for(riterator1 iii = (*ii).rbegin(); iii != (riterator1)(*ii).rend();
  123. ++iii)
  124. BOOST_TEST(*iii == check_iter_val--);
  125. }
  126. ++tests_run;
  127. }
  128. template <typename Array>
  129. void access(Array& A, const mutable_array_tag&) {
  130. assign(A);
  131. construct_iterators(A);
  132. typedef typename ittraits_generator<Array,mutable_array_tag>::type
  133. m_iter_traits;
  134. typedef typename ittraits_generator<Array,const_array_tag>::type
  135. c_iter_traits;
  136. test_iterators(A,m_iter_traits());
  137. test_iterators(A,c_iter_traits());
  138. const Array& CA = A;
  139. test_iterators(CA,c_iter_traits());
  140. }
  141. template <typename Array>
  142. void access(Array& A, const const_array_tag&) {
  143. construct_iterators(A);
  144. typedef typename ittraits_generator<Array,const_array_tag>::type
  145. c_iter_traits;
  146. test_iterators(A,c_iter_traits());
  147. }
  148. int
  149. main()
  150. {
  151. return run_generative_tests();
  152. }