]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
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 |