Chris@16: #ifndef BOOST_RANGE_ATL_HPP Chris@16: #define BOOST_RANGE_ATL_HPP Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: // Boost.Range ATL Extension Chris@16: // Chris@16: // Copyright Shunsuke Sogame 2005-2006. Chris@16: // Distributed under the Boost Software License, Version 1.0. Chris@16: // (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: // config Chris@16: // Chris@16: Chris@16: Chris@16: #include // _ATL_VER Chris@16: Chris@16: Chris@16: #if !defined(BOOST_RANGE_ATL_NO_COLLECTIONS) Chris@16: #if (_ATL_VER < 0x0700) Chris@16: #define BOOST_RANGE_ATL_NO_COLLECTIONS Chris@16: #endif Chris@16: #endif Chris@16: Chris@16: Chris@16: #if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX) Chris@16: #if (_ATL_VER < 0x0700) // dubious Chris@16: #define BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX Chris@16: #endif Chris@16: #endif Chris@16: Chris@16: Chris@16: // forward declarations Chris@16: // Chris@16: Chris@16: Chris@16: #include // IID Chris@16: Chris@16: Chris@16: namespace ATL { Chris@16: Chris@16: Chris@16: #if !defined(BOOST_RANGE_ATL_NO_COLLECTIONS) Chris@16: Chris@16: Chris@16: // arrays Chris@16: // Chris@16: template< class E, class ETraits > Chris@16: class CAtlArray; Chris@16: Chris@16: template< class E > Chris@16: class CAutoPtrArray; Chris@16: Chris@16: template< class I, const IID *piid > Chris@16: class CInterfaceArray; Chris@16: Chris@16: Chris@16: // lists Chris@16: // Chris@16: template< class E, class ETraits > Chris@16: class CAtlList; Chris@16: Chris@16: template< class E > Chris@16: class CAutoPtrList; Chris@16: Chris@16: template< class E, class Allocator > Chris@16: class CHeapPtrList; Chris@16: Chris@16: template< class I, const IID *piid > Chris@16: class CInterfaceList; Chris@16: Chris@16: Chris@16: // maps Chris@16: // Chris@16: template< class K, class V, class KTraits, class VTraits > Chris@16: class CAtlMap; Chris@16: Chris@16: template< class K, class V, class KTraits, class VTraits > Chris@16: class CRBTree; Chris@16: Chris@16: template< class K, class V, class KTraits, class VTraits > Chris@16: class CRBMap; Chris@16: Chris@16: template< class K, class V, class KTraits, class VTraits > Chris@16: class CRBMultiMap; Chris@16: Chris@16: Chris@16: // strings Chris@16: // Chris@16: #if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLESTRING) Chris@16: template< class BaseType, bool t_bMFCDLL > Chris@16: class CSimpleStringT; Chris@16: #else Chris@16: template< class BaseType > Chris@16: class CSimpleStringT; Chris@16: #endif Chris@16: Chris@16: template< class BaseType, class StringTraits > Chris@16: class CStringT; Chris@16: Chris@16: template< class StringType, int t_nChars > Chris@16: class CFixedStringT; Chris@16: Chris@16: template< class BaseType, const int t_nSize > Chris@16: class CStaticString; Chris@16: Chris@16: Chris@16: #endif // !defined(BOOST_RANGE_ATL_NO_COLLECTIONS) Chris@16: Chris@16: Chris@16: // simples Chris@16: // Chris@16: #if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX) Chris@16: Chris@16: template< class T, class TEqual > Chris@16: class CSimpleArray; Chris@16: Chris@16: template< class TKey, class TVal, class TEqual > Chris@16: class CSimpleMap; Chris@16: Chris@16: #else Chris@16: Chris@16: template< class T > Chris@16: class CSimpleArray; Chris@16: Chris@16: template< class T > Chris@16: class CSimpleValArray; Chris@16: Chris@16: template< class TKey, class TVal > Chris@16: class CSimpleMap; Chris@16: Chris@16: #endif // !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX) Chris@16: Chris@16: Chris@16: // pointers Chris@16: // Chris@16: template< class E > Chris@16: class CAutoPtr; Chris@16: Chris@16: template< class T > Chris@16: class CComPtr; Chris@16: Chris@16: template< class T, const IID *piid > Chris@16: class CComQIPtr; Chris@16: Chris@16: template< class E, class Allocator > Chris@16: class CHeapPtr; Chris@16: Chris@16: template< class T > Chris@16: class CAdapt; Chris@16: Chris@16: Chris@16: } // namespace ATL Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: // indirect_iterator customizations Chris@16: // Chris@16: Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: Chris@16: namespace boost { Chris@16: Chris@16: Chris@16: template< class E > Chris@16: struct pointee< ATL::CAutoPtr > : Chris@16: mpl::identity Chris@16: { }; Chris@16: Chris@16: template< class T > Chris@16: struct pointee< ATL::CComPtr > : Chris@16: mpl::identity Chris@16: { }; Chris@16: Chris@16: template< class T, const IID *piid > Chris@16: struct pointee< ATL::CComQIPtr > : Chris@16: mpl::identity Chris@16: { }; Chris@16: Chris@16: template< class E, class Allocator > Chris@16: struct pointee< ATL::CHeapPtr > : Chris@16: mpl::identity Chris@16: { }; Chris@16: Chris@16: template< class T > Chris@16: struct pointee< ATL::CAdapt > : Chris@16: pointee Chris@16: { }; Chris@16: Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: // extended customizations Chris@16: // Chris@16: Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include // CComBSTR Chris@16: Chris@16: Chris@16: namespace boost { namespace range_detail_microsoft { Chris@16: Chris@16: Chris@16: #if !defined(BOOST_RANGE_ATL_NO_COLLECTIONS) Chris@16: Chris@16: Chris@16: // arrays Chris@16: // Chris@16: Chris@16: struct atl_array_functions : Chris@16: array_functions Chris@16: { Chris@16: template< class Iterator, class X > Chris@16: Iterator end(X& x) // redefine Chris@16: { Chris@16: return x.GetData() + x.GetCount(); // no 'GetSize()' Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: template< class E, class ETraits > Chris@16: struct customization< ATL::CAtlArray > : Chris@16: atl_array_functions Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: typedef E val_t; Chris@16: Chris@16: typedef val_t *mutable_iterator; Chris@16: typedef val_t const *const_iterator; Chris@16: }; Chris@16: }; Chris@16: Chris@16: Chris@16: template< class E > Chris@16: struct customization< ATL::CAutoPtrArray > : Chris@16: atl_array_functions Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: // ATL::CAutoPtr/CHeapPtr is no assignable. Chris@16: typedef ATL::CAutoPtr val_t; Chris@16: typedef val_t *miter_t; Chris@16: typedef val_t const *citer_t; Chris@16: Chris@16: typedef indirect_iterator mutable_iterator; Chris@16: typedef indirect_iterator const_iterator; Chris@16: }; Chris@16: }; Chris@16: Chris@16: Chris@16: template< class I, const IID *piid > Chris@16: struct customization< ATL::CInterfaceArray > : Chris@16: atl_array_functions Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: typedef ATL::CComQIPtr val_t; Chris@16: Chris@16: typedef val_t *mutable_iterator; Chris@16: typedef val_t const *const_iterator; Chris@16: }; Chris@16: }; Chris@16: Chris@16: Chris@16: template< class E, class ETraits > Chris@16: struct customization< ATL::CAtlList > : Chris@16: list_functions Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: typedef E val_t; Chris@16: Chris@16: typedef list_iterator mutable_iterator; Chris@16: typedef list_iterator const_iterator; Chris@16: }; Chris@16: }; Chris@16: Chris@16: Chris@16: struct indirected_list_functions Chris@16: { Chris@16: template< class Iterator, class X > Chris@16: Iterator begin(X& x) Chris@16: { Chris@16: typedef typename Iterator::base_type base_t; // == list_iterator Chris@16: return Iterator(base_t(x, x.GetHeadPosition())); Chris@16: } Chris@16: Chris@16: template< class Iterator, class X > Chris@16: Iterator end(X& x) Chris@16: { Chris@16: typedef typename Iterator::base_type base_t; Chris@16: return Iterator(base_t(x, POSITION(0))); Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: template< class E > Chris@16: struct customization< ATL::CAutoPtrList > : Chris@16: indirected_list_functions Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: typedef ATL::CAutoPtr val_t; Chris@16: typedef list_iterator miter_t; Chris@16: typedef list_iterator citer_t; Chris@16: Chris@16: typedef indirect_iterator mutable_iterator; Chris@16: typedef indirect_iterator const_iterator; Chris@16: }; Chris@16: }; Chris@16: Chris@16: Chris@16: template< class E, class Allocator > Chris@16: struct customization< ATL::CHeapPtrList > : Chris@16: indirected_list_functions Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: typedef ATL::CHeapPtr val_t; Chris@16: typedef list_iterator miter_t; Chris@16: typedef list_iterator citer_t; Chris@16: Chris@16: typedef indirect_iterator mutable_iterator; Chris@16: typedef indirect_iterator const_iterator; Chris@16: }; Chris@16: }; Chris@16: Chris@16: Chris@16: template< class I, const IID *piid > Chris@16: struct customization< ATL::CInterfaceList > : Chris@16: list_functions Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: typedef ATL::CComQIPtr val_t; Chris@16: Chris@16: typedef list_iterator mutable_iterator; Chris@16: typedef list_iterator const_iterator; Chris@16: }; Chris@16: }; Chris@16: Chris@16: Chris@16: // maps Chris@16: // Chris@16: Chris@16: struct atl_rb_tree_tag Chris@16: { }; Chris@16: Chris@16: template< > Chris@16: struct customization< atl_rb_tree_tag > : Chris@16: indirected_list_functions Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: typedef typename X::CPair val_t; Chris@16: Chris@16: typedef list_iterator miter_t; Chris@16: typedef list_iterator citer_t; Chris@16: Chris@16: typedef indirect_iterator mutable_iterator; Chris@16: typedef indirect_iterator const_iterator; Chris@16: }; Chris@16: }; Chris@16: Chris@16: Chris@16: template< class K, class V, class KTraits, class VTraits > Chris@16: struct customization< ATL::CAtlMap > : Chris@16: customization< atl_rb_tree_tag > Chris@16: { Chris@16: template< class Iterator, class X > Chris@16: Iterator begin(X& x) // redefine Chris@16: { Chris@16: typedef typename Iterator::base_type base_t; // == list_iterator Chris@16: return Iterator(base_t(x, x.GetStartPosition())); // no 'GetHeadPosition' Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: // strings Chris@16: // Chris@16: Chris@16: struct atl_string_tag Chris@16: { }; Chris@16: Chris@16: template< > Chris@16: struct customization< atl_string_tag > Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: typedef typename X::PXSTR mutable_iterator; Chris@16: typedef typename X::PCXSTR const_iterator; Chris@16: }; Chris@16: Chris@16: template< class Iterator, class X > Chris@16: typename mutable_::type begin(X& x) Chris@16: { Chris@16: return x.GetBuffer(0); Chris@16: } Chris@16: Chris@16: template< class Iterator, class X > Chris@16: Iterator begin(X const& x) Chris@16: { Chris@16: return x.GetString(); Chris@16: } Chris@16: Chris@16: template< class Iterator, class X > Chris@16: Iterator end(X& x) Chris@16: { Chris@16: return begin(x) + x.GetLength(); Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: template< class BaseType, const int t_nSize > Chris@16: struct customization< ATL::CStaticString > Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: typedef BaseType const *mutable_iterator; Chris@16: typedef mutable_iterator const_iterator; Chris@16: }; Chris@16: Chris@16: template< class Iterator, class X > Chris@16: Iterator begin(X const& x) Chris@16: { Chris@16: return x; Chris@16: } Chris@16: Chris@16: template< class Iterator, class X > Chris@16: Iterator end(X const& x) Chris@16: { Chris@16: return begin(x) + X::GetLength(); Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: #endif // !defined(BOOST_RANGE_ATL_NO_COLLECTIONS) Chris@16: Chris@16: Chris@16: template< > Chris@16: struct customization< ATL::CComBSTR > Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: typedef OLECHAR *mutable_iterator; Chris@16: typedef OLECHAR const *const_iterator; Chris@16: }; Chris@16: Chris@16: template< class Iterator, class X > Chris@16: Iterator begin(X& x) Chris@16: { Chris@16: return x.operator BSTR(); Chris@16: } Chris@16: Chris@16: template< class Iterator, class X > Chris@16: Iterator end(X& x) Chris@16: { Chris@16: return begin(x) + x.Length(); Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: // simples Chris@16: // Chris@16: Chris@16: #if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX) Chris@16: template< class T, class TEqual > Chris@16: struct customization< ATL::CSimpleArray > : Chris@16: #else Chris@16: template< class T > Chris@16: struct customization< ATL::CSimpleArray > : Chris@16: #endif Chris@16: array_functions Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: typedef T val_t; Chris@16: Chris@16: typedef val_t *mutable_iterator; Chris@16: typedef val_t const *const_iterator; Chris@16: }; Chris@16: }; Chris@16: Chris@16: Chris@16: #if defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX) Chris@16: Chris@16: template< class T > Chris@16: struct customization< ATL::CSimpleValArray > : Chris@16: array_functions Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: typedef T val_t; Chris@16: Chris@16: typedef val_t *mutable_iterator; Chris@16: typedef val_t const *const_iterator; Chris@16: }; Chris@16: }; Chris@16: Chris@16: #endif // defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX) Chris@16: Chris@16: Chris@16: #if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX) Chris@16: template< class TKey, class TVal, class TEqual > Chris@16: struct customization< ATL::CSimpleMap > Chris@16: #else Chris@16: template< class TKey, class TVal > Chris@16: struct customization< ATL::CSimpleMap > Chris@16: #endif Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: typedef TKey k_val_t; Chris@16: typedef k_val_t *k_miter_t; Chris@16: typedef k_val_t const *k_citer_t; Chris@16: Chris@16: typedef TVal v_val_t; Chris@16: typedef v_val_t *v_miter_t; Chris@16: typedef v_val_t const *v_citer_t; Chris@16: Chris@16: // Topic: Chris@16: // 'std::pair' can't contain references Chris@16: // because of reference to reference problem. Chris@16: Chris@16: typedef zip_iterator< tuple > mutable_iterator; Chris@16: typedef zip_iterator< tuple > const_iterator; Chris@16: }; Chris@16: Chris@16: template< class Iterator, class X > Chris@16: Iterator begin(X& x) Chris@16: { Chris@16: return Iterator(boost::make_tuple(x.m_aKey, x.m_aVal)); Chris@16: } Chris@16: Chris@16: template< class Iterator, class X > Chris@16: Iterator end(X& x) Chris@16: { Chris@16: return Iterator(boost::make_tuple(x.m_aKey + x.GetSize(), x.m_aVal + x.GetSize())); Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: } } // namespace boost::range_detail_microsoft Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: // range customizations Chris@16: // Chris@16: Chris@16: Chris@16: #if !defined(BOOST_RANGE_ATL_NO_COLLECTIONS) Chris@16: Chris@16: Chris@16: // arrays Chris@16: // Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE( Chris@16: boost::range_detail_microsoft::using_type_as_tag, Chris@16: (ATL, BOOST_PP_NIL), CAtlArray, 2 Chris@16: ) Chris@16: Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE( Chris@16: boost::range_detail_microsoft::using_type_as_tag, Chris@16: (ATL, BOOST_PP_NIL), CAutoPtrArray, 1 Chris@16: ) Chris@16: Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE( Chris@16: boost::range_detail_microsoft::using_type_as_tag, Chris@16: (ATL, BOOST_PP_NIL), CInterfaceArray, (class)(const IID *) Chris@16: ) Chris@16: Chris@16: Chris@16: // lists Chris@16: // Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE( Chris@16: boost::range_detail_microsoft::using_type_as_tag, Chris@16: (ATL, BOOST_PP_NIL), CAtlList, 2 Chris@16: ) Chris@16: Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE( Chris@16: boost::range_detail_microsoft::using_type_as_tag, Chris@16: (ATL, BOOST_PP_NIL), CAutoPtrList, 1 Chris@16: ) Chris@16: Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE( Chris@16: boost::range_detail_microsoft::using_type_as_tag, Chris@16: (ATL, BOOST_PP_NIL), CHeapPtrList, 2 Chris@16: ) Chris@16: Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE( Chris@16: boost::range_detail_microsoft::using_type_as_tag, Chris@16: (ATL, BOOST_PP_NIL), CInterfaceList, (class)(const IID *) Chris@16: ) Chris@16: Chris@16: Chris@16: //maps Chris@16: // Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE( Chris@16: boost::range_detail_microsoft::using_type_as_tag, Chris@16: (ATL, BOOST_PP_NIL), CAtlMap, 4 Chris@16: ) Chris@16: Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE( Chris@16: boost::range_detail_microsoft::atl_rb_tree_tag, Chris@16: (ATL, BOOST_PP_NIL), CRBTree, 4 Chris@16: ) Chris@16: Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE( Chris@16: boost::range_detail_microsoft::atl_rb_tree_tag, Chris@16: (ATL, BOOST_PP_NIL), CRBMap, 4 Chris@16: ) Chris@16: Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE( Chris@16: boost::range_detail_microsoft::atl_rb_tree_tag, Chris@16: (ATL, BOOST_PP_NIL), CRBMultiMap, 4 Chris@16: ) Chris@16: Chris@16: Chris@16: // strings Chris@16: // Chris@16: #if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLESTRING) Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE( Chris@16: boost::range_detail_microsoft::atl_string_tag, Chris@16: (ATL, BOOST_PP_NIL), CSimpleStringT, (class)(bool) Chris@16: ) Chris@16: #else Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE( Chris@16: boost::range_detail_microsoft::atl_string_tag, Chris@16: (ATL, BOOST_PP_NIL), CSimpleStringT, 1 Chris@16: ) Chris@16: #endif Chris@16: Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE( Chris@16: boost::range_detail_microsoft::atl_string_tag, Chris@16: (ATL, BOOST_PP_NIL), CStringT, 2 Chris@16: ) Chris@16: Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE( Chris@16: boost::range_detail_microsoft::atl_string_tag, Chris@16: (ATL, BOOST_PP_NIL), CFixedStringT, (class)(int) Chris@16: ) Chris@16: Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE( Chris@16: boost::range_detail_microsoft::using_type_as_tag, Chris@16: (ATL, BOOST_PP_NIL), CStaticString, (class)(const int) Chris@16: ) Chris@16: Chris@16: Chris@16: #endif // !defined(BOOST_RANGE_ATL_NO_COLLECTIONS) Chris@16: Chris@16: Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE( Chris@16: boost::range_detail_microsoft::using_type_as_tag, Chris@16: (ATL, BOOST_PP_NIL), CComBSTR Chris@16: ) Chris@16: Chris@16: Chris@16: // simples Chris@16: // Chris@16: #if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX) Chris@16: Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE( Chris@16: boost::range_detail_microsoft::using_type_as_tag, Chris@16: (ATL, BOOST_PP_NIL), CSimpleArray, 2 Chris@16: ) Chris@16: Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE( Chris@16: boost::range_detail_microsoft::using_type_as_tag, Chris@16: (ATL, BOOST_PP_NIL), CSimpleMap, 3 Chris@16: ) Chris@16: Chris@16: #else Chris@16: Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE( Chris@16: boost::range_detail_microsoft::using_type_as_tag, Chris@16: (ATL, BOOST_PP_NIL), CSimpleArray, 1 Chris@16: ) Chris@16: Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE( Chris@16: boost::range_detail_microsoft::using_type_as_tag, Chris@16: (ATL, BOOST_PP_NIL), CSimpleMap, 2 Chris@16: ) Chris@16: Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE( Chris@16: boost::range_detail_microsoft::using_type_as_tag, Chris@16: (ATL, BOOST_PP_NIL), CSimpleValArray, 1 Chris@16: ) Chris@16: Chris@16: #endif // !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX) Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: #endif