]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/boost/range/mfc.hpp
update sources to v12.2.3
[ceph.git] / ceph / src / boost / boost / range / mfc.hpp
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
53 template< class Type, class ArgType >
54 class CArray;
55
56 template< class Type, class ArgType >
57 class CList;
58
59 template< class Key, class ArgKey, class Mapped, class ArgMapped >
60 class CMap;
61
62 template< class BaseClass, class PtrType >
63 class CTypedPtrArray;
64
65 template< class BaseClass, class PtrType >
66 class CTypedPtrList;
67
68 template< class BaseClass, class KeyPtrType, class MappedPtrType >
69 class 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
99 namespace 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 //
845 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
846 boost::range_detail_microsoft::using_type_as_tag,
847 BOOST_PP_NIL, CByteArray
848 )
849
850 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
851 boost::range_detail_microsoft::using_type_as_tag,
852 BOOST_PP_NIL, CDWordArray
853 )
854
855 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
856 boost::range_detail_microsoft::using_type_as_tag,
857 BOOST_PP_NIL, CStringArray
858 )
859
860 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
861 boost::range_detail_microsoft::using_type_as_tag,
862 BOOST_PP_NIL, CUIntArray
863 )
864
865 BOOST_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 //
873 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
874 boost::range_detail_microsoft::using_type_as_tag,
875 BOOST_PP_NIL, CObList
876 )
877
878 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
879 boost::range_detail_microsoft::using_type_as_tag,
880 BOOST_PP_NIL, CPtrList
881 )
882
883 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
884 boost::range_detail_microsoft::using_type_as_tag,
885 BOOST_PP_NIL, CStringList
886 )
887
888 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
889 boost::range_detail_microsoft::using_type_as_tag,
890 BOOST_PP_NIL, CObArray
891 )
892
893 BOOST_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 //
901 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
902 boost::range_detail_microsoft::using_type_as_tag,
903 BOOST_PP_NIL, CMapPtrToWord
904 )
905
906 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
907 boost::range_detail_microsoft::using_type_as_tag,
908 BOOST_PP_NIL, CMapPtrToPtr
909 )
910
911 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
912 boost::range_detail_microsoft::using_type_as_tag,
913 BOOST_PP_NIL, CMapStringToOb
914 )
915
916 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
917 boost::range_detail_microsoft::using_type_as_tag,
918 BOOST_PP_NIL, CMapStringToPtr
919 )
920
921 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
922 boost::range_detail_microsoft::using_type_as_tag,
923 BOOST_PP_NIL, CMapStringToString
924 )
925
926 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
927 boost::range_detail_microsoft::using_type_as_tag,
928 BOOST_PP_NIL, CMapWordToOb
929 )
930
931 BOOST_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 //
939 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
940 boost::range_detail_microsoft::using_type_as_tag,
941 BOOST_PP_NIL, CArray, 2
942 )
943
944 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
945 boost::range_detail_microsoft::using_type_as_tag,
946 BOOST_PP_NIL, CList, 2
947 )
948
949 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
950 boost::range_detail_microsoft::using_type_as_tag,
951 BOOST_PP_NIL, CMap, 4
952 )
953
954 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
955 boost::range_detail_microsoft::using_type_as_tag,
956 BOOST_PP_NIL, CTypedPtrArray, 2
957 )
958
959 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
960 boost::range_detail_microsoft::using_type_as_tag,
961 BOOST_PP_NIL, CTypedPtrList, 2
962 )
963
964 BOOST_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