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
19namespace 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
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
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
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
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

source code of boost/libs/range/include/boost/range/adaptor/type_erased.hpp