New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
atl.hpp in vendors/XIOS/current/extern/boost/include/boost/range – NEMO

source: vendors/XIOS/current/extern/boost/include/boost/range/atl.hpp @ 3428

Last change on this file since 3428 was 3428, checked in by rblod, 12 years ago

importing initial XIOS vendor drop

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