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