any_iterator_interface.hpp 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. // Boost.Range library
  2. //
  3. // Copyright Neil Groves 2010. Use, modification and
  4. // distribution is subject to the Boost Software License, Version
  5. // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt)
  7. //
  8. // For more information, see http://www.boost.org/libs/range/
  9. //
  10. #ifndef BOOST_RANGE_DETAIL_ANY_ITERATOR_INTERFACE_HPP_INCLUDED
  11. #define BOOST_RANGE_DETAIL_ANY_ITERATOR_INTERFACE_HPP_INCLUDED
  12. #include <boost/mpl/if.hpp>
  13. #include <boost/range/detail/any_iterator_buffer.hpp>
  14. #include <boost/iterator/iterator_categories.hpp>
  15. #include <boost/type_traits/is_convertible.hpp>
  16. #include <boost/type_traits/is_reference.hpp>
  17. #include <boost/type_traits/remove_const.hpp>
  18. #include <boost/type_traits/remove_reference.hpp>
  19. namespace boost
  20. {
  21. namespace range_detail
  22. {
  23. template<class T>
  24. struct const_reference_type_generator
  25. {
  26. typedef typename mpl::if_<
  27. typename is_reference<T>::type,
  28. typename add_const<
  29. typename remove_reference<T>::type
  30. >::type&,
  31. T
  32. >::type type;
  33. };
  34. template<class T>
  35. struct reference_as_value_type_generator
  36. {
  37. typedef typename remove_reference<
  38. typename remove_const<T>::type
  39. >::type value_type;
  40. typedef typename mpl::if_<
  41. typename is_convertible<const value_type&, value_type>::type,
  42. value_type,
  43. T
  44. >::type type;
  45. };
  46. template<
  47. class Reference
  48. , class Buffer
  49. >
  50. struct any_incrementable_iterator_interface
  51. {
  52. typedef Reference reference;
  53. typedef typename const_reference_type_generator<
  54. Reference
  55. >::type const_reference;
  56. typedef typename reference_as_value_type_generator<
  57. Reference
  58. >::type reference_as_value_type;
  59. typedef Buffer buffer_type;
  60. virtual ~any_incrementable_iterator_interface() {}
  61. virtual any_incrementable_iterator_interface*
  62. clone(buffer_type& buffer) const = 0;
  63. virtual any_incrementable_iterator_interface<const_reference, Buffer>*
  64. clone_const_ref(buffer_type& buffer) const = 0;
  65. virtual any_incrementable_iterator_interface<reference_as_value_type, Buffer>*
  66. clone_reference_as_value(buffer_type& buffer) const = 0;
  67. virtual void increment() = 0;
  68. };
  69. template<
  70. class Reference
  71. , class Buffer
  72. >
  73. struct any_single_pass_iterator_interface
  74. : any_incrementable_iterator_interface<Reference, Buffer>
  75. {
  76. typedef typename any_incrementable_iterator_interface<Reference, Buffer>::reference reference;
  77. typedef typename any_incrementable_iterator_interface<Reference, Buffer>::const_reference const_reference;
  78. typedef typename any_incrementable_iterator_interface<Reference, Buffer>::buffer_type buffer_type;
  79. typedef typename any_incrementable_iterator_interface<Reference, Buffer>::reference_as_value_type reference_as_value_type;
  80. virtual any_single_pass_iterator_interface*
  81. clone(buffer_type& buffer) const = 0;
  82. virtual any_single_pass_iterator_interface<const_reference, Buffer>*
  83. clone_const_ref(buffer_type& buffer) const = 0;
  84. virtual any_single_pass_iterator_interface<reference_as_value_type, Buffer>*
  85. clone_reference_as_value(buffer_type& buffer) const = 0;
  86. virtual reference dereference() const = 0;
  87. virtual bool equal(const any_single_pass_iterator_interface& other) const = 0;
  88. };
  89. template<
  90. class Reference
  91. , class Buffer
  92. >
  93. struct any_forward_iterator_interface
  94. : any_single_pass_iterator_interface<Reference, Buffer>
  95. {
  96. typedef typename any_single_pass_iterator_interface<Reference, Buffer>::reference reference;
  97. typedef typename any_single_pass_iterator_interface<Reference, Buffer>::const_reference const_reference;
  98. typedef typename any_single_pass_iterator_interface<Reference, Buffer>::buffer_type buffer_type;
  99. typedef typename any_single_pass_iterator_interface<Reference, Buffer>::reference_as_value_type reference_as_value_type;
  100. virtual any_forward_iterator_interface*
  101. clone(buffer_type& buffer) const = 0;
  102. virtual any_forward_iterator_interface<const_reference, Buffer>*
  103. clone_const_ref(buffer_type& buffer) const = 0;
  104. virtual any_forward_iterator_interface<reference_as_value_type, Buffer>*
  105. clone_reference_as_value(buffer_type& buffer) const = 0;
  106. };
  107. template<
  108. class Reference
  109. , class Buffer
  110. >
  111. struct any_bidirectional_iterator_interface
  112. : any_forward_iterator_interface<Reference, Buffer>
  113. {
  114. typedef typename any_forward_iterator_interface<Reference, Buffer>::reference reference;
  115. typedef typename any_forward_iterator_interface<Reference, Buffer>::const_reference const_reference;
  116. typedef typename any_forward_iterator_interface<Reference, Buffer>::buffer_type buffer_type;
  117. typedef typename any_forward_iterator_interface<Reference, Buffer>::reference_as_value_type reference_as_value_type;
  118. virtual any_bidirectional_iterator_interface*
  119. clone(buffer_type& buffer) const = 0;
  120. virtual any_bidirectional_iterator_interface<const_reference, Buffer>*
  121. clone_const_ref(buffer_type& buffer) const = 0;
  122. virtual any_bidirectional_iterator_interface<reference_as_value_type, Buffer>*
  123. clone_reference_as_value(buffer_type& buffer) const = 0;
  124. virtual void decrement() = 0;
  125. };
  126. template<
  127. class Reference
  128. , class Difference
  129. , class Buffer
  130. >
  131. struct any_random_access_iterator_interface
  132. : any_bidirectional_iterator_interface<
  133. Reference
  134. , Buffer
  135. >
  136. {
  137. typedef typename any_bidirectional_iterator_interface<Reference, Buffer>::reference reference;
  138. typedef typename any_bidirectional_iterator_interface<Reference, Buffer>::const_reference const_reference;
  139. typedef typename any_bidirectional_iterator_interface<Reference, Buffer>::buffer_type buffer_type;
  140. typedef typename any_bidirectional_iterator_interface<Reference, Buffer>::reference_as_value_type reference_as_value_type;
  141. typedef Difference difference_type;
  142. virtual any_random_access_iterator_interface*
  143. clone(buffer_type& buffer) const = 0;
  144. virtual any_random_access_iterator_interface<const_reference, Difference, Buffer>*
  145. clone_const_ref(buffer_type& buffer) const = 0;
  146. virtual any_random_access_iterator_interface<reference_as_value_type, Difference, Buffer>*
  147. clone_reference_as_value(buffer_type& buffer) const = 0;
  148. virtual void advance(Difference offset) = 0;
  149. virtual Difference distance_to(const any_random_access_iterator_interface& other) const = 0;
  150. };
  151. template<
  152. class Traversal
  153. , class Reference
  154. , class Difference
  155. , class Buffer
  156. >
  157. struct any_iterator_interface_type_generator;
  158. template<
  159. class Reference
  160. , class Difference
  161. , class Buffer
  162. >
  163. struct any_iterator_interface_type_generator<
  164. incrementable_traversal_tag
  165. , Reference
  166. , Difference
  167. , Buffer
  168. >
  169. {
  170. typedef any_incrementable_iterator_interface<Reference, Buffer> type;
  171. };
  172. template<
  173. class Reference
  174. , class Difference
  175. , class Buffer
  176. >
  177. struct any_iterator_interface_type_generator<
  178. single_pass_traversal_tag
  179. , Reference
  180. , Difference
  181. , Buffer
  182. >
  183. {
  184. typedef any_single_pass_iterator_interface<Reference, Buffer> type;
  185. };
  186. template<
  187. class Reference
  188. , class Difference
  189. , class Buffer
  190. >
  191. struct any_iterator_interface_type_generator<
  192. forward_traversal_tag
  193. , Reference
  194. , Difference
  195. , Buffer
  196. >
  197. {
  198. typedef any_forward_iterator_interface<Reference, Buffer> type;
  199. };
  200. template<
  201. class Reference
  202. , class Difference
  203. , class Buffer
  204. >
  205. struct any_iterator_interface_type_generator<
  206. bidirectional_traversal_tag
  207. , Reference
  208. , Difference
  209. , Buffer
  210. >
  211. {
  212. typedef any_bidirectional_iterator_interface<Reference, Buffer> type;
  213. };
  214. template<
  215. class Reference
  216. , class Difference
  217. , class Buffer
  218. >
  219. struct any_iterator_interface_type_generator<
  220. random_access_traversal_tag
  221. , Reference
  222. , Difference
  223. , Buffer
  224. >
  225. {
  226. typedef any_random_access_iterator_interface<
  227. Reference
  228. , Difference
  229. , Buffer
  230. > type;
  231. };
  232. } // namespace range_detail
  233. } // namespace boost
  234. #endif // include guard