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