Chris@16
|
1 // Boost.Range library
|
Chris@16
|
2 //
|
Chris@16
|
3 // Copyright Thorsten Ottosen 2003-2004. Use, modification and
|
Chris@16
|
4 // distribution is subject to the Boost Software License, Version
|
Chris@16
|
5 // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
6 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
7 //
|
Chris@16
|
8 // For more information, see http://www.boost.org/libs/range/
|
Chris@16
|
9 //
|
Chris@16
|
10
|
Chris@16
|
11 #ifndef BOOST_RANGE_DETAIL_DETAIL_STR_HPP
|
Chris@16
|
12 #define BOOST_RANGE_DETAIL_DETAIL_STR_HPP
|
Chris@16
|
13
|
Chris@16
|
14 #include <boost/config.hpp> // BOOST_MSVC
|
Chris@16
|
15 #include <boost/range/iterator.hpp>
|
Chris@16
|
16
|
Chris@16
|
17 namespace boost
|
Chris@16
|
18 {
|
Chris@16
|
19
|
Chris@16
|
20 namespace range_detail
|
Chris@16
|
21 {
|
Chris@16
|
22 //
|
Chris@16
|
23 // iterator
|
Chris@16
|
24 //
|
Chris@16
|
25
|
Chris@16
|
26 template<>
|
Chris@16
|
27 struct range_iterator_<char_array_>
|
Chris@16
|
28 {
|
Chris@16
|
29 template< typename T >
|
Chris@16
|
30 struct pts
|
Chris@16
|
31 {
|
Chris@16
|
32 typedef BOOST_RANGE_DEDUCED_TYPENAME
|
Chris@16
|
33 remove_extent<T>::type* type;
|
Chris@16
|
34 };
|
Chris@16
|
35 };
|
Chris@16
|
36
|
Chris@16
|
37 template<>
|
Chris@16
|
38 struct range_iterator_<char_ptr_>
|
Chris@16
|
39 {
|
Chris@16
|
40 template< typename S >
|
Chris@16
|
41 struct pts
|
Chris@16
|
42 {
|
Chris@16
|
43 typedef char* type;
|
Chris@16
|
44 };
|
Chris@16
|
45 };
|
Chris@16
|
46
|
Chris@16
|
47 template<>
|
Chris@16
|
48 struct range_iterator_<const_char_ptr_>
|
Chris@16
|
49 {
|
Chris@16
|
50 template< typename S >
|
Chris@16
|
51 struct pts
|
Chris@16
|
52 {
|
Chris@16
|
53 typedef const char* type;
|
Chris@16
|
54 };
|
Chris@16
|
55 };
|
Chris@16
|
56
|
Chris@16
|
57 template<>
|
Chris@16
|
58 struct range_iterator_<wchar_t_ptr_>
|
Chris@16
|
59 {
|
Chris@16
|
60 template< typename S >
|
Chris@16
|
61 struct pts
|
Chris@16
|
62 {
|
Chris@16
|
63 typedef wchar_t* type;
|
Chris@16
|
64 };
|
Chris@16
|
65 };
|
Chris@16
|
66
|
Chris@16
|
67 template<>
|
Chris@16
|
68 struct range_iterator_<const_wchar_t_ptr_>
|
Chris@16
|
69 {
|
Chris@16
|
70 template< typename S >
|
Chris@16
|
71 struct pts
|
Chris@16
|
72 {
|
Chris@16
|
73 typedef const wchar_t* type;
|
Chris@16
|
74 };
|
Chris@16
|
75 };
|
Chris@16
|
76
|
Chris@16
|
77
|
Chris@16
|
78 //
|
Chris@16
|
79 // const iterator
|
Chris@16
|
80 //
|
Chris@16
|
81
|
Chris@16
|
82 template<>
|
Chris@16
|
83 struct range_const_iterator_<char_array_>
|
Chris@16
|
84 {
|
Chris@16
|
85 template< typename T >
|
Chris@16
|
86 struct pts
|
Chris@16
|
87 {
|
Chris@16
|
88 typedef const BOOST_RANGE_DEDUCED_TYPENAME
|
Chris@16
|
89 remove_extent<T>::type* type;
|
Chris@16
|
90 };
|
Chris@16
|
91 };
|
Chris@16
|
92
|
Chris@16
|
93 template<>
|
Chris@16
|
94 struct range_const_iterator_<char_ptr_>
|
Chris@16
|
95 {
|
Chris@16
|
96 template< typename S >
|
Chris@16
|
97 struct pts
|
Chris@16
|
98 {
|
Chris@16
|
99 typedef const char* type;
|
Chris@16
|
100 };
|
Chris@16
|
101 };
|
Chris@16
|
102
|
Chris@16
|
103 template<>
|
Chris@16
|
104 struct range_const_iterator_<const_char_ptr_>
|
Chris@16
|
105 {
|
Chris@16
|
106 template< typename S >
|
Chris@16
|
107 struct pts
|
Chris@16
|
108 {
|
Chris@16
|
109 typedef const char* type;
|
Chris@16
|
110 };
|
Chris@16
|
111 };
|
Chris@16
|
112
|
Chris@16
|
113 template<>
|
Chris@16
|
114 struct range_const_iterator_<wchar_t_ptr_>
|
Chris@16
|
115 {
|
Chris@16
|
116 template< typename S >
|
Chris@16
|
117 struct pts
|
Chris@16
|
118 {
|
Chris@16
|
119 typedef const wchar_t* type;
|
Chris@16
|
120 };
|
Chris@16
|
121 };
|
Chris@16
|
122
|
Chris@16
|
123 template<>
|
Chris@16
|
124 struct range_const_iterator_<const_wchar_t_ptr_>
|
Chris@16
|
125 {
|
Chris@16
|
126 template< typename S >
|
Chris@16
|
127 struct pts
|
Chris@16
|
128 {
|
Chris@16
|
129 typedef const wchar_t* type;
|
Chris@16
|
130 };
|
Chris@16
|
131 };
|
Chris@16
|
132 }
|
Chris@16
|
133 }
|
Chris@16
|
134
|
Chris@16
|
135 #include <boost/range/detail/begin.hpp>
|
Chris@16
|
136 #include <boost/range/detail/end.hpp>
|
Chris@16
|
137 #include <boost/range/detail/size_type.hpp>
|
Chris@16
|
138 #include <boost/range/detail/value_type.hpp>
|
Chris@16
|
139 #include <boost/range/detail/common.hpp>
|
Chris@16
|
140
|
Chris@16
|
141 namespace boost
|
Chris@16
|
142 {
|
Chris@16
|
143
|
Chris@16
|
144 namespace range_detail
|
Chris@16
|
145 {
|
Chris@16
|
146 //
|
Chris@16
|
147 // str_begin()
|
Chris@16
|
148 //
|
Chris@16
|
149 template<>
|
Chris@16
|
150 struct range_begin<char_ptr_>
|
Chris@16
|
151 {
|
Chris@16
|
152 static char* fun( char* s )
|
Chris@16
|
153 {
|
Chris@16
|
154 return s;
|
Chris@16
|
155 }
|
Chris@16
|
156 };
|
Chris@16
|
157
|
Chris@16
|
158 template<>
|
Chris@16
|
159 struct range_begin<const_char_ptr_>
|
Chris@16
|
160 {
|
Chris@16
|
161 static const char* fun( const char* s )
|
Chris@16
|
162 {
|
Chris@16
|
163 return s;
|
Chris@16
|
164 }
|
Chris@16
|
165 };
|
Chris@16
|
166
|
Chris@16
|
167 template<>
|
Chris@16
|
168 struct range_begin<wchar_t_ptr_>
|
Chris@16
|
169 {
|
Chris@16
|
170
|
Chris@16
|
171 static wchar_t* fun( wchar_t* s )
|
Chris@16
|
172 {
|
Chris@16
|
173 return s;
|
Chris@16
|
174 }
|
Chris@16
|
175 };
|
Chris@16
|
176
|
Chris@16
|
177 template<>
|
Chris@16
|
178 struct range_begin<const_wchar_t_ptr_>
|
Chris@16
|
179 {
|
Chris@16
|
180 static const wchar_t* fun( const wchar_t* s )
|
Chris@16
|
181 {
|
Chris@16
|
182 return s;
|
Chris@16
|
183 }
|
Chris@16
|
184 };
|
Chris@16
|
185
|
Chris@16
|
186 template< typename C >
|
Chris@16
|
187 inline BOOST_RANGE_DEDUCED_TYPENAME range_iterator<C>::type
|
Chris@16
|
188 str_begin( C& c )
|
Chris@16
|
189 {
|
Chris@16
|
190 return range_detail::range_begin< BOOST_RANGE_DEDUCED_TYPENAME
|
Chris@16
|
191 range_detail::range<C>::type >::fun( c );
|
Chris@16
|
192 }
|
Chris@16
|
193
|
Chris@16
|
194 //
|
Chris@16
|
195 // str_end()
|
Chris@16
|
196 //
|
Chris@16
|
197
|
Chris@16
|
198 template<>
|
Chris@16
|
199 struct range_end<char_array_>
|
Chris@16
|
200 {
|
Chris@16
|
201 template< typename T, std::size_t sz >
|
Chris@16
|
202 static T* fun( T BOOST_RANGE_ARRAY_REF()[sz] )
|
Chris@16
|
203 {
|
Chris@16
|
204 return boost::range_detail::array_end( boost_range_array );
|
Chris@16
|
205 }
|
Chris@16
|
206 };
|
Chris@16
|
207
|
Chris@16
|
208 template<>
|
Chris@16
|
209 struct range_end<wchar_t_array_>
|
Chris@16
|
210 {
|
Chris@16
|
211 template< typename T, std::size_t sz >
|
Chris@16
|
212 static T* fun( T BOOST_RANGE_ARRAY_REF()[sz] )
|
Chris@16
|
213 {
|
Chris@16
|
214 return boost::range_detail::array_end( boost_range_array );
|
Chris@16
|
215 }
|
Chris@16
|
216 };
|
Chris@16
|
217
|
Chris@16
|
218 template<>
|
Chris@16
|
219 struct range_end<char_ptr_>
|
Chris@16
|
220 {
|
Chris@16
|
221 static char* fun( char* s )
|
Chris@16
|
222 {
|
Chris@16
|
223 return boost::range_detail::str_end( s );
|
Chris@16
|
224 }
|
Chris@16
|
225 };
|
Chris@16
|
226
|
Chris@16
|
227 template<>
|
Chris@16
|
228 struct range_end<const_char_ptr_>
|
Chris@16
|
229 {
|
Chris@16
|
230 static const char* fun( const char* s )
|
Chris@16
|
231 {
|
Chris@16
|
232 return boost::range_detail::str_end( s );
|
Chris@16
|
233 }
|
Chris@16
|
234 };
|
Chris@16
|
235
|
Chris@16
|
236 template<>
|
Chris@16
|
237 struct range_end<wchar_t_ptr_>
|
Chris@16
|
238 {
|
Chris@16
|
239 static wchar_t* fun( wchar_t* s )
|
Chris@16
|
240 {
|
Chris@16
|
241 return boost::range_detail::str_end( s );
|
Chris@16
|
242 }
|
Chris@16
|
243 };
|
Chris@16
|
244
|
Chris@16
|
245
|
Chris@16
|
246 template<>
|
Chris@16
|
247 struct range_end<const_wchar_t_ptr_>
|
Chris@16
|
248 {
|
Chris@16
|
249 static const wchar_t* fun( const wchar_t* s )
|
Chris@16
|
250 {
|
Chris@16
|
251 return boost::range_detail::str_end( s );
|
Chris@16
|
252 }
|
Chris@16
|
253 };
|
Chris@16
|
254
|
Chris@16
|
255 template< typename C >
|
Chris@16
|
256 inline BOOST_RANGE_DEDUCED_TYPENAME range_iterator<C>::type
|
Chris@16
|
257 str_end( C& c )
|
Chris@16
|
258 {
|
Chris@16
|
259 return range_detail::range_end< BOOST_RANGE_DEDUCED_TYPENAME
|
Chris@16
|
260 range_detail::range<C>::type >::fun( c );
|
Chris@16
|
261 }
|
Chris@16
|
262
|
Chris@16
|
263 //
|
Chris@16
|
264 // size_type
|
Chris@16
|
265 //
|
Chris@16
|
266
|
Chris@16
|
267 template<>
|
Chris@16
|
268 struct range_size_type_<char_array_>
|
Chris@16
|
269 {
|
Chris@16
|
270 template< typename A >
|
Chris@16
|
271 struct pts
|
Chris@16
|
272 {
|
Chris@16
|
273 typedef std::size_t type;
|
Chris@16
|
274 };
|
Chris@16
|
275 };
|
Chris@16
|
276
|
Chris@16
|
277 template<>
|
Chris@16
|
278 struct range_size_type_<char_ptr_>
|
Chris@16
|
279 {
|
Chris@16
|
280 template< typename S >
|
Chris@16
|
281 struct pts
|
Chris@16
|
282 {
|
Chris@16
|
283 typedef std::size_t type;
|
Chris@16
|
284 };
|
Chris@16
|
285 };
|
Chris@16
|
286
|
Chris@16
|
287 template<>
|
Chris@16
|
288 struct range_size_type_<const_char_ptr_>
|
Chris@16
|
289 {
|
Chris@16
|
290 template< typename S >
|
Chris@16
|
291 struct pts
|
Chris@16
|
292 {
|
Chris@16
|
293 typedef std::size_t type;
|
Chris@16
|
294 };
|
Chris@16
|
295 };
|
Chris@16
|
296
|
Chris@16
|
297 template<>
|
Chris@16
|
298 struct range_size_type_<wchar_t_ptr_>
|
Chris@16
|
299 {
|
Chris@16
|
300 template< typename S >
|
Chris@16
|
301 struct pts
|
Chris@16
|
302 {
|
Chris@16
|
303 typedef std::size_t type;
|
Chris@16
|
304 };
|
Chris@16
|
305 };
|
Chris@16
|
306
|
Chris@16
|
307 template<>
|
Chris@16
|
308 struct range_size_type_<const_wchar_t_ptr_>
|
Chris@16
|
309 {
|
Chris@16
|
310 template< typename S >
|
Chris@16
|
311 struct pts
|
Chris@16
|
312 {
|
Chris@16
|
313 typedef std::size_t type;
|
Chris@16
|
314 };
|
Chris@16
|
315 };
|
Chris@16
|
316
|
Chris@16
|
317 //
|
Chris@16
|
318 // value_type
|
Chris@16
|
319 //
|
Chris@16
|
320
|
Chris@16
|
321 template<>
|
Chris@16
|
322 struct range_value_type_<char_array_>
|
Chris@16
|
323 {
|
Chris@16
|
324 template< typename T >
|
Chris@16
|
325 struct pts
|
Chris@16
|
326 {
|
Chris@16
|
327 typedef char type;
|
Chris@16
|
328 };
|
Chris@16
|
329 };
|
Chris@16
|
330
|
Chris@16
|
331 template<>
|
Chris@16
|
332 struct range_value_type_<char_ptr_>
|
Chris@16
|
333 {
|
Chris@16
|
334 template< typename S >
|
Chris@16
|
335 struct pts
|
Chris@16
|
336 {
|
Chris@16
|
337 typedef char type;
|
Chris@16
|
338 };
|
Chris@16
|
339 };
|
Chris@16
|
340
|
Chris@16
|
341 template<>
|
Chris@16
|
342 struct range_value_type_<const_char_ptr_>
|
Chris@16
|
343 {
|
Chris@16
|
344 template< typename S >
|
Chris@16
|
345 struct pts
|
Chris@16
|
346 {
|
Chris@16
|
347 typedef const char type;
|
Chris@16
|
348 };
|
Chris@16
|
349 };
|
Chris@16
|
350
|
Chris@16
|
351 template<>
|
Chris@16
|
352 struct range_value_type_<wchar_t_ptr_>
|
Chris@16
|
353 {
|
Chris@16
|
354 template< typename S >
|
Chris@16
|
355 struct pts
|
Chris@16
|
356 {
|
Chris@16
|
357 typedef wchar_t type;
|
Chris@16
|
358 };
|
Chris@16
|
359 };
|
Chris@16
|
360
|
Chris@16
|
361 template<>
|
Chris@16
|
362 struct range_value_type_<const_wchar_t_ptr_>
|
Chris@16
|
363 {
|
Chris@16
|
364 template< typename S >
|
Chris@16
|
365 struct pts
|
Chris@16
|
366 {
|
Chris@16
|
367 typedef const wchar_t type;
|
Chris@16
|
368 };
|
Chris@16
|
369 };
|
Chris@16
|
370
|
Chris@16
|
371 } // namespace 'range_detail'
|
Chris@16
|
372
|
Chris@16
|
373 } // namespace 'boost'
|
Chris@16
|
374
|
Chris@16
|
375
|
Chris@16
|
376 #endif
|