any_iterator_interface.hpp 9.9 KB

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