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