source: XIOS/dev/dev_olga/src/extern/boost/include/boost/range/mfc.hpp @ 1022

Last change on this file since 1022 was 1022, checked in by mhnguyen, 7 years ago
File size: 23.8 KB
Line 
1#ifndef BOOST_RANGE_MFC_HPP
2#define BOOST_RANGE_MFC_HPP
3
4
5
6
7// Boost.Range MFC 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 <afx.h> // _MFC_VER
22
23
24#if !defined(BOOST_RANGE_MFC_NO_CPAIR)
25    #if (_MFC_VER < 0x0700) // dubious
26        #define BOOST_RANGE_MFC_NO_CPAIR
27    #endif
28#endif
29
30
31#if !defined(BOOST_RANGE_MFC_HAS_LEGACY_STRING)
32    #if (_MFC_VER < 0x0700) // dubious
33        #define BOOST_RANGE_MFC_HAS_LEGACY_STRING
34    #endif
35#endif
36
37
38// A const collection of old MFC doesn't return const reference.
39//
40#if !defined(BOOST_RANGE_MFC_CONST_COL_RETURNS_NON_REF)
41    #if (_MFC_VER < 0x0700) // dubious
42        #define BOOST_RANGE_MFC_CONST_COL_RETURNS_NON_REF
43    #endif
44#endif
45
46
47
48
49// forward declarations
50//
51
52
53template< class Type, class ArgType >
54class CArray;
55
56template< class Type, class ArgType >
57class CList;
58
59template< class Key, class ArgKey, class Mapped, class ArgMapped >
60class CMap;
61
62template< class BaseClass, class PtrType >
63class CTypedPtrArray;
64
65template< class BaseClass, class PtrType >
66class CTypedPtrList;
67
68template< class BaseClass, class KeyPtrType, class MappedPtrType >
69class CTypedPtrMap;
70
71
72
73
74// extended customizations
75//
76
77
78#include <cstddef> // ptrdiff_t
79#include <utility> // pair
80#include <boost/assert.hpp>
81#include <boost/mpl/if.hpp>
82#include <boost/range/atl.hpp>
83#include <boost/range/begin.hpp>
84#include <boost/range/const_iterator.hpp>
85#include <boost/range/detail/microsoft.hpp>
86#include <boost/range/end.hpp>
87#include <boost/iterator/iterator_adaptor.hpp>
88#include <boost/iterator/iterator_categories.hpp>
89#include <boost/iterator/iterator_facade.hpp>
90#include <boost/iterator/transform_iterator.hpp>
91#include <boost/type_traits/is_const.hpp>
92#include <boost/type_traits/remove_pointer.hpp>
93#include <boost/utility/addressof.hpp>
94#include <afx.h> // legacy CString
95#include <afxcoll.h> // CXXXArray, CXXXList, CMapXXXToXXX
96#include <tchar.h>
97
98
99namespace boost { namespace range_detail_microsoft {
100
101
102    // mfc_ptr_array_iterator
103    //
104    // 'void **' is not convertible to 'void const **',
105    // so we define...
106    //
107
108    template< class ArrayT, class PtrType >
109    struct mfc_ptr_array_iterator;
110
111    template< class ArrayT, class PtrType >
112    struct mfc_ptr_array_iterator_super
113    {
114        typedef iterator_adaptor<
115            mfc_ptr_array_iterator<ArrayT, PtrType>,
116            std::ptrdiff_t, // Base!
117            PtrType,        // Value
118            random_access_traversal_tag,
119            use_default,
120            std::ptrdiff_t  // Difference
121        > type;
122    };
123
124    template< class ArrayT, class PtrType >
125    struct mfc_ptr_array_iterator :
126        mfc_ptr_array_iterator_super<ArrayT, PtrType>::type
127    {
128    private:
129        typedef mfc_ptr_array_iterator self_t;
130        typedef typename mfc_ptr_array_iterator_super<ArrayT, PtrType>::type super_t;
131        typedef typename super_t::reference ref_t;
132
133    public:
134        explicit mfc_ptr_array_iterator()
135        { }
136
137        explicit mfc_ptr_array_iterator(ArrayT& arr, INT_PTR index) :
138            super_t(index), m_parr(boost::addressof(arr))
139        { }
140
141    template< class, class > friend struct mfc_ptr_array_iterator;
142        template< class ArrayT_, class PtrType_ >
143        mfc_ptr_array_iterator(mfc_ptr_array_iterator<ArrayT_, PtrType_> const& other) :
144            super_t(other.base()), m_parr(other.m_parr)
145        { }
146
147    private:
148        ArrayT *m_parr;
149
150    friend class iterator_core_access;
151        ref_t dereference() const
152        {
153            BOOST_ASSERT(0 <= this->base() && this->base() < m_parr->GetSize() && "out of range");
154            return *( m_parr->GetData() + this->base() );
155        }
156
157        bool equal(self_t const& other) const
158        {
159            BOOST_ASSERT(m_parr == other.m_parr && "iterators incompatible");
160            return this->base() == other.base();
161        }
162    };
163
164    struct mfc_ptr_array_functions
165    {
166        template< class Iterator, class X >
167        Iterator begin(X& x)
168        {
169            return Iterator(x, 0);
170        }
171
172        template< class Iterator, class X >
173        Iterator end(X& x)
174        {
175            return Iterator(x, x.GetSize());
176        }
177    };
178
179
180    // arrays
181    //
182
183    template< >
184    struct customization< ::CByteArray > :
185        array_functions
186    {
187        template< class X >
188        struct meta
189        {
190            typedef BYTE val_t;
191
192            typedef val_t *mutable_iterator;
193            typedef val_t const *const_iterator;
194        };
195    };
196
197
198    template< >
199    struct customization< ::CDWordArray > :
200        array_functions
201    {
202        template< class X >
203        struct meta
204        {
205            typedef DWORD val_t;
206
207            typedef val_t *mutable_iterator;
208            typedef val_t const *const_iterator;
209        };
210    };
211
212
213    template< >
214    struct customization< ::CObArray > :
215        mfc_ptr_array_functions
216    {
217        template< class X >
218        struct meta
219        {
220            typedef mfc_ptr_array_iterator<X, CObject *> mutable_iterator;
221            typedef mfc_ptr_array_iterator<X const, CObject const *> const_iterator;
222        };
223    };
224
225
226    template< >
227    struct customization< ::CPtrArray > :
228        mfc_ptr_array_functions
229    {
230        template< class X >
231        struct meta
232        {
233            typedef mfc_ptr_array_iterator<X, void *> mutable_iterator;
234            typedef mfc_ptr_array_iterator<X const, void const *> const_iterator;
235        };
236    };
237
238
239    template< >
240    struct customization< ::CStringArray > :
241        array_functions
242    {
243        template< class X >
244        struct meta
245        {
246            typedef ::CString val_t;
247
248            typedef val_t *mutable_iterator;
249            typedef val_t const *const_iterator;
250        };
251    };
252
253
254    template< >
255    struct customization< ::CUIntArray > :
256        array_functions
257    {
258        template< class X >
259        struct meta
260        {
261            typedef UINT val_t;
262
263            typedef val_t *mutable_iterator;
264            typedef val_t const *const_iterator;
265        };
266    };
267
268
269    template< >
270    struct customization< ::CWordArray > :
271        array_functions
272    {
273        template< class X >
274        struct meta
275        {
276            typedef WORD val_t;
277
278            typedef val_t *mutable_iterator;
279            typedef val_t const *const_iterator;
280        };
281    };
282
283
284    // lists
285    //
286
287    template< >
288    struct customization< ::CObList > :
289        list_functions
290    {
291        template< class X >
292        struct meta
293        {
294            typedef list_iterator<X, ::CObject *> mutable_iterator;
295    #if !defined(BOOST_RANGE_MFC_CONST_COL_RETURNS_NON_REF)
296            typedef list_iterator<X const, ::CObject const *> const_iterator;
297    #else
298            typedef list_iterator<X const, ::CObject const * const, ::CObject const * const> const_iterator;
299    #endif
300        };
301    };
302
303
304    template< >
305    struct customization< ::CPtrList > :
306        list_functions
307    {
308        template< class X >
309        struct meta
310        {
311            typedef list_iterator<X, void *> mutable_iterator;
312    #if !defined(BOOST_RANGE_MFC_CONST_COL_RETURNS_NON_REF)
313            typedef list_iterator<X const, void const *> const_iterator;
314    #else
315            typedef list_iterator<X const, void const * const, void const * const> const_iterator;
316    #endif
317        };
318    };
319
320
321    template< >
322    struct customization< ::CStringList > :
323        list_functions
324    {
325        template< class X >
326        struct meta
327        {
328            typedef ::CString val_t;
329
330            typedef list_iterator<X, val_t> mutable_iterator;
331    #if !defined(BOOST_RANGE_MFC_CONST_COL_RETURNS_NON_REF)
332            typedef list_iterator<X const, val_t const> const_iterator;
333    #else
334            typedef list_iterator<X const, val_t const, val_t const> const_iterator;
335    #endif
336        };
337    };
338
339
340    // mfc_map_iterator
341    //
342
343    template< class MapT, class KeyT, class MappedT >
344    struct mfc_map_iterator;
345
346    template< class MapT, class KeyT, class MappedT >
347    struct mfc_map_iterator_super
348    {
349        typedef iterator_facade<
350            mfc_map_iterator<MapT, KeyT, MappedT>,
351            std::pair<KeyT, MappedT>,
352            forward_traversal_tag,
353            std::pair<KeyT, MappedT> const
354        > type;
355    };
356
357    template< class MapT, class KeyT, class MappedT >
358    struct mfc_map_iterator :
359        mfc_map_iterator_super<MapT, KeyT, MappedT>::type
360    {
361    private:
362        typedef mfc_map_iterator self_t;
363        typedef typename mfc_map_iterator_super<MapT, KeyT, MappedT>::type super_t;
364        typedef typename super_t::reference ref_t;
365
366    public:
367        explicit mfc_map_iterator()
368        { }
369
370        explicit mfc_map_iterator(MapT const& map, POSITION pos) :
371            m_pmap(boost::addressof(map)), m_posNext(pos)
372        {
373            increment();
374        }
375
376        explicit mfc_map_iterator(MapT const& map) :
377            m_pmap(&map), m_pos(0) // end iterator
378        { }
379
380    template< class, class, class > friend struct mfc_map_iterator;
381        template< class MapT_, class KeyT_, class MappedT_>
382        mfc_map_iterator(mfc_map_iterator<MapT_, KeyT_, MappedT_> const& other) :
383            m_pmap(other.m_pmap),
384            m_pos(other.m_pos), m_posNext(other.m_posNext),
385            m_key(other.m_key), m_mapped(other.m_mapped)
386        { }
387
388    private:
389        MapT const *m_pmap;
390        POSITION m_pos, m_posNext;
391        KeyT m_key; MappedT m_mapped;
392
393    friend class iterator_core_access;
394        ref_t dereference() const
395        {
396            BOOST_ASSERT(m_pos != 0 && "out of range");
397            return std::make_pair(m_key, m_mapped);
398        }
399
400        void increment()
401        {
402            BOOST_ASSERT(m_pos != 0 && "out of range");
403
404            if (m_posNext == 0) {
405                m_pos = 0;
406                return;
407            }
408
409            m_pos = m_posNext;
410            m_pmap->GetNextAssoc(m_posNext, m_key, m_mapped);
411        }
412
413        bool equal(self_t const& other) const
414        {
415            BOOST_ASSERT(m_pmap == other.m_pmap && "iterators incompatible");
416            return m_pos == other.m_pos;
417        }
418    };
419
420    struct mfc_map_functions
421    {
422        template< class Iterator, class X >
423        Iterator begin(X& x)
424        {
425            return Iterator(x, x.GetStartPosition());
426        }
427
428        template< class Iterator, class X >
429        Iterator end(X& x)
430        {
431            return Iterator(x);
432        }
433    };
434
435
436#if !defined(BOOST_RANGE_MFC_NO_CPAIR)
437
438
439    // mfc_cpair_map_iterator
440    //
441    // used by ::CMap and ::CMapStringToString
442    //
443
444    template< class MapT, class PairT >
445    struct mfc_cpair_map_iterator;
446
447    template< class MapT, class PairT >
448    struct mfc_pget_map_iterator_super
449    {
450        typedef iterator_facade<
451            mfc_cpair_map_iterator<MapT, PairT>,
452            PairT,
453            forward_traversal_tag
454        > type;
455    };
456
457    template< class MapT, class PairT >
458    struct mfc_cpair_map_iterator :
459        mfc_pget_map_iterator_super<MapT, PairT>::type
460    {
461    private:
462        typedef mfc_cpair_map_iterator self_t;
463        typedef typename mfc_pget_map_iterator_super<MapT, PairT>::type super_t;
464        typedef typename super_t::reference ref_t;
465
466    public:
467        explicit mfc_cpair_map_iterator()
468        { }
469
470        explicit mfc_cpair_map_iterator(MapT& map, PairT *pp) :
471            m_pmap(boost::addressof(map)), m_pp(pp)
472        { }
473
474    template< class, class > friend struct mfc_cpair_map_iterator;
475        template< class MapT_, class PairT_>
476        mfc_cpair_map_iterator(mfc_cpair_map_iterator<MapT_, PairT_> const& other) :
477            m_pmap(other.m_pmap), m_pp(other.m_pp)
478        { }
479
480    private:
481        MapT  *m_pmap;
482        PairT *m_pp;
483
484    friend class iterator_core_access;
485        ref_t dereference() const
486        {
487            BOOST_ASSERT(m_pp != 0 && "out of range");
488            return *m_pp;
489        }
490
491        void increment()
492        {
493            BOOST_ASSERT(m_pp != 0 && "out of range");
494            m_pp = m_pmap->PGetNextAssoc(m_pp);
495        }
496
497        bool equal(self_t const& other) const
498        {
499            BOOST_ASSERT(m_pmap == other.m_pmap && "iterators incompatible");
500            return m_pp == other.m_pp;
501        }
502    };
503
504    struct mfc_cpair_map_functions
505    {
506        template< class Iterator, class X >
507        Iterator begin(X& x)
508        {
509            // Workaround:
510            // Assertion fails if empty.
511            // MFC document is wrong.
512    #if !defined(NDEBUG)
513            if (x.GetCount() == 0) 
514                return Iterator(x, 0);
515    #endif
516
517            return Iterator(x, x.PGetFirstAssoc());
518        }
519
520        template< class Iterator, class X >
521        Iterator end(X& x)
522        {
523            return Iterator(x, 0);
524        }
525    };
526
527
528#endif // !defined(BOOST_RANGE_MFC_NO_CPAIR)
529
530
531    // maps
532    //
533
534    template< >
535    struct customization< ::CMapPtrToWord > :
536        mfc_map_functions
537    {
538        template< class X >
539        struct meta
540        {
541            typedef void *key_t;
542            typedef WORD mapped_t;
543
544            typedef mfc_map_iterator<X, key_t, mapped_t> mutable_iterator;
545            typedef mutable_iterator const_iterator;
546        };
547    };
548
549
550    template< >
551    struct customization< ::CMapPtrToPtr > :
552        mfc_map_functions
553    {
554        template< class X >
555        struct meta
556        {
557            typedef void *key_t;
558            typedef void *mapped_t;
559
560            typedef mfc_map_iterator<X, key_t, mapped_t> mutable_iterator;
561            typedef mutable_iterator const_iterator;
562        };
563    };
564
565
566    template< >
567    struct customization< ::CMapStringToOb > :
568        mfc_map_functions
569    {
570        template< class X >
571        struct meta
572        {
573            typedef ::CString key_t;
574            typedef ::CObject *mapped_t;
575
576            typedef mfc_map_iterator<X, key_t, mapped_t> mutable_iterator;
577            typedef mutable_iterator const_iterator;
578        };
579    };
580
581
582    template< >
583    struct customization< ::CMapStringToPtr > :
584        mfc_map_functions
585    {
586        template< class X >
587        struct meta
588        {
589            typedef ::CString key_t;
590            typedef void *mapped_t;
591
592            typedef mfc_map_iterator<X, key_t, mapped_t> mutable_iterator;
593            typedef mutable_iterator const_iterator;
594        };
595    };
596
597
598    template< >
599    struct customization< ::CMapStringToString > :
600    #if !defined(BOOST_RANGE_MFC_NO_CPAIR)
601        mfc_cpair_map_functions
602    #else
603        mfc_map_functions
604    #endif
605    {
606        template< class X >
607        struct meta
608        {
609    #if !defined(BOOST_RANGE_MFC_NO_CPAIR)
610            typedef typename X::CPair pair_t;
611
612            typedef mfc_cpair_map_iterator<X, pair_t> mutable_iterator;
613            typedef mfc_cpair_map_iterator<X const, pair_t const> const_iterator;
614    #else
615            typedef ::CString key_t;
616            typedef ::CString mapped_t;
617
618            typedef mfc_map_iterator<X, key_t, mapped_t> mutable_iterator;
619            typedef mutable_iterator const_iterator;
620    #endif
621        };
622    };
623
624
625    template< >
626    struct customization< ::CMapWordToOb > :
627        mfc_map_functions
628    {
629        template< class X >
630        struct meta
631        {
632            typedef WORD key_t;
633            typedef ::CObject *mapped_t;
634
635            typedef mfc_map_iterator<X, key_t, mapped_t> mutable_iterator;
636            typedef mutable_iterator const_iterator;
637        };
638    };
639
640
641    template< >
642    struct customization< ::CMapWordToPtr > :
643        mfc_map_functions
644    {
645        template< class X >
646        struct meta
647        {
648            typedef WORD key_t;
649            typedef void *mapped_t;
650
651            typedef mfc_map_iterator<X, key_t, mapped_t> mutable_iterator;
652            typedef mutable_iterator const_iterator;
653        };
654    };
655
656
657    // templates
658    //
659
660    template< class Type, class ArgType >
661    struct customization< ::CArray<Type, ArgType> > :
662        array_functions
663    {
664        template< class X >
665        struct meta
666        {
667            typedef Type val_t;
668
669            typedef val_t *mutable_iterator;
670            typedef val_t const *const_iterator;
671        };
672    };
673
674
675    template< class Type, class ArgType >
676    struct customization< ::CList<Type, ArgType> > :
677        list_functions
678    {
679        template< class X >
680        struct meta
681        {
682            typedef Type val_t;
683
684            typedef list_iterator<X, val_t> mutable_iterator;
685    #if !defined(BOOST_RANGE_MFC_CONST_COL_RETURNS_NON_REF)
686            typedef list_iterator<X const, val_t const> const_iterator;
687    #else
688            typedef list_iterator<X const, val_t const, val_t const> const_iterator;
689    #endif
690        };
691    };
692
693
694    template< class Key, class ArgKey, class Mapped, class ArgMapped >
695    struct customization< ::CMap<Key, ArgKey, Mapped, ArgMapped> > :
696    #if !defined(BOOST_RANGE_MFC_NO_CPAIR)
697        mfc_cpair_map_functions
698    #else
699        mfc_map_functions
700    #endif
701    {
702        template< class X >
703        struct meta
704        {
705    #if !defined(BOOST_RANGE_MFC_NO_CPAIR)
706            typedef typename X::CPair pair_t;
707
708            typedef mfc_cpair_map_iterator<X, pair_t> mutable_iterator;
709            typedef mfc_cpair_map_iterator<X const, pair_t const> const_iterator;
710    #else
711            typedef Key key_t;
712            typedef Mapped mapped_t;
713
714            typedef mfc_map_iterator<X, key_t, mapped_t> mutable_iterator;
715            typedef mutable_iterator const_iterator;
716    #endif           
717        };
718    };
719
720
721    template< class BaseClass, class PtrType >
722    struct customization< ::CTypedPtrArray<BaseClass, PtrType> >
723    {
724        template< class X >
725        struct fun
726        {
727            typedef typename remove_pointer<PtrType>::type val_t;
728
729            typedef typename mpl::if_< is_const<X>,
730                val_t const,
731                val_t
732            >::type val_t_;
733
734            typedef val_t_ * const result_type;
735
736            template< class PtrType_ >
737            result_type operator()(PtrType_ p) const
738            {
739                return static_cast<result_type>(p);
740            }
741        };
742
743        template< class X >
744        struct meta
745        {
746            typedef typename compatible_mutable_iterator<BaseClass>::type miter_t;
747            typedef typename range_const_iterator<BaseClass>::type citer_t;
748
749            typedef transform_iterator<fun<X>, miter_t> mutable_iterator;
750            typedef transform_iterator<fun<X const>, citer_t> const_iterator;
751        };
752
753        template< class Iterator, class X >
754        Iterator begin(X& x)
755        {
756            return Iterator(boost::begin<BaseClass>(x), fun<X>());
757        }
758
759        template< class Iterator, class X >
760        Iterator end(X& x)
761        {
762            return Iterator(boost::end<BaseClass>(x), fun<X>());
763        }
764    };
765
766
767    template< class BaseClass, class PtrType >
768    struct customization< ::CTypedPtrList<BaseClass, PtrType> > :
769        list_functions
770    {
771        template< class X >
772        struct meta
773        {
774            typedef typename remove_pointer<PtrType>::type val_t;
775
776            // not l-value
777            typedef list_iterator<X, val_t * const, val_t * const> mutable_iterator;
778            typedef list_iterator<X const, val_t const * const, val_t const * const> const_iterator;
779        };
780    };
781
782
783    template< class BaseClass, class KeyPtrType, class MappedPtrType >
784    struct customization< ::CTypedPtrMap<BaseClass, KeyPtrType, MappedPtrType> > :
785        mfc_map_functions
786    {
787        template< class X >
788        struct meta
789        {
790            typedef mfc_map_iterator<X, KeyPtrType, MappedPtrType> mutable_iterator;
791            typedef mutable_iterator const_iterator;
792        };
793    };
794
795
796    // strings
797    //
798
799#if defined(BOOST_RANGE_MFC_HAS_LEGACY_STRING)
800
801    template< >
802    struct customization< ::CString >
803    {
804        template< class X >
805        struct meta
806        {
807            // LPTSTR/LPCTSTR is not always defined in <tchar.h>.
808            typedef TCHAR *mutable_iterator;
809            typedef TCHAR const *const_iterator;
810        };
811
812        template< class Iterator, class X >
813        typename mutable_<Iterator, X>::type begin(X& x)
814        {
815            return x.GetBuffer(0);
816        }
817
818        template< class Iterator, class X >
819        Iterator begin(X const& x)
820        {
821            return x;
822        }
823
824        template< class Iterator, class X >
825        Iterator end(X& x)
826        {
827            return begin<Iterator>(x) + x.GetLength();
828        }
829    };
830
831#endif // defined(BOOST_RANGE_MFC_HAS_LEGACY_STRING)
832
833
834} } // namespace boost::range_detail_microsoft
835
836
837
838
839// range customizations
840//
841
842
843// arrays
844//
845BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
846    boost::range_detail_microsoft::using_type_as_tag,
847    BOOST_PP_NIL, CByteArray
848)
849
850BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
851    boost::range_detail_microsoft::using_type_as_tag,
852    BOOST_PP_NIL, CDWordArray
853)
854
855BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
856    boost::range_detail_microsoft::using_type_as_tag,
857    BOOST_PP_NIL, CStringArray
858)
859
860BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
861    boost::range_detail_microsoft::using_type_as_tag,
862    BOOST_PP_NIL, CUIntArray
863)
864
865BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
866    boost::range_detail_microsoft::using_type_as_tag,
867    BOOST_PP_NIL, CWordArray
868)
869
870
871// lists
872//
873BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
874    boost::range_detail_microsoft::using_type_as_tag,
875    BOOST_PP_NIL, CObList
876)
877
878BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
879    boost::range_detail_microsoft::using_type_as_tag,
880    BOOST_PP_NIL, CPtrList
881)
882
883BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
884    boost::range_detail_microsoft::using_type_as_tag,
885    BOOST_PP_NIL, CStringList
886)
887
888BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
889    boost::range_detail_microsoft::using_type_as_tag,
890    BOOST_PP_NIL, CObArray
891)
892
893BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
894    boost::range_detail_microsoft::using_type_as_tag,
895    BOOST_PP_NIL, CPtrArray
896)
897
898
899// maps
900//
901BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
902    boost::range_detail_microsoft::using_type_as_tag,
903    BOOST_PP_NIL, CMapPtrToWord
904)
905
906BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
907    boost::range_detail_microsoft::using_type_as_tag,
908    BOOST_PP_NIL, CMapPtrToPtr
909)
910
911BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
912    boost::range_detail_microsoft::using_type_as_tag,
913    BOOST_PP_NIL, CMapStringToOb
914)
915
916BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
917    boost::range_detail_microsoft::using_type_as_tag,
918    BOOST_PP_NIL, CMapStringToPtr
919)
920
921BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
922    boost::range_detail_microsoft::using_type_as_tag,
923    BOOST_PP_NIL, CMapStringToString
924)
925
926BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
927    boost::range_detail_microsoft::using_type_as_tag,
928    BOOST_PP_NIL, CMapWordToOb
929)
930
931BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
932    boost::range_detail_microsoft::using_type_as_tag,
933    BOOST_PP_NIL, CMapWordToPtr
934)
935
936
937// templates
938//
939BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
940    boost::range_detail_microsoft::using_type_as_tag,
941    BOOST_PP_NIL, CArray, 2
942)
943
944BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
945    boost::range_detail_microsoft::using_type_as_tag,
946    BOOST_PP_NIL, CList, 2
947)
948
949BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
950    boost::range_detail_microsoft::using_type_as_tag,
951    BOOST_PP_NIL, CMap, 4
952)
953
954BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
955    boost::range_detail_microsoft::using_type_as_tag,
956    BOOST_PP_NIL, CTypedPtrArray, 2
957)
958
959BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
960    boost::range_detail_microsoft::using_type_as_tag,
961    BOOST_PP_NIL, CTypedPtrList, 2
962)
963
964BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
965    boost::range_detail_microsoft::using_type_as_tag,
966    BOOST_PP_NIL, CTypedPtrMap, 3
967)
968
969
970// strings
971//
972#if defined(BOOST_RANGE_MFC_HAS_LEGACY_STRING)
973
974    BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
975        boost::range_detail_microsoft::using_type_as_tag,
976        BOOST_PP_NIL, CString
977    )
978
979#endif
980
981
982
983
984#endif
Note: See TracBrowser for help on using the repository browser.