type_erased.hpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  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_ADAPTOR_TYPE_ERASED_HPP_INCLUDED
  11. #define BOOST_RANGE_ADAPTOR_TYPE_ERASED_HPP_INCLUDED
  12. #include <boost/range/reference.hpp>
  13. #include <boost/range/value_type.hpp>
  14. #include <boost/range/iterator_range_core.hpp>
  15. #include <boost/range/any_range.hpp>
  16. #include <boost/range/concepts.hpp>
  17. namespace boost
  18. {
  19. namespace adaptors
  20. {
  21. template<
  22. class Value = use_default
  23. , class Traversal = use_default
  24. , class Reference = use_default
  25. , class Difference = use_default
  26. , class Buffer = use_default
  27. >
  28. struct type_erased
  29. {
  30. };
  31. template<
  32. class SinglePassRange
  33. , class Value
  34. , class Traversal
  35. , class Reference
  36. , class Difference
  37. , class Buffer
  38. >
  39. typename any_range_type_generator<
  40. SinglePassRange
  41. , Value
  42. , Traversal
  43. , Reference
  44. , Difference
  45. , Buffer
  46. >::type
  47. operator|(SinglePassRange& rng,
  48. type_erased<
  49. Value
  50. , Traversal
  51. , Reference
  52. , Difference
  53. , Buffer
  54. >)
  55. {
  56. BOOST_RANGE_CONCEPT_ASSERT((
  57. SinglePassRangeConcept<SinglePassRange>));
  58. typedef typename any_range_type_generator<
  59. SinglePassRange
  60. , Value
  61. , Traversal
  62. , Reference
  63. , Difference
  64. , Buffer
  65. >::type range_type;
  66. return range_type(boost::begin(rng), boost::end(rng));
  67. }
  68. template<
  69. class SinglePassRange
  70. , class Value
  71. , class Traversal
  72. , class Reference
  73. , class Difference
  74. , class Buffer
  75. >
  76. typename any_range_type_generator<
  77. const SinglePassRange
  78. , Value
  79. , Traversal
  80. , Reference
  81. , Difference
  82. , Buffer
  83. >::type
  84. operator|(const SinglePassRange& rng,
  85. type_erased<
  86. Value
  87. , Traversal
  88. , Reference
  89. , Difference
  90. , Buffer
  91. >)
  92. {
  93. BOOST_RANGE_CONCEPT_ASSERT((
  94. SinglePassRangeConcept<const SinglePassRange>));
  95. typedef typename any_range_type_generator<
  96. const SinglePassRange
  97. , Value
  98. , Traversal
  99. , Reference
  100. , Difference
  101. , Buffer
  102. >::type range_type;
  103. return range_type(boost::begin(rng), boost::end(rng));
  104. }
  105. template<
  106. class SinglePassRange
  107. , class Value
  108. , class Traversal
  109. , class Reference
  110. , class Difference
  111. , class Buffer
  112. >
  113. typename any_range_type_generator<
  114. SinglePassRange
  115. , Value
  116. , Traversal
  117. , Reference
  118. , Difference
  119. , Buffer
  120. >::type
  121. type_erase(SinglePassRange& rng
  122. , type_erased<
  123. Value
  124. , Traversal
  125. , Reference
  126. , Difference
  127. , Buffer
  128. > = type_erased<>()
  129. )
  130. {
  131. BOOST_RANGE_CONCEPT_ASSERT((
  132. SinglePassRangeConcept<SinglePassRange>));
  133. typedef typename any_range_type_generator<
  134. SinglePassRange
  135. , Value
  136. , Traversal
  137. , Reference
  138. , Difference
  139. , Buffer
  140. >::type range_type;
  141. return range_type(boost::begin(rng), boost::end(rng));
  142. }
  143. template<
  144. class SinglePassRange
  145. , class Value
  146. , class Traversal
  147. , class Reference
  148. , class Difference
  149. , class Buffer
  150. >
  151. typename any_range_type_generator<
  152. const SinglePassRange
  153. , Value
  154. , Traversal
  155. , Reference
  156. , Difference
  157. , Buffer
  158. >::type
  159. type_erase(const SinglePassRange& rng
  160. , type_erased<
  161. Value
  162. , Traversal
  163. , Reference
  164. , Difference
  165. , Buffer
  166. > = type_erased<>()
  167. )
  168. {
  169. BOOST_RANGE_CONCEPT_ASSERT((
  170. SinglePassRangeConcept<const SinglePassRange>));
  171. typedef typename any_range_type_generator<
  172. const SinglePassRange
  173. , Value
  174. , Traversal
  175. , Reference
  176. , Difference
  177. , Buffer
  178. >::type range_type;
  179. return range_type(boost::begin(rng), boost::end(rng));
  180. }
  181. }
  182. } // namespace boost
  183. #endif // include guard