/Src/Dependencies/Boost/boost/range/any_range.hpp

http://hadesmem.googlecode.com/ · C++ Header · 205 lines · 178 code · 13 blank · 14 comment · 0 complexity · 1bb29819c6a33543e172dd8aff9d9100 MD5 · raw file

  1. // Copyright Neil Groves 2010. Use, modification and
  2. // distribution is subject to the Boost Software License, Version
  3. // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  4. // http://www.boost.org/LICENSE_1_0.txt)
  5. //
  6. //
  7. // For more information, see http://www.boost.org/libs/range/
  8. //
  9. #ifndef BOOST_RANGE_ANY_RANGE_HPP_INCLUDED
  10. #define BOOST_RANGE_ANY_RANGE_HPP_INCLUDED
  11. #include <boost/config.hpp>
  12. #include <boost/iterator/iterator_categories.hpp>
  13. #include <boost/iterator/iterator_traits.hpp>
  14. #include <boost/iterator/iterator_facade.hpp>
  15. #include <boost/iterator/iterator_adaptor.hpp>
  16. #include <boost/range/detail/any_iterator.hpp>
  17. #include <boost/range/concepts.hpp>
  18. #include <boost/range/reference.hpp>
  19. #include <boost/range/value_type.hpp>
  20. #include <boost/range/iterator_range_core.hpp>
  21. #include <boost/cast.hpp>
  22. namespace boost
  23. {
  24. namespace range_detail
  25. {
  26. // If T is use_default, return the result of Default, otherwise
  27. // return T.
  28. //
  29. // This is an implementation artifact used to pick intelligent default
  30. // values when the user specified boost::use_default as a template
  31. // parameter.
  32. template<
  33. class T,
  34. class Default
  35. >
  36. struct any_range_default_help
  37. : mpl::eval_if<
  38. is_same<T, use_default>
  39. , Default
  40. , mpl::identity<T>
  41. >
  42. {
  43. };
  44. template<
  45. class WrappedRange
  46. , class Value
  47. , class Reference
  48. >
  49. struct any_range_value_type
  50. {
  51. # ifdef BOOST_ITERATOR_REF_CONSTNESS_KILLS_WRITABILITY
  52. typedef typename any_range_default_help<
  53. Value
  54. , mpl::eval_if<
  55. is_same<Reference, use_default>
  56. , range_value<
  57. typename remove_const<WrappedRange>
  58. ::type>
  59. , remove_reference<Reference>
  60. >
  61. >::type type;
  62. # else
  63. typedef typename any_range_default_help<
  64. Value
  65. , range_value<
  66. typename remove_const<WrappedRange>
  67. ::type>
  68. >::type type;
  69. # endif
  70. };
  71. template<
  72. class Value
  73. , class Traversal
  74. , class Reference
  75. , class Difference
  76. , class Buffer = use_default
  77. >
  78. class any_range
  79. : public iterator_range<
  80. any_iterator<
  81. Value
  82. , Traversal
  83. , Reference
  84. , Difference
  85. , typename any_range_default_help<
  86. Buffer
  87. , mpl::identity<any_iterator_default_buffer>
  88. >::type
  89. >
  90. >
  91. {
  92. typedef iterator_range<
  93. any_iterator<
  94. Value
  95. , Traversal
  96. , Reference
  97. , Difference
  98. , typename any_range_default_help<
  99. Buffer
  100. , mpl::identity<any_iterator_default_buffer>
  101. >::type
  102. >
  103. > base_type;
  104. struct enabler {};
  105. struct disabler {};
  106. public:
  107. any_range()
  108. {
  109. }
  110. any_range(const any_range& other)
  111. : base_type(other)
  112. {
  113. }
  114. template<class WrappedRange>
  115. any_range(WrappedRange& wrapped_range)
  116. : base_type(boost::begin(wrapped_range),
  117. boost::end(wrapped_range))
  118. {
  119. }
  120. template<class WrappedRange>
  121. any_range(const WrappedRange& wrapped_range)
  122. : base_type(boost::begin(wrapped_range),
  123. boost::end(wrapped_range))
  124. {
  125. }
  126. template<
  127. class OtherValue
  128. , class OtherTraversal
  129. , class OtherReference
  130. , class OtherDifference
  131. >
  132. any_range(const any_range<
  133. OtherValue
  134. , OtherTraversal
  135. , OtherReference
  136. , OtherDifference
  137. , Buffer
  138. >& other)
  139. : base_type(boost::begin(other), boost::end(other))
  140. {
  141. }
  142. template<class Iterator>
  143. any_range(Iterator first, Iterator last)
  144. : base_type(first, last)
  145. {
  146. }
  147. };
  148. template<
  149. class WrappedRange
  150. , class Value = use_default
  151. , class Traversal = use_default
  152. , class Reference = use_default
  153. , class Difference = use_default
  154. , class Buffer = use_default
  155. >
  156. struct any_range_type_generator
  157. {
  158. BOOST_RANGE_CONCEPT_ASSERT(( SinglePassRangeConcept<WrappedRange> ));
  159. typedef any_range<
  160. typename any_range_value_type<
  161. WrappedRange
  162. , Value
  163. , typename any_range_default_help<
  164. Reference
  165. , range_reference<WrappedRange>
  166. >::type
  167. >::type
  168. , typename any_range_default_help<
  169. Traversal
  170. , iterator_traversal<
  171. typename range_iterator<WrappedRange>::type
  172. >
  173. >::type
  174. , typename any_range_default_help<
  175. Reference
  176. , range_reference<WrappedRange>
  177. >::type
  178. , typename any_range_default_help<
  179. Difference
  180. , range_difference<WrappedRange>
  181. >::type
  182. , typename any_range_default_help<
  183. Buffer
  184. , mpl::identity<any_iterator_default_buffer>
  185. >::type
  186. > type;
  187. };
  188. } // namespace range_detail
  189. using range_detail::any_range;
  190. using range_detail::any_range_type_generator;
  191. } // namespace boost
  192. #endif // include guard