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