Chris@16
|
1 #ifndef BOOST_RANGE_ATL_HPP
|
Chris@16
|
2 #define BOOST_RANGE_ATL_HPP
|
Chris@16
|
3
|
Chris@16
|
4
|
Chris@16
|
5
|
Chris@16
|
6
|
Chris@16
|
7 // Boost.Range ATL Extension
|
Chris@16
|
8 //
|
Chris@16
|
9 // Copyright Shunsuke Sogame 2005-2006.
|
Chris@16
|
10 // Distributed under the Boost Software License, Version 1.0.
|
Chris@16
|
11 // (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
12 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
13
|
Chris@16
|
14
|
Chris@16
|
15
|
Chris@16
|
16
|
Chris@16
|
17 // config
|
Chris@16
|
18 //
|
Chris@16
|
19
|
Chris@16
|
20
|
Chris@16
|
21 #include <atldef.h> // _ATL_VER
|
Chris@16
|
22
|
Chris@16
|
23
|
Chris@16
|
24 #if !defined(BOOST_RANGE_ATL_NO_COLLECTIONS)
|
Chris@16
|
25 #if (_ATL_VER < 0x0700)
|
Chris@16
|
26 #define BOOST_RANGE_ATL_NO_COLLECTIONS
|
Chris@16
|
27 #endif
|
Chris@16
|
28 #endif
|
Chris@16
|
29
|
Chris@16
|
30
|
Chris@16
|
31 #if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
|
Chris@16
|
32 #if (_ATL_VER < 0x0700) // dubious
|
Chris@16
|
33 #define BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX
|
Chris@16
|
34 #endif
|
Chris@16
|
35 #endif
|
Chris@16
|
36
|
Chris@16
|
37
|
Chris@16
|
38 #if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLESTRING)
|
Chris@16
|
39 #if (_MSC_VER < 1310) // from <boost/regex/mfc.hpp>, but dubious
|
Chris@16
|
40 #define BOOST_RANGE_ATL_HAS_OLD_CSIMPLESTRING
|
Chris@16
|
41 #endif
|
Chris@16
|
42 #endif
|
Chris@16
|
43
|
Chris@16
|
44
|
Chris@16
|
45
|
Chris@16
|
46
|
Chris@16
|
47 // forward declarations
|
Chris@16
|
48 //
|
Chris@16
|
49
|
Chris@16
|
50
|
Chris@16
|
51 #include <basetyps.h> // IID
|
Chris@16
|
52
|
Chris@16
|
53
|
Chris@16
|
54 namespace ATL {
|
Chris@16
|
55
|
Chris@16
|
56
|
Chris@16
|
57 #if !defined(BOOST_RANGE_ATL_NO_COLLECTIONS)
|
Chris@16
|
58
|
Chris@16
|
59
|
Chris@16
|
60 // arrays
|
Chris@16
|
61 //
|
Chris@16
|
62 template< class E, class ETraits >
|
Chris@16
|
63 class CAtlArray;
|
Chris@16
|
64
|
Chris@16
|
65 template< class E >
|
Chris@16
|
66 class CAutoPtrArray;
|
Chris@16
|
67
|
Chris@16
|
68 template< class I, const IID *piid >
|
Chris@16
|
69 class CInterfaceArray;
|
Chris@16
|
70
|
Chris@16
|
71
|
Chris@16
|
72 // lists
|
Chris@16
|
73 //
|
Chris@16
|
74 template< class E, class ETraits >
|
Chris@16
|
75 class CAtlList;
|
Chris@16
|
76
|
Chris@16
|
77 template< class E >
|
Chris@16
|
78 class CAutoPtrList;
|
Chris@16
|
79
|
Chris@16
|
80 template< class E, class Allocator >
|
Chris@16
|
81 class CHeapPtrList;
|
Chris@16
|
82
|
Chris@16
|
83 template< class I, const IID *piid >
|
Chris@16
|
84 class CInterfaceList;
|
Chris@16
|
85
|
Chris@16
|
86
|
Chris@16
|
87 // maps
|
Chris@16
|
88 //
|
Chris@16
|
89 template< class K, class V, class KTraits, class VTraits >
|
Chris@16
|
90 class CAtlMap;
|
Chris@16
|
91
|
Chris@16
|
92 template< class K, class V, class KTraits, class VTraits >
|
Chris@16
|
93 class CRBTree;
|
Chris@16
|
94
|
Chris@16
|
95 template< class K, class V, class KTraits, class VTraits >
|
Chris@16
|
96 class CRBMap;
|
Chris@16
|
97
|
Chris@16
|
98 template< class K, class V, class KTraits, class VTraits >
|
Chris@16
|
99 class CRBMultiMap;
|
Chris@16
|
100
|
Chris@16
|
101
|
Chris@16
|
102 // strings
|
Chris@16
|
103 //
|
Chris@16
|
104 #if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLESTRING)
|
Chris@16
|
105 template< class BaseType, bool t_bMFCDLL >
|
Chris@16
|
106 class CSimpleStringT;
|
Chris@16
|
107 #else
|
Chris@16
|
108 template< class BaseType >
|
Chris@16
|
109 class CSimpleStringT;
|
Chris@16
|
110 #endif
|
Chris@16
|
111
|
Chris@16
|
112 template< class BaseType, class StringTraits >
|
Chris@16
|
113 class CStringT;
|
Chris@16
|
114
|
Chris@16
|
115 template< class StringType, int t_nChars >
|
Chris@16
|
116 class CFixedStringT;
|
Chris@16
|
117
|
Chris@16
|
118 template< class BaseType, const int t_nSize >
|
Chris@16
|
119 class CStaticString;
|
Chris@16
|
120
|
Chris@16
|
121
|
Chris@16
|
122 #endif // !defined(BOOST_RANGE_ATL_NO_COLLECTIONS)
|
Chris@16
|
123
|
Chris@16
|
124
|
Chris@16
|
125 // simples
|
Chris@16
|
126 //
|
Chris@16
|
127 #if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
|
Chris@16
|
128
|
Chris@16
|
129 template< class T, class TEqual >
|
Chris@16
|
130 class CSimpleArray;
|
Chris@16
|
131
|
Chris@16
|
132 template< class TKey, class TVal, class TEqual >
|
Chris@16
|
133 class CSimpleMap;
|
Chris@16
|
134
|
Chris@16
|
135 #else
|
Chris@16
|
136
|
Chris@16
|
137 template< class T >
|
Chris@16
|
138 class CSimpleArray;
|
Chris@16
|
139
|
Chris@16
|
140 template< class T >
|
Chris@16
|
141 class CSimpleValArray;
|
Chris@16
|
142
|
Chris@16
|
143 template< class TKey, class TVal >
|
Chris@16
|
144 class CSimpleMap;
|
Chris@16
|
145
|
Chris@16
|
146 #endif // !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
|
Chris@16
|
147
|
Chris@16
|
148
|
Chris@16
|
149 // pointers
|
Chris@16
|
150 //
|
Chris@16
|
151 template< class E >
|
Chris@16
|
152 class CAutoPtr;
|
Chris@16
|
153
|
Chris@16
|
154 template< class T >
|
Chris@16
|
155 class CComPtr;
|
Chris@16
|
156
|
Chris@16
|
157 template< class T, const IID *piid >
|
Chris@16
|
158 class CComQIPtr;
|
Chris@16
|
159
|
Chris@16
|
160 template< class E, class Allocator >
|
Chris@16
|
161 class CHeapPtr;
|
Chris@16
|
162
|
Chris@16
|
163 template< class T >
|
Chris@16
|
164 class CAdapt;
|
Chris@16
|
165
|
Chris@16
|
166
|
Chris@16
|
167 } // namespace ATL
|
Chris@16
|
168
|
Chris@16
|
169
|
Chris@16
|
170
|
Chris@16
|
171
|
Chris@16
|
172 // indirect_iterator customizations
|
Chris@16
|
173 //
|
Chris@16
|
174
|
Chris@16
|
175
|
Chris@16
|
176 #include <boost/mpl/identity.hpp>
|
Chris@16
|
177 #include <boost/pointee.hpp>
|
Chris@16
|
178
|
Chris@16
|
179
|
Chris@16
|
180 namespace boost {
|
Chris@16
|
181
|
Chris@16
|
182
|
Chris@16
|
183 template< class E >
|
Chris@16
|
184 struct pointee< ATL::CAutoPtr<E> > :
|
Chris@16
|
185 mpl::identity<E>
|
Chris@16
|
186 { };
|
Chris@16
|
187
|
Chris@16
|
188 template< class T >
|
Chris@16
|
189 struct pointee< ATL::CComPtr<T> > :
|
Chris@16
|
190 mpl::identity<T>
|
Chris@16
|
191 { };
|
Chris@16
|
192
|
Chris@16
|
193 template< class T, const IID *piid >
|
Chris@16
|
194 struct pointee< ATL::CComQIPtr<T, piid> > :
|
Chris@16
|
195 mpl::identity<T>
|
Chris@16
|
196 { };
|
Chris@16
|
197
|
Chris@16
|
198 template< class E, class Allocator >
|
Chris@16
|
199 struct pointee< ATL::CHeapPtr<E, Allocator> > :
|
Chris@16
|
200 mpl::identity<E>
|
Chris@16
|
201 { };
|
Chris@16
|
202
|
Chris@16
|
203 template< class T >
|
Chris@16
|
204 struct pointee< ATL::CAdapt<T> > :
|
Chris@16
|
205 pointee<T>
|
Chris@16
|
206 { };
|
Chris@16
|
207
|
Chris@16
|
208
|
Chris@16
|
209 } // namespace boost
|
Chris@16
|
210
|
Chris@16
|
211
|
Chris@16
|
212
|
Chris@16
|
213
|
Chris@16
|
214 // extended customizations
|
Chris@16
|
215 //
|
Chris@16
|
216
|
Chris@16
|
217
|
Chris@16
|
218 #include <boost/iterator/indirect_iterator.hpp>
|
Chris@16
|
219 #include <boost/iterator/zip_iterator.hpp>
|
Chris@16
|
220 #include <boost/range/detail/microsoft.hpp>
|
Chris@16
|
221 #include <boost/tuple/tuple.hpp>
|
Chris@16
|
222 #include <atlbase.h> // CComBSTR
|
Chris@16
|
223
|
Chris@16
|
224
|
Chris@16
|
225 namespace boost { namespace range_detail_microsoft {
|
Chris@16
|
226
|
Chris@16
|
227
|
Chris@16
|
228 #if !defined(BOOST_RANGE_ATL_NO_COLLECTIONS)
|
Chris@16
|
229
|
Chris@16
|
230
|
Chris@16
|
231 // arrays
|
Chris@16
|
232 //
|
Chris@16
|
233
|
Chris@16
|
234 struct atl_array_functions :
|
Chris@16
|
235 array_functions
|
Chris@16
|
236 {
|
Chris@16
|
237 template< class Iterator, class X >
|
Chris@16
|
238 Iterator end(X& x) // redefine
|
Chris@16
|
239 {
|
Chris@16
|
240 return x.GetData() + x.GetCount(); // no 'GetSize()'
|
Chris@16
|
241 }
|
Chris@16
|
242 };
|
Chris@16
|
243
|
Chris@16
|
244
|
Chris@16
|
245 template< class E, class ETraits >
|
Chris@16
|
246 struct customization< ATL::CAtlArray<E, ETraits> > :
|
Chris@16
|
247 atl_array_functions
|
Chris@16
|
248 {
|
Chris@16
|
249 template< class X >
|
Chris@16
|
250 struct meta
|
Chris@16
|
251 {
|
Chris@16
|
252 typedef E val_t;
|
Chris@16
|
253
|
Chris@16
|
254 typedef val_t *mutable_iterator;
|
Chris@16
|
255 typedef val_t const *const_iterator;
|
Chris@16
|
256 };
|
Chris@16
|
257 };
|
Chris@16
|
258
|
Chris@16
|
259
|
Chris@16
|
260 template< class E >
|
Chris@16
|
261 struct customization< ATL::CAutoPtrArray<E> > :
|
Chris@16
|
262 atl_array_functions
|
Chris@16
|
263 {
|
Chris@16
|
264 template< class X >
|
Chris@16
|
265 struct meta
|
Chris@16
|
266 {
|
Chris@16
|
267 // ATL::CAutoPtr/CHeapPtr is no assignable.
|
Chris@16
|
268 typedef ATL::CAutoPtr<E> val_t;
|
Chris@16
|
269 typedef val_t *miter_t;
|
Chris@16
|
270 typedef val_t const *citer_t;
|
Chris@16
|
271
|
Chris@16
|
272 typedef indirect_iterator<miter_t> mutable_iterator;
|
Chris@16
|
273 typedef indirect_iterator<citer_t> const_iterator;
|
Chris@16
|
274 };
|
Chris@16
|
275 };
|
Chris@16
|
276
|
Chris@16
|
277
|
Chris@16
|
278 template< class I, const IID *piid >
|
Chris@16
|
279 struct customization< ATL::CInterfaceArray<I, piid> > :
|
Chris@16
|
280 atl_array_functions
|
Chris@16
|
281 {
|
Chris@16
|
282 template< class X >
|
Chris@16
|
283 struct meta
|
Chris@16
|
284 {
|
Chris@16
|
285 typedef ATL::CComQIPtr<I, piid> val_t;
|
Chris@16
|
286
|
Chris@16
|
287 typedef val_t *mutable_iterator;
|
Chris@16
|
288 typedef val_t const *const_iterator;
|
Chris@16
|
289 };
|
Chris@16
|
290 };
|
Chris@16
|
291
|
Chris@16
|
292
|
Chris@16
|
293 template< class E, class ETraits >
|
Chris@16
|
294 struct customization< ATL::CAtlList<E, ETraits> > :
|
Chris@16
|
295 list_functions
|
Chris@16
|
296 {
|
Chris@16
|
297 template< class X >
|
Chris@16
|
298 struct meta
|
Chris@16
|
299 {
|
Chris@16
|
300 typedef E val_t;
|
Chris@16
|
301
|
Chris@16
|
302 typedef list_iterator<X, val_t> mutable_iterator;
|
Chris@16
|
303 typedef list_iterator<X const, val_t const> const_iterator;
|
Chris@16
|
304 };
|
Chris@16
|
305 };
|
Chris@16
|
306
|
Chris@16
|
307
|
Chris@16
|
308 struct indirected_list_functions
|
Chris@16
|
309 {
|
Chris@16
|
310 template< class Iterator, class X >
|
Chris@16
|
311 Iterator begin(X& x)
|
Chris@16
|
312 {
|
Chris@16
|
313 typedef typename Iterator::base_type base_t; // == list_iterator
|
Chris@16
|
314 return Iterator(base_t(x, x.GetHeadPosition()));
|
Chris@16
|
315 }
|
Chris@16
|
316
|
Chris@16
|
317 template< class Iterator, class X >
|
Chris@16
|
318 Iterator end(X& x)
|
Chris@16
|
319 {
|
Chris@16
|
320 typedef typename Iterator::base_type base_t;
|
Chris@16
|
321 return Iterator(base_t(x, POSITION(0)));
|
Chris@16
|
322 }
|
Chris@16
|
323 };
|
Chris@16
|
324
|
Chris@16
|
325
|
Chris@16
|
326 template< class E >
|
Chris@16
|
327 struct customization< ATL::CAutoPtrList<E> > :
|
Chris@16
|
328 indirected_list_functions
|
Chris@16
|
329 {
|
Chris@16
|
330 template< class X >
|
Chris@16
|
331 struct meta
|
Chris@16
|
332 {
|
Chris@16
|
333 typedef ATL::CAutoPtr<E> val_t;
|
Chris@16
|
334 typedef list_iterator<X, val_t> miter_t;
|
Chris@16
|
335 typedef list_iterator<X const, val_t const> citer_t;
|
Chris@16
|
336
|
Chris@16
|
337 typedef indirect_iterator<miter_t> mutable_iterator;
|
Chris@16
|
338 typedef indirect_iterator<citer_t> const_iterator;
|
Chris@16
|
339 };
|
Chris@16
|
340 };
|
Chris@16
|
341
|
Chris@16
|
342
|
Chris@16
|
343 template< class E, class Allocator >
|
Chris@16
|
344 struct customization< ATL::CHeapPtrList<E, Allocator> > :
|
Chris@16
|
345 indirected_list_functions
|
Chris@16
|
346 {
|
Chris@16
|
347 template< class X >
|
Chris@16
|
348 struct meta
|
Chris@16
|
349 {
|
Chris@16
|
350 typedef ATL::CHeapPtr<E, Allocator> val_t;
|
Chris@16
|
351 typedef list_iterator<X, val_t> miter_t;
|
Chris@16
|
352 typedef list_iterator<X const, val_t const> citer_t;
|
Chris@16
|
353
|
Chris@16
|
354 typedef indirect_iterator<miter_t> mutable_iterator;
|
Chris@16
|
355 typedef indirect_iterator<citer_t> const_iterator;
|
Chris@16
|
356 };
|
Chris@16
|
357 };
|
Chris@16
|
358
|
Chris@16
|
359
|
Chris@16
|
360 template< class I, const IID *piid >
|
Chris@16
|
361 struct customization< ATL::CInterfaceList<I, piid> > :
|
Chris@16
|
362 list_functions
|
Chris@16
|
363 {
|
Chris@16
|
364 template< class X >
|
Chris@16
|
365 struct meta
|
Chris@16
|
366 {
|
Chris@16
|
367 typedef ATL::CComQIPtr<I, piid> val_t;
|
Chris@16
|
368
|
Chris@16
|
369 typedef list_iterator<X, val_t> mutable_iterator;
|
Chris@16
|
370 typedef list_iterator<X const, val_t const> const_iterator;
|
Chris@16
|
371 };
|
Chris@16
|
372 };
|
Chris@16
|
373
|
Chris@16
|
374
|
Chris@16
|
375 // maps
|
Chris@16
|
376 //
|
Chris@16
|
377
|
Chris@16
|
378 struct atl_rb_tree_tag
|
Chris@16
|
379 { };
|
Chris@16
|
380
|
Chris@16
|
381 template< >
|
Chris@16
|
382 struct customization< atl_rb_tree_tag > :
|
Chris@16
|
383 indirected_list_functions
|
Chris@16
|
384 {
|
Chris@16
|
385 template< class X >
|
Chris@16
|
386 struct meta
|
Chris@16
|
387 {
|
Chris@16
|
388 typedef typename X::CPair val_t;
|
Chris@16
|
389
|
Chris@16
|
390 typedef list_iterator<X, val_t *, val_t *> miter_t;
|
Chris@16
|
391 typedef list_iterator<X const, val_t const *, val_t const *> citer_t;
|
Chris@16
|
392
|
Chris@16
|
393 typedef indirect_iterator<miter_t> mutable_iterator;
|
Chris@16
|
394 typedef indirect_iterator<citer_t> const_iterator;
|
Chris@16
|
395 };
|
Chris@16
|
396 };
|
Chris@16
|
397
|
Chris@16
|
398
|
Chris@16
|
399 template< class K, class V, class KTraits, class VTraits >
|
Chris@16
|
400 struct customization< ATL::CAtlMap<K, V, KTraits, VTraits> > :
|
Chris@16
|
401 customization< atl_rb_tree_tag >
|
Chris@16
|
402 {
|
Chris@16
|
403 template< class Iterator, class X >
|
Chris@16
|
404 Iterator begin(X& x) // redefine
|
Chris@16
|
405 {
|
Chris@16
|
406 typedef typename Iterator::base_type base_t; // == list_iterator
|
Chris@16
|
407 return Iterator(base_t(x, x.GetStartPosition())); // no 'GetHeadPosition'
|
Chris@16
|
408 }
|
Chris@16
|
409 };
|
Chris@16
|
410
|
Chris@16
|
411
|
Chris@16
|
412 // strings
|
Chris@16
|
413 //
|
Chris@16
|
414
|
Chris@16
|
415 struct atl_string_tag
|
Chris@16
|
416 { };
|
Chris@16
|
417
|
Chris@16
|
418 template< >
|
Chris@16
|
419 struct customization< atl_string_tag >
|
Chris@16
|
420 {
|
Chris@16
|
421 template< class X >
|
Chris@16
|
422 struct meta
|
Chris@16
|
423 {
|
Chris@16
|
424 typedef typename X::PXSTR mutable_iterator;
|
Chris@16
|
425 typedef typename X::PCXSTR const_iterator;
|
Chris@16
|
426 };
|
Chris@16
|
427
|
Chris@16
|
428 template< class Iterator, class X >
|
Chris@16
|
429 typename mutable_<Iterator, X>::type begin(X& x)
|
Chris@16
|
430 {
|
Chris@16
|
431 return x.GetBuffer(0);
|
Chris@16
|
432 }
|
Chris@16
|
433
|
Chris@16
|
434 template< class Iterator, class X >
|
Chris@16
|
435 Iterator begin(X const& x)
|
Chris@16
|
436 {
|
Chris@16
|
437 return x.GetString();
|
Chris@16
|
438 }
|
Chris@16
|
439
|
Chris@16
|
440 template< class Iterator, class X >
|
Chris@16
|
441 Iterator end(X& x)
|
Chris@16
|
442 {
|
Chris@16
|
443 return begin<Iterator>(x) + x.GetLength();
|
Chris@16
|
444 }
|
Chris@16
|
445 };
|
Chris@16
|
446
|
Chris@16
|
447
|
Chris@16
|
448 template< class BaseType, const int t_nSize >
|
Chris@16
|
449 struct customization< ATL::CStaticString<BaseType, t_nSize> >
|
Chris@16
|
450 {
|
Chris@16
|
451 template< class X >
|
Chris@16
|
452 struct meta
|
Chris@16
|
453 {
|
Chris@16
|
454 typedef BaseType const *mutable_iterator;
|
Chris@16
|
455 typedef mutable_iterator const_iterator;
|
Chris@16
|
456 };
|
Chris@16
|
457
|
Chris@16
|
458 template< class Iterator, class X >
|
Chris@16
|
459 Iterator begin(X const& x)
|
Chris@16
|
460 {
|
Chris@16
|
461 return x;
|
Chris@16
|
462 }
|
Chris@16
|
463
|
Chris@16
|
464 template< class Iterator, class X >
|
Chris@16
|
465 Iterator end(X const& x)
|
Chris@16
|
466 {
|
Chris@16
|
467 return begin<Iterator>(x) + X::GetLength();
|
Chris@16
|
468 }
|
Chris@16
|
469 };
|
Chris@16
|
470
|
Chris@16
|
471
|
Chris@16
|
472 #endif // !defined(BOOST_RANGE_ATL_NO_COLLECTIONS)
|
Chris@16
|
473
|
Chris@16
|
474
|
Chris@16
|
475 template< >
|
Chris@16
|
476 struct customization< ATL::CComBSTR >
|
Chris@16
|
477 {
|
Chris@16
|
478 template< class X >
|
Chris@16
|
479 struct meta
|
Chris@16
|
480 {
|
Chris@16
|
481 typedef OLECHAR *mutable_iterator;
|
Chris@16
|
482 typedef OLECHAR const *const_iterator;
|
Chris@16
|
483 };
|
Chris@16
|
484
|
Chris@16
|
485 template< class Iterator, class X >
|
Chris@16
|
486 Iterator begin(X& x)
|
Chris@16
|
487 {
|
Chris@16
|
488 return x.operator BSTR();
|
Chris@16
|
489 }
|
Chris@16
|
490
|
Chris@16
|
491 template< class Iterator, class X >
|
Chris@16
|
492 Iterator end(X& x)
|
Chris@16
|
493 {
|
Chris@16
|
494 return begin<Iterator>(x) + x.Length();
|
Chris@16
|
495 }
|
Chris@16
|
496 };
|
Chris@16
|
497
|
Chris@16
|
498
|
Chris@16
|
499 // simples
|
Chris@16
|
500 //
|
Chris@16
|
501
|
Chris@16
|
502 #if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
|
Chris@16
|
503 template< class T, class TEqual >
|
Chris@16
|
504 struct customization< ATL::CSimpleArray<T, TEqual> > :
|
Chris@16
|
505 #else
|
Chris@16
|
506 template< class T >
|
Chris@16
|
507 struct customization< ATL::CSimpleArray<T> > :
|
Chris@16
|
508 #endif
|
Chris@16
|
509 array_functions
|
Chris@16
|
510 {
|
Chris@16
|
511 template< class X >
|
Chris@16
|
512 struct meta
|
Chris@16
|
513 {
|
Chris@16
|
514 typedef T val_t;
|
Chris@16
|
515
|
Chris@16
|
516 typedef val_t *mutable_iterator;
|
Chris@16
|
517 typedef val_t const *const_iterator;
|
Chris@16
|
518 };
|
Chris@16
|
519 };
|
Chris@16
|
520
|
Chris@16
|
521
|
Chris@16
|
522 #if defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
|
Chris@16
|
523
|
Chris@16
|
524 template< class T >
|
Chris@16
|
525 struct customization< ATL::CSimpleValArray<T> > :
|
Chris@16
|
526 array_functions
|
Chris@16
|
527 {
|
Chris@16
|
528 template< class X >
|
Chris@16
|
529 struct meta
|
Chris@16
|
530 {
|
Chris@16
|
531 typedef T val_t;
|
Chris@16
|
532
|
Chris@16
|
533 typedef val_t *mutable_iterator;
|
Chris@16
|
534 typedef val_t const *const_iterator;
|
Chris@16
|
535 };
|
Chris@16
|
536 };
|
Chris@16
|
537
|
Chris@16
|
538 #endif // defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
|
Chris@16
|
539
|
Chris@16
|
540
|
Chris@16
|
541 #if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
|
Chris@16
|
542 template< class TKey, class TVal, class TEqual >
|
Chris@16
|
543 struct customization< ATL::CSimpleMap<TKey, TVal, TEqual> >
|
Chris@16
|
544 #else
|
Chris@16
|
545 template< class TKey, class TVal >
|
Chris@16
|
546 struct customization< ATL::CSimpleMap<TKey, TVal> >
|
Chris@16
|
547 #endif
|
Chris@16
|
548 {
|
Chris@16
|
549 template< class X >
|
Chris@16
|
550 struct meta
|
Chris@16
|
551 {
|
Chris@16
|
552 typedef TKey k_val_t;
|
Chris@16
|
553 typedef k_val_t *k_miter_t;
|
Chris@16
|
554 typedef k_val_t const *k_citer_t;
|
Chris@16
|
555
|
Chris@16
|
556 typedef TVal v_val_t;
|
Chris@16
|
557 typedef v_val_t *v_miter_t;
|
Chris@16
|
558 typedef v_val_t const *v_citer_t;
|
Chris@16
|
559
|
Chris@16
|
560 // Topic:
|
Chris@16
|
561 // 'std::pair' can't contain references
|
Chris@16
|
562 // because of reference to reference problem.
|
Chris@16
|
563
|
Chris@16
|
564 typedef zip_iterator< tuple<k_miter_t, v_miter_t> > mutable_iterator;
|
Chris@16
|
565 typedef zip_iterator< tuple<k_citer_t, v_citer_t> > const_iterator;
|
Chris@16
|
566 };
|
Chris@16
|
567
|
Chris@16
|
568 template< class Iterator, class X >
|
Chris@16
|
569 Iterator begin(X& x)
|
Chris@16
|
570 {
|
Chris@16
|
571 return Iterator(boost::make_tuple(x.m_aKey, x.m_aVal));
|
Chris@16
|
572 }
|
Chris@16
|
573
|
Chris@16
|
574 template< class Iterator, class X >
|
Chris@16
|
575 Iterator end(X& x)
|
Chris@16
|
576 {
|
Chris@16
|
577 return Iterator(boost::make_tuple(x.m_aKey + x.GetSize(), x.m_aVal + x.GetSize()));
|
Chris@16
|
578 }
|
Chris@16
|
579 };
|
Chris@16
|
580
|
Chris@16
|
581
|
Chris@16
|
582 } } // namespace boost::range_detail_microsoft
|
Chris@16
|
583
|
Chris@16
|
584
|
Chris@16
|
585
|
Chris@16
|
586
|
Chris@16
|
587 // range customizations
|
Chris@16
|
588 //
|
Chris@16
|
589
|
Chris@16
|
590
|
Chris@16
|
591 #if !defined(BOOST_RANGE_ATL_NO_COLLECTIONS)
|
Chris@16
|
592
|
Chris@16
|
593
|
Chris@16
|
594 // arrays
|
Chris@16
|
595 //
|
Chris@16
|
596 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
|
Chris@16
|
597 boost::range_detail_microsoft::using_type_as_tag,
|
Chris@16
|
598 (ATL, BOOST_PP_NIL), CAtlArray, 2
|
Chris@16
|
599 )
|
Chris@16
|
600
|
Chris@16
|
601 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
|
Chris@16
|
602 boost::range_detail_microsoft::using_type_as_tag,
|
Chris@16
|
603 (ATL, BOOST_PP_NIL), CAutoPtrArray, 1
|
Chris@16
|
604 )
|
Chris@16
|
605
|
Chris@16
|
606 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
|
Chris@16
|
607 boost::range_detail_microsoft::using_type_as_tag,
|
Chris@16
|
608 (ATL, BOOST_PP_NIL), CInterfaceArray, (class)(const IID *)
|
Chris@16
|
609 )
|
Chris@16
|
610
|
Chris@16
|
611
|
Chris@16
|
612 // lists
|
Chris@16
|
613 //
|
Chris@16
|
614 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
|
Chris@16
|
615 boost::range_detail_microsoft::using_type_as_tag,
|
Chris@16
|
616 (ATL, BOOST_PP_NIL), CAtlList, 2
|
Chris@16
|
617 )
|
Chris@16
|
618
|
Chris@16
|
619 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
|
Chris@16
|
620 boost::range_detail_microsoft::using_type_as_tag,
|
Chris@16
|
621 (ATL, BOOST_PP_NIL), CAutoPtrList, 1
|
Chris@16
|
622 )
|
Chris@16
|
623
|
Chris@16
|
624 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
|
Chris@16
|
625 boost::range_detail_microsoft::using_type_as_tag,
|
Chris@16
|
626 (ATL, BOOST_PP_NIL), CHeapPtrList, 2
|
Chris@16
|
627 )
|
Chris@16
|
628
|
Chris@16
|
629 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
|
Chris@16
|
630 boost::range_detail_microsoft::using_type_as_tag,
|
Chris@16
|
631 (ATL, BOOST_PP_NIL), CInterfaceList, (class)(const IID *)
|
Chris@16
|
632 )
|
Chris@16
|
633
|
Chris@16
|
634
|
Chris@16
|
635 //maps
|
Chris@16
|
636 //
|
Chris@16
|
637 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
|
Chris@16
|
638 boost::range_detail_microsoft::using_type_as_tag,
|
Chris@16
|
639 (ATL, BOOST_PP_NIL), CAtlMap, 4
|
Chris@16
|
640 )
|
Chris@16
|
641
|
Chris@16
|
642 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
|
Chris@16
|
643 boost::range_detail_microsoft::atl_rb_tree_tag,
|
Chris@16
|
644 (ATL, BOOST_PP_NIL), CRBTree, 4
|
Chris@16
|
645 )
|
Chris@16
|
646
|
Chris@16
|
647 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
|
Chris@16
|
648 boost::range_detail_microsoft::atl_rb_tree_tag,
|
Chris@16
|
649 (ATL, BOOST_PP_NIL), CRBMap, 4
|
Chris@16
|
650 )
|
Chris@16
|
651
|
Chris@16
|
652 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
|
Chris@16
|
653 boost::range_detail_microsoft::atl_rb_tree_tag,
|
Chris@16
|
654 (ATL, BOOST_PP_NIL), CRBMultiMap, 4
|
Chris@16
|
655 )
|
Chris@16
|
656
|
Chris@16
|
657
|
Chris@16
|
658 // strings
|
Chris@16
|
659 //
|
Chris@16
|
660 #if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLESTRING)
|
Chris@16
|
661 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
|
Chris@16
|
662 boost::range_detail_microsoft::atl_string_tag,
|
Chris@16
|
663 (ATL, BOOST_PP_NIL), CSimpleStringT, (class)(bool)
|
Chris@16
|
664 )
|
Chris@16
|
665 #else
|
Chris@16
|
666 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
|
Chris@16
|
667 boost::range_detail_microsoft::atl_string_tag,
|
Chris@16
|
668 (ATL, BOOST_PP_NIL), CSimpleStringT, 1
|
Chris@16
|
669 )
|
Chris@16
|
670 #endif
|
Chris@16
|
671
|
Chris@16
|
672 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
|
Chris@16
|
673 boost::range_detail_microsoft::atl_string_tag,
|
Chris@16
|
674 (ATL, BOOST_PP_NIL), CStringT, 2
|
Chris@16
|
675 )
|
Chris@16
|
676
|
Chris@16
|
677 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
|
Chris@16
|
678 boost::range_detail_microsoft::atl_string_tag,
|
Chris@16
|
679 (ATL, BOOST_PP_NIL), CFixedStringT, (class)(int)
|
Chris@16
|
680 )
|
Chris@16
|
681
|
Chris@16
|
682 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
|
Chris@16
|
683 boost::range_detail_microsoft::using_type_as_tag,
|
Chris@16
|
684 (ATL, BOOST_PP_NIL), CStaticString, (class)(const int)
|
Chris@16
|
685 )
|
Chris@16
|
686
|
Chris@16
|
687
|
Chris@16
|
688 #endif // !defined(BOOST_RANGE_ATL_NO_COLLECTIONS)
|
Chris@16
|
689
|
Chris@16
|
690
|
Chris@16
|
691 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
|
Chris@16
|
692 boost::range_detail_microsoft::using_type_as_tag,
|
Chris@16
|
693 (ATL, BOOST_PP_NIL), CComBSTR
|
Chris@16
|
694 )
|
Chris@16
|
695
|
Chris@16
|
696
|
Chris@16
|
697 // simples
|
Chris@16
|
698 //
|
Chris@16
|
699 #if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
|
Chris@16
|
700
|
Chris@16
|
701 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
|
Chris@16
|
702 boost::range_detail_microsoft::using_type_as_tag,
|
Chris@16
|
703 (ATL, BOOST_PP_NIL), CSimpleArray, 2
|
Chris@16
|
704 )
|
Chris@16
|
705
|
Chris@16
|
706 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
|
Chris@16
|
707 boost::range_detail_microsoft::using_type_as_tag,
|
Chris@16
|
708 (ATL, BOOST_PP_NIL), CSimpleMap, 3
|
Chris@16
|
709 )
|
Chris@16
|
710
|
Chris@16
|
711 #else
|
Chris@16
|
712
|
Chris@16
|
713 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
|
Chris@16
|
714 boost::range_detail_microsoft::using_type_as_tag,
|
Chris@16
|
715 (ATL, BOOST_PP_NIL), CSimpleArray, 1
|
Chris@16
|
716 )
|
Chris@16
|
717
|
Chris@16
|
718 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
|
Chris@16
|
719 boost::range_detail_microsoft::using_type_as_tag,
|
Chris@16
|
720 (ATL, BOOST_PP_NIL), CSimpleMap, 2
|
Chris@16
|
721 )
|
Chris@16
|
722
|
Chris@16
|
723 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
|
Chris@16
|
724 boost::range_detail_microsoft::using_type_as_tag,
|
Chris@16
|
725 (ATL, BOOST_PP_NIL), CSimpleValArray, 1
|
Chris@16
|
726 )
|
Chris@16
|
727
|
Chris@16
|
728 #endif // !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
|
Chris@16
|
729
|
Chris@16
|
730
|
Chris@16
|
731
|
Chris@16
|
732
|
Chris@16
|
733 #endif
|