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 #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
47 // forward declarations
51 #include <basetyps.h> // IID
57 #if !defined(BOOST_RANGE_ATL_NO_COLLECTIONS)
62 template< class E, class ETraits >
68 template< class I, const IID *piid >
69 class CInterfaceArray;
74 template< class E, class ETraits >
80 template< class E, class Allocator >
83 template< class I, const IID *piid >
89 template< class K, class V, class KTraits, class VTraits >
92 template< class K, class V, class KTraits, class VTraits >
95 template< class K, class V, class KTraits, class VTraits >
98 template< class K, class V, class KTraits, class VTraits >
104 #if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLESTRING)
105 template< class BaseType, bool t_bMFCDLL >
106 class CSimpleStringT;
108 template< class BaseType >
109 class CSimpleStringT;
112 template< class BaseType, class StringTraits >
115 template< class StringType, int t_nChars >
118 template< class BaseType, const int t_nSize >
122 #endif // !defined(BOOST_RANGE_ATL_NO_COLLECTIONS)
127 #if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
129 template< class T, class TEqual >
132 template< class TKey, class TVal, class TEqual >
141 class CSimpleValArray;
143 template< class TKey, class TVal >
146 #endif // !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
157 template< class T, const IID *piid >
160 template< class E, class Allocator >
172 // indirect_iterator customizations
176 #include <boost/mpl/identity.hpp>
177 #include <boost/pointee.hpp>
184 struct pointee< ATL::CAutoPtr<E> > :
189 struct pointee< ATL::CComPtr<T> > :
193 template< class T, const IID *piid >
194 struct pointee< ATL::CComQIPtr<T, piid> > :
198 template< class E, class Allocator >
199 struct pointee< ATL::CHeapPtr<E, Allocator> > :
204 struct pointee< ATL::CAdapt<T> > :
214 // extended customizations
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
225 namespace boost { namespace range_detail_microsoft {
228 #if !defined(BOOST_RANGE_ATL_NO_COLLECTIONS)
234 struct atl_array_functions :
237 template< class Iterator, class X >
238 Iterator end(X& x) // redefine
240 return x.GetData() + x.GetCount(); // no 'GetSize()'
245 template< class E, class ETraits >
246 struct customization< ATL::CAtlArray<E, ETraits> > :
254 typedef val_t *mutable_iterator;
255 typedef val_t const *const_iterator;
261 struct customization< ATL::CAutoPtrArray<E> > :
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;
272 typedef indirect_iterator<miter_t> mutable_iterator;
273 typedef indirect_iterator<citer_t> const_iterator;
278 template< class I, const IID *piid >
279 struct customization< ATL::CInterfaceArray<I, piid> > :
285 typedef ATL::CComQIPtr<I, piid> val_t;
287 typedef val_t *mutable_iterator;
288 typedef val_t const *const_iterator;
293 template< class E, class ETraits >
294 struct customization< ATL::CAtlList<E, ETraits> > :
302 typedef list_iterator<X, val_t> mutable_iterator;
303 typedef list_iterator<X const, val_t const> const_iterator;
308 struct indirected_list_functions
310 template< class Iterator, class X >
313 typedef typename Iterator::base_type base_t; // == list_iterator
314 return Iterator(base_t(x, x.GetHeadPosition()));
317 template< class Iterator, class X >
320 typedef typename Iterator::base_type base_t;
321 return Iterator(base_t(x, POSITION(0)));
327 struct customization< ATL::CAutoPtrList<E> > :
328 indirected_list_functions
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;
337 typedef indirect_iterator<miter_t> mutable_iterator;
338 typedef indirect_iterator<citer_t> const_iterator;
343 template< class E, class Allocator >
344 struct customization< ATL::CHeapPtrList<E, Allocator> > :
345 indirected_list_functions
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;
354 typedef indirect_iterator<miter_t> mutable_iterator;
355 typedef indirect_iterator<citer_t> const_iterator;
360 template< class I, const IID *piid >
361 struct customization< ATL::CInterfaceList<I, piid> > :
367 typedef ATL::CComQIPtr<I, piid> val_t;
369 typedef list_iterator<X, val_t> mutable_iterator;
370 typedef list_iterator<X const, val_t const> const_iterator;
378 struct atl_rb_tree_tag
382 struct customization< atl_rb_tree_tag > :
383 indirected_list_functions
388 typedef typename X::CPair val_t;
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;
393 typedef indirect_iterator<miter_t> mutable_iterator;
394 typedef indirect_iterator<citer_t> const_iterator;
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 >
403 template< class Iterator, class X >
404 Iterator begin(X& x) // redefine
406 typedef typename Iterator::base_type base_t; // == list_iterator
407 return Iterator(base_t(x, x.GetStartPosition())); // no 'GetHeadPosition'
415 struct atl_string_tag
419 struct customization< atl_string_tag >
424 typedef typename X::PXSTR mutable_iterator;
425 typedef typename X::PCXSTR const_iterator;
428 template< class Iterator, class X >
429 typename mutable_<Iterator, X>::type begin(X& x)
431 return x.GetBuffer(0);
434 template< class Iterator, class X >
435 Iterator begin(X const& x)
437 return x.GetString();
440 template< class Iterator, class X >
443 return begin<Iterator>(x) + x.GetLength();
448 template< class BaseType, const int t_nSize >
449 struct customization< ATL::CStaticString<BaseType, t_nSize> >
454 typedef BaseType const *mutable_iterator;
455 typedef mutable_iterator const_iterator;
458 template< class Iterator, class X >
459 Iterator begin(X const& x)
464 template< class Iterator, class X >
465 Iterator end(X const& x)
467 return begin<Iterator>(x) + X::GetLength();
472 #endif // !defined(BOOST_RANGE_ATL_NO_COLLECTIONS)
476 struct customization< ATL::CComBSTR >
481 typedef OLECHAR *mutable_iterator;
482 typedef OLECHAR const *const_iterator;
485 template< class Iterator, class X >
488 return x.operator BSTR();
491 template< class Iterator, class X >
494 return begin<Iterator>(x) + x.Length();
502 #if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
503 template< class T, class TEqual >
504 struct customization< ATL::CSimpleArray<T, TEqual> > :
507 struct customization< ATL::CSimpleArray<T> > :
516 typedef val_t *mutable_iterator;
517 typedef val_t const *const_iterator;
522 #if defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
525 struct customization< ATL::CSimpleValArray<T> > :
533 typedef val_t *mutable_iterator;
534 typedef val_t const *const_iterator;
538 #endif // defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
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> >
545 template< class TKey, class TVal >
546 struct customization< ATL::CSimpleMap<TKey, TVal> >
552 typedef TKey k_val_t;
553 typedef k_val_t *k_miter_t;
554 typedef k_val_t const *k_citer_t;
556 typedef TVal v_val_t;
557 typedef v_val_t *v_miter_t;
558 typedef v_val_t const *v_citer_t;
561 // 'std::pair' can't contain references
562 // because of reference to reference problem.
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;
568 template< class Iterator, class X >
571 return Iterator(boost::make_tuple(x.m_aKey, x.m_aVal));
574 template< class Iterator, class X >
577 return Iterator(boost::make_tuple(x.m_aKey + x.GetSize(), x.m_aVal + x.GetSize()));
582 } } // namespace boost::range_detail_microsoft
587 // range customizations
591 #if !defined(BOOST_RANGE_ATL_NO_COLLECTIONS)
596 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
597 boost::range_detail_microsoft::using_type_as_tag,
598 (ATL, BOOST_PP_NIL), CAtlArray, 2
601 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
602 boost::range_detail_microsoft::using_type_as_tag,
603 (ATL, BOOST_PP_NIL), CAutoPtrArray, 1
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 *)
614 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
615 boost::range_detail_microsoft::using_type_as_tag,
616 (ATL, BOOST_PP_NIL), CAtlList, 2
619 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
620 boost::range_detail_microsoft::using_type_as_tag,
621 (ATL, BOOST_PP_NIL), CAutoPtrList, 1
624 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
625 boost::range_detail_microsoft::using_type_as_tag,
626 (ATL, BOOST_PP_NIL), CHeapPtrList, 2
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 *)
637 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
638 boost::range_detail_microsoft::using_type_as_tag,
639 (ATL, BOOST_PP_NIL), CAtlMap, 4
642 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
643 boost::range_detail_microsoft::atl_rb_tree_tag,
644 (ATL, BOOST_PP_NIL), CRBTree, 4
647 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
648 boost::range_detail_microsoft::atl_rb_tree_tag,
649 (ATL, BOOST_PP_NIL), CRBMap, 4
652 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
653 boost::range_detail_microsoft::atl_rb_tree_tag,
654 (ATL, BOOST_PP_NIL), CRBMultiMap, 4
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)
666 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
667 boost::range_detail_microsoft::atl_string_tag,
668 (ATL, BOOST_PP_NIL), CSimpleStringT, 1
672 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
673 boost::range_detail_microsoft::atl_string_tag,
674 (ATL, BOOST_PP_NIL), CStringT, 2
677 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
678 boost::range_detail_microsoft::atl_string_tag,
679 (ATL, BOOST_PP_NIL), CFixedStringT, (class)(int)
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)
688 #endif // !defined(BOOST_RANGE_ATL_NO_COLLECTIONS)
691 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
692 boost::range_detail_microsoft::using_type_as_tag,
693 (ATL, BOOST_PP_NIL), CComBSTR
699 #if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
701 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
702 boost::range_detail_microsoft::using_type_as_tag,
703 (ATL, BOOST_PP_NIL), CSimpleArray, 2
706 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
707 boost::range_detail_microsoft::using_type_as_tag,
708 (ATL, BOOST_PP_NIL), CSimpleMap, 3
713 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
714 boost::range_detail_microsoft::using_type_as_tag,
715 (ATL, BOOST_PP_NIL), CSimpleArray, 1
718 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
719 boost::range_detail_microsoft::using_type_as_tag,
720 (ATL, BOOST_PP_NIL), CSimpleMap, 2
723 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
724 boost::range_detail_microsoft::using_type_as_tag,
725 (ATL, BOOST_PP_NIL), CSimpleValArray, 1
728 #endif // !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)