1 #ifndef BOOST_RANGE_ATL_HPP
2 #define BOOST_RANGE_ATL_HPP
7 // Boost.Range ATL Extension
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)
21 #include <atldef.h> // _ATL_VER
24 #if !defined(BOOST_RANGE_ATL_NO_COLLECTIONS)
25 #if (_ATL_VER < 0x0700)
26 #define BOOST_RANGE_ATL_NO_COLLECTIONS
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
38 // forward declarations
42 #include <basetyps.h> // IID
48 #if !defined(BOOST_RANGE_ATL_NO_COLLECTIONS)
53 template< class E, class ETraits >
59 template< class I, const IID *piid >
60 class CInterfaceArray;
65 template< class E, class ETraits >
71 template< class E, class Allocator >
74 template< class I, const IID *piid >
80 template< class K, class V, class KTraits, class VTraits >
83 template< class K, class V, class KTraits, class VTraits >
86 template< class K, class V, class KTraits, class VTraits >
89 template< class K, class V, class KTraits, class VTraits >
95 #if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLESTRING)
96 template< class BaseType, bool t_bMFCDLL >
99 template< class BaseType >
100 class CSimpleStringT;
103 template< class BaseType, class StringTraits >
106 template< class StringType, int t_nChars >
109 template< class BaseType, const int t_nSize >
113 #endif // !defined(BOOST_RANGE_ATL_NO_COLLECTIONS)
118 #if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
120 template< class T, class TEqual >
123 template< class TKey, class TVal, class TEqual >
132 class CSimpleValArray;
134 template< class TKey, class TVal >
137 #endif // !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
148 template< class T, const IID *piid >
151 template< class E, class Allocator >
163 // indirect_iterator customizations
167 #include <boost/mpl/identity.hpp>
168 #include <boost/pointee.hpp>
175 struct pointee< ATL::CAutoPtr<E> > :
180 struct pointee< ATL::CComPtr<T> > :
184 template< class T, const IID *piid >
185 struct pointee< ATL::CComQIPtr<T, piid> > :
189 template< class E, class Allocator >
190 struct pointee< ATL::CHeapPtr<E, Allocator> > :
195 struct pointee< ATL::CAdapt<T> > :
205 // extended customizations
209 #include <boost/iterator/indirect_iterator.hpp>
210 #include <boost/iterator/zip_iterator.hpp>
211 #include <boost/range/detail/microsoft.hpp>
212 #include <boost/tuple/tuple.hpp>
213 #include <atlbase.h> // CComBSTR
216 namespace boost { namespace range_detail_microsoft {
219 #if !defined(BOOST_RANGE_ATL_NO_COLLECTIONS)
225 struct atl_array_functions :
228 template< class Iterator, class X >
229 Iterator end(X& x) // redefine
231 return x.GetData() + x.GetCount(); // no 'GetSize()'
236 template< class E, class ETraits >
237 struct customization< ATL::CAtlArray<E, ETraits> > :
245 typedef val_t *mutable_iterator;
246 typedef val_t const *const_iterator;
252 struct customization< ATL::CAutoPtrArray<E> > :
258 // ATL::CAutoPtr/CHeapPtr is no assignable.
259 typedef ATL::CAutoPtr<E> val_t;
260 typedef val_t *miter_t;
261 typedef val_t const *citer_t;
263 typedef indirect_iterator<miter_t> mutable_iterator;
264 typedef indirect_iterator<citer_t> const_iterator;
269 template< class I, const IID *piid >
270 struct customization< ATL::CInterfaceArray<I, piid> > :
276 typedef ATL::CComQIPtr<I, piid> val_t;
278 typedef val_t *mutable_iterator;
279 typedef val_t const *const_iterator;
284 template< class E, class ETraits >
285 struct customization< ATL::CAtlList<E, ETraits> > :
293 typedef list_iterator<X, val_t> mutable_iterator;
294 typedef list_iterator<X const, val_t const> const_iterator;
299 struct indirected_list_functions
301 template< class Iterator, class X >
304 typedef typename Iterator::base_type base_t; // == list_iterator
305 return Iterator(base_t(x, x.GetHeadPosition()));
308 template< class Iterator, class X >
311 typedef typename Iterator::base_type base_t;
312 return Iterator(base_t(x, POSITION(0)));
318 struct customization< ATL::CAutoPtrList<E> > :
319 indirected_list_functions
324 typedef ATL::CAutoPtr<E> val_t;
325 typedef list_iterator<X, val_t> miter_t;
326 typedef list_iterator<X const, val_t const> citer_t;
328 typedef indirect_iterator<miter_t> mutable_iterator;
329 typedef indirect_iterator<citer_t> const_iterator;
334 template< class E, class Allocator >
335 struct customization< ATL::CHeapPtrList<E, Allocator> > :
336 indirected_list_functions
341 typedef ATL::CHeapPtr<E, Allocator> val_t;
342 typedef list_iterator<X, val_t> miter_t;
343 typedef list_iterator<X const, val_t const> citer_t;
345 typedef indirect_iterator<miter_t> mutable_iterator;
346 typedef indirect_iterator<citer_t> const_iterator;
351 template< class I, const IID *piid >
352 struct customization< ATL::CInterfaceList<I, piid> > :
358 typedef ATL::CComQIPtr<I, piid> val_t;
360 typedef list_iterator<X, val_t> mutable_iterator;
361 typedef list_iterator<X const, val_t const> const_iterator;
369 struct atl_rb_tree_tag
373 struct customization< atl_rb_tree_tag > :
374 indirected_list_functions
379 typedef typename X::CPair val_t;
381 typedef list_iterator<X, val_t *, val_t *> miter_t;
382 typedef list_iterator<X const, val_t const *, val_t const *> citer_t;
384 typedef indirect_iterator<miter_t> mutable_iterator;
385 typedef indirect_iterator<citer_t> const_iterator;
390 template< class K, class V, class KTraits, class VTraits >
391 struct customization< ATL::CAtlMap<K, V, KTraits, VTraits> > :
392 customization< atl_rb_tree_tag >
394 template< class Iterator, class X >
395 Iterator begin(X& x) // redefine
397 typedef typename Iterator::base_type base_t; // == list_iterator
398 return Iterator(base_t(x, x.GetStartPosition())); // no 'GetHeadPosition'
406 struct atl_string_tag
410 struct customization< atl_string_tag >
415 typedef typename X::PXSTR mutable_iterator;
416 typedef typename X::PCXSTR const_iterator;
419 template< class Iterator, class X >
420 typename mutable_<Iterator, X>::type begin(X& x)
422 return x.GetBuffer(0);
425 template< class Iterator, class X >
426 Iterator begin(X const& x)
428 return x.GetString();
431 template< class Iterator, class X >
434 return begin<Iterator>(x) + x.GetLength();
439 template< class BaseType, const int t_nSize >
440 struct customization< ATL::CStaticString<BaseType, t_nSize> >
445 typedef BaseType const *mutable_iterator;
446 typedef mutable_iterator const_iterator;
449 template< class Iterator, class X >
450 Iterator begin(X const& x)
455 template< class Iterator, class X >
456 Iterator end(X const& x)
458 return begin<Iterator>(x) + X::GetLength();
463 #endif // !defined(BOOST_RANGE_ATL_NO_COLLECTIONS)
467 struct customization< ATL::CComBSTR >
472 typedef OLECHAR *mutable_iterator;
473 typedef OLECHAR const *const_iterator;
476 template< class Iterator, class X >
479 return x.operator BSTR();
482 template< class Iterator, class X >
485 return begin<Iterator>(x) + x.Length();
493 #if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
494 template< class T, class TEqual >
495 struct customization< ATL::CSimpleArray<T, TEqual> > :
498 struct customization< ATL::CSimpleArray<T> > :
507 typedef val_t *mutable_iterator;
508 typedef val_t const *const_iterator;
513 #if defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
516 struct customization< ATL::CSimpleValArray<T> > :
524 typedef val_t *mutable_iterator;
525 typedef val_t const *const_iterator;
529 #endif // defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
532 #if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
533 template< class TKey, class TVal, class TEqual >
534 struct customization< ATL::CSimpleMap<TKey, TVal, TEqual> >
536 template< class TKey, class TVal >
537 struct customization< ATL::CSimpleMap<TKey, TVal> >
543 typedef TKey k_val_t;
544 typedef k_val_t *k_miter_t;
545 typedef k_val_t const *k_citer_t;
547 typedef TVal v_val_t;
548 typedef v_val_t *v_miter_t;
549 typedef v_val_t const *v_citer_t;
552 // 'std::pair' can't contain references
553 // because of reference to reference problem.
555 typedef zip_iterator< tuple<k_miter_t, v_miter_t> > mutable_iterator;
556 typedef zip_iterator< tuple<k_citer_t, v_citer_t> > const_iterator;
559 template< class Iterator, class X >
562 return Iterator(boost::make_tuple(x.m_aKey, x.m_aVal));
565 template< class Iterator, class X >
568 return Iterator(boost::make_tuple(x.m_aKey + x.GetSize(), x.m_aVal + x.GetSize()));
573 } } // namespace boost::range_detail_microsoft
578 // range customizations
582 #if !defined(BOOST_RANGE_ATL_NO_COLLECTIONS)
587 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
588 boost::range_detail_microsoft::using_type_as_tag,
589 (ATL, BOOST_PP_NIL), CAtlArray, 2
592 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
593 boost::range_detail_microsoft::using_type_as_tag,
594 (ATL, BOOST_PP_NIL), CAutoPtrArray, 1
597 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
598 boost::range_detail_microsoft::using_type_as_tag,
599 (ATL, BOOST_PP_NIL), CInterfaceArray, (class)(const IID *)
605 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
606 boost::range_detail_microsoft::using_type_as_tag,
607 (ATL, BOOST_PP_NIL), CAtlList, 2
610 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
611 boost::range_detail_microsoft::using_type_as_tag,
612 (ATL, BOOST_PP_NIL), CAutoPtrList, 1
615 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
616 boost::range_detail_microsoft::using_type_as_tag,
617 (ATL, BOOST_PP_NIL), CHeapPtrList, 2
620 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
621 boost::range_detail_microsoft::using_type_as_tag,
622 (ATL, BOOST_PP_NIL), CInterfaceList, (class)(const IID *)
628 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
629 boost::range_detail_microsoft::using_type_as_tag,
630 (ATL, BOOST_PP_NIL), CAtlMap, 4
633 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
634 boost::range_detail_microsoft::atl_rb_tree_tag,
635 (ATL, BOOST_PP_NIL), CRBTree, 4
638 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
639 boost::range_detail_microsoft::atl_rb_tree_tag,
640 (ATL, BOOST_PP_NIL), CRBMap, 4
643 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
644 boost::range_detail_microsoft::atl_rb_tree_tag,
645 (ATL, BOOST_PP_NIL), CRBMultiMap, 4
651 #if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLESTRING)
652 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
653 boost::range_detail_microsoft::atl_string_tag,
654 (ATL, BOOST_PP_NIL), CSimpleStringT, (class)(bool)
657 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
658 boost::range_detail_microsoft::atl_string_tag,
659 (ATL, BOOST_PP_NIL), CSimpleStringT, 1
663 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
664 boost::range_detail_microsoft::atl_string_tag,
665 (ATL, BOOST_PP_NIL), CStringT, 2
668 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
669 boost::range_detail_microsoft::atl_string_tag,
670 (ATL, BOOST_PP_NIL), CFixedStringT, (class)(int)
673 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
674 boost::range_detail_microsoft::using_type_as_tag,
675 (ATL, BOOST_PP_NIL), CStaticString, (class)(const int)
679 #endif // !defined(BOOST_RANGE_ATL_NO_COLLECTIONS)
682 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
683 boost::range_detail_microsoft::using_type_as_tag,
684 (ATL, BOOST_PP_NIL), CComBSTR
690 #if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
692 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
693 boost::range_detail_microsoft::using_type_as_tag,
694 (ATL, BOOST_PP_NIL), CSimpleArray, 2
697 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
698 boost::range_detail_microsoft::using_type_as_tag,
699 (ATL, BOOST_PP_NIL), CSimpleMap, 3
704 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
705 boost::range_detail_microsoft::using_type_as_tag,
706 (ATL, BOOST_PP_NIL), CSimpleArray, 1
709 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
710 boost::range_detail_microsoft::using_type_as_tag,
711 (ATL, BOOST_PP_NIL), CSimpleMap, 2
714 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
715 boost::range_detail_microsoft::using_type_as_tag,
716 (ATL, BOOST_PP_NIL), CSimpleValArray, 1
719 #endif // !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)