Chris@16: #ifndef BOOST_RANGE_MFC_HPP Chris@16: #define BOOST_RANGE_MFC_HPP Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: // Boost.Range MFC 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 // _MFC_VER Chris@16: Chris@16: Chris@16: #if !defined(BOOST_RANGE_MFC_NO_CPAIR) Chris@16: #if (_MFC_VER < 0x0700) // dubious Chris@16: #define BOOST_RANGE_MFC_NO_CPAIR Chris@16: #endif Chris@16: #endif Chris@16: Chris@16: Chris@16: #if !defined(BOOST_RANGE_MFC_HAS_LEGACY_STRING) Chris@16: #if (_MFC_VER < 0x0700) // dubious Chris@16: #define BOOST_RANGE_MFC_HAS_LEGACY_STRING Chris@16: #endif Chris@16: #endif Chris@16: Chris@16: Chris@16: // A const collection of old MFC doesn't return const reference. Chris@16: // Chris@16: #if !defined(BOOST_RANGE_MFC_CONST_COL_RETURNS_NON_REF) Chris@16: #if (_MFC_VER < 0x0700) // dubious Chris@16: #define BOOST_RANGE_MFC_CONST_COL_RETURNS_NON_REF Chris@16: #endif Chris@16: #endif Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: // forward declarations Chris@16: // Chris@16: Chris@16: Chris@16: template< class Type, class ArgType > Chris@16: class CArray; Chris@16: Chris@16: template< class Type, class ArgType > Chris@16: class CList; Chris@16: Chris@16: template< class Key, class ArgKey, class Mapped, class ArgMapped > Chris@16: class CMap; Chris@16: Chris@16: template< class BaseClass, class PtrType > Chris@16: class CTypedPtrArray; Chris@16: Chris@16: template< class BaseClass, class PtrType > Chris@16: class CTypedPtrList; Chris@16: Chris@16: template< class BaseClass, class KeyPtrType, class MappedPtrType > Chris@16: class CTypedPtrMap; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: // extended customizations Chris@16: // Chris@16: Chris@16: Chris@16: #include // ptrdiff_t Chris@16: #include // pair Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include // legacy CString Chris@16: #include // CXXXArray, CXXXList, CMapXXXToXXX Chris@16: #include Chris@16: Chris@16: Chris@16: namespace boost { namespace range_detail_microsoft { Chris@16: Chris@16: Chris@16: // mfc_ptr_array_iterator Chris@16: // Chris@16: // 'void **' is not convertible to 'void const **', Chris@16: // so we define... Chris@16: // Chris@16: Chris@16: template< class ArrayT, class PtrType > Chris@16: struct mfc_ptr_array_iterator; Chris@16: Chris@16: template< class ArrayT, class PtrType > Chris@16: struct mfc_ptr_array_iterator_super Chris@16: { Chris@16: typedef iterator_adaptor< Chris@16: mfc_ptr_array_iterator, Chris@16: std::ptrdiff_t, // Base! Chris@16: PtrType, // Value Chris@16: random_access_traversal_tag, Chris@16: use_default, Chris@16: std::ptrdiff_t // Difference Chris@16: > type; Chris@16: }; Chris@16: Chris@16: template< class ArrayT, class PtrType > Chris@16: struct mfc_ptr_array_iterator : Chris@16: mfc_ptr_array_iterator_super::type Chris@16: { Chris@16: private: Chris@16: typedef mfc_ptr_array_iterator self_t; Chris@16: typedef typename mfc_ptr_array_iterator_super::type super_t; Chris@16: typedef typename super_t::reference ref_t; Chris@16: Chris@16: public: Chris@16: explicit mfc_ptr_array_iterator() Chris@16: { } Chris@16: Chris@16: explicit mfc_ptr_array_iterator(ArrayT& arr, INT_PTR index) : Chris@16: super_t(index), m_parr(boost::addressof(arr)) Chris@16: { } Chris@16: Chris@16: template< class, class > friend struct mfc_ptr_array_iterator; Chris@16: template< class ArrayT_, class PtrType_ > Chris@16: mfc_ptr_array_iterator(mfc_ptr_array_iterator const& other) : Chris@16: super_t(other.base()), m_parr(other.m_parr) Chris@16: { } Chris@16: Chris@16: private: Chris@16: ArrayT *m_parr; Chris@16: Chris@16: friend class iterator_core_access; Chris@16: ref_t dereference() const Chris@16: { Chris@16: BOOST_ASSERT(0 <= this->base() && this->base() < m_parr->GetSize() && "out of range"); Chris@16: return *( m_parr->GetData() + this->base() ); Chris@16: } Chris@16: Chris@16: bool equal(self_t const& other) const Chris@16: { Chris@16: BOOST_ASSERT(m_parr == other.m_parr && "iterators incompatible"); Chris@16: return this->base() == other.base(); Chris@16: } Chris@16: }; Chris@16: Chris@16: struct mfc_ptr_array_functions Chris@16: { Chris@16: template< class Iterator, class X > Chris@16: Iterator begin(X& x) Chris@16: { Chris@16: return Iterator(x, 0); Chris@16: } Chris@16: Chris@16: template< class Iterator, class X > Chris@16: Iterator end(X& x) Chris@16: { Chris@16: return Iterator(x, x.GetSize()); Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: // arrays Chris@16: // Chris@16: Chris@16: template< > Chris@16: struct customization< ::CByteArray > : Chris@16: array_functions Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: typedef BYTE 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< > Chris@16: struct customization< ::CDWordArray > : Chris@16: array_functions Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: typedef DWORD 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< > Chris@16: struct customization< ::CObArray > : Chris@16: mfc_ptr_array_functions Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: typedef mfc_ptr_array_iterator mutable_iterator; Chris@16: typedef mfc_ptr_array_iterator const_iterator; Chris@16: }; Chris@16: }; Chris@16: Chris@16: Chris@16: template< > Chris@16: struct customization< ::CPtrArray > : Chris@16: mfc_ptr_array_functions Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: typedef mfc_ptr_array_iterator mutable_iterator; Chris@16: typedef mfc_ptr_array_iterator const_iterator; Chris@16: }; Chris@16: }; Chris@16: Chris@16: Chris@16: template< > Chris@16: struct customization< ::CStringArray > : Chris@16: array_functions Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: typedef ::CString 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< > Chris@16: struct customization< ::CUIntArray > : Chris@16: array_functions Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: typedef UINT 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< > Chris@16: struct customization< ::CWordArray > : Chris@16: array_functions Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: typedef WORD 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: // lists Chris@16: // Chris@16: Chris@16: template< > Chris@16: struct customization< ::CObList > : Chris@16: list_functions Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: typedef list_iterator mutable_iterator; Chris@16: #if !defined(BOOST_RANGE_MFC_CONST_COL_RETURNS_NON_REF) Chris@16: typedef list_iterator const_iterator; Chris@16: #else Chris@16: typedef list_iterator const_iterator; Chris@16: #endif Chris@16: }; Chris@16: }; Chris@16: Chris@16: Chris@16: template< > Chris@16: struct customization< ::CPtrList > : Chris@16: list_functions Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: typedef list_iterator mutable_iterator; Chris@16: #if !defined(BOOST_RANGE_MFC_CONST_COL_RETURNS_NON_REF) Chris@16: typedef list_iterator const_iterator; Chris@16: #else Chris@16: typedef list_iterator const_iterator; Chris@16: #endif Chris@16: }; Chris@16: }; Chris@16: Chris@16: Chris@16: template< > Chris@16: struct customization< ::CStringList > : Chris@16: list_functions Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: typedef ::CString val_t; Chris@16: Chris@16: typedef list_iterator mutable_iterator; Chris@16: #if !defined(BOOST_RANGE_MFC_CONST_COL_RETURNS_NON_REF) Chris@16: typedef list_iterator const_iterator; Chris@16: #else Chris@16: typedef list_iterator const_iterator; Chris@16: #endif Chris@16: }; Chris@16: }; Chris@16: Chris@16: Chris@16: // mfc_map_iterator Chris@16: // Chris@16: Chris@16: template< class MapT, class KeyT, class MappedT > Chris@16: struct mfc_map_iterator; Chris@16: Chris@16: template< class MapT, class KeyT, class MappedT > Chris@16: struct mfc_map_iterator_super Chris@16: { Chris@16: typedef iterator_facade< Chris@16: mfc_map_iterator, Chris@16: std::pair, Chris@16: forward_traversal_tag, Chris@16: std::pair const Chris@16: > type; Chris@16: }; Chris@16: Chris@16: template< class MapT, class KeyT, class MappedT > Chris@16: struct mfc_map_iterator : Chris@16: mfc_map_iterator_super::type Chris@16: { Chris@16: private: Chris@16: typedef mfc_map_iterator self_t; Chris@16: typedef typename mfc_map_iterator_super::type super_t; Chris@16: typedef typename super_t::reference ref_t; Chris@16: Chris@16: public: Chris@16: explicit mfc_map_iterator() Chris@16: { } Chris@16: Chris@16: explicit mfc_map_iterator(MapT const& map, POSITION pos) : Chris@16: m_pmap(boost::addressof(map)), m_posNext(pos) Chris@16: { Chris@16: increment(); Chris@16: } Chris@16: Chris@16: explicit mfc_map_iterator(MapT const& map) : Chris@16: m_pmap(&map), m_pos(0) // end iterator Chris@16: { } Chris@16: Chris@16: template< class, class, class > friend struct mfc_map_iterator; Chris@16: template< class MapT_, class KeyT_, class MappedT_> Chris@16: mfc_map_iterator(mfc_map_iterator const& other) : Chris@16: m_pmap(other.m_pmap), Chris@16: m_pos(other.m_pos), m_posNext(other.m_posNext), Chris@16: m_key(other.m_key), m_mapped(other.m_mapped) Chris@16: { } Chris@16: Chris@16: private: Chris@16: MapT const *m_pmap; Chris@16: POSITION m_pos, m_posNext; Chris@16: KeyT m_key; MappedT m_mapped; Chris@16: Chris@16: friend class iterator_core_access; Chris@16: ref_t dereference() const Chris@16: { Chris@16: BOOST_ASSERT(m_pos != 0 && "out of range"); Chris@16: return std::make_pair(m_key, m_mapped); Chris@16: } Chris@16: Chris@16: void increment() Chris@16: { Chris@16: BOOST_ASSERT(m_pos != 0 && "out of range"); Chris@16: Chris@16: if (m_posNext == 0) { Chris@16: m_pos = 0; Chris@16: return; Chris@16: } Chris@16: Chris@16: m_pos = m_posNext; Chris@16: m_pmap->GetNextAssoc(m_posNext, m_key, m_mapped); Chris@16: } Chris@16: Chris@16: bool equal(self_t const& other) const Chris@16: { Chris@16: BOOST_ASSERT(m_pmap == other.m_pmap && "iterators incompatible"); Chris@16: return m_pos == other.m_pos; Chris@16: } Chris@16: }; Chris@16: Chris@16: struct mfc_map_functions Chris@16: { Chris@16: template< class Iterator, class X > Chris@16: Iterator begin(X& x) Chris@16: { Chris@16: return Iterator(x, x.GetStartPosition()); Chris@16: } Chris@16: Chris@16: template< class Iterator, class X > Chris@16: Iterator end(X& x) Chris@16: { Chris@16: return Iterator(x); Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: #if !defined(BOOST_RANGE_MFC_NO_CPAIR) Chris@16: Chris@16: Chris@16: // mfc_cpair_map_iterator Chris@16: // Chris@16: // used by ::CMap and ::CMapStringToString Chris@16: // Chris@16: Chris@16: template< class MapT, class PairT > Chris@16: struct mfc_cpair_map_iterator; Chris@16: Chris@16: template< class MapT, class PairT > Chris@16: struct mfc_pget_map_iterator_super Chris@16: { Chris@16: typedef iterator_facade< Chris@16: mfc_cpair_map_iterator, Chris@16: PairT, Chris@16: forward_traversal_tag Chris@16: > type; Chris@16: }; Chris@16: Chris@16: template< class MapT, class PairT > Chris@16: struct mfc_cpair_map_iterator : Chris@16: mfc_pget_map_iterator_super::type Chris@16: { Chris@16: private: Chris@16: typedef mfc_cpair_map_iterator self_t; Chris@16: typedef typename mfc_pget_map_iterator_super::type super_t; Chris@16: typedef typename super_t::reference ref_t; Chris@16: Chris@16: public: Chris@16: explicit mfc_cpair_map_iterator() Chris@16: { } Chris@16: Chris@16: explicit mfc_cpair_map_iterator(MapT& map, PairT *pp) : Chris@16: m_pmap(boost::addressof(map)), m_pp(pp) Chris@16: { } Chris@16: Chris@16: template< class, class > friend struct mfc_cpair_map_iterator; Chris@16: template< class MapT_, class PairT_> Chris@16: mfc_cpair_map_iterator(mfc_cpair_map_iterator const& other) : Chris@16: m_pmap(other.m_pmap), m_pp(other.m_pp) Chris@16: { } Chris@16: Chris@16: private: Chris@16: MapT *m_pmap; Chris@16: PairT *m_pp; Chris@16: Chris@16: friend class iterator_core_access; Chris@16: ref_t dereference() const Chris@16: { Chris@16: BOOST_ASSERT(m_pp != 0 && "out of range"); Chris@16: return *m_pp; Chris@16: } Chris@16: Chris@16: void increment() Chris@16: { Chris@16: BOOST_ASSERT(m_pp != 0 && "out of range"); Chris@16: m_pp = m_pmap->PGetNextAssoc(m_pp); Chris@16: } Chris@16: Chris@16: bool equal(self_t const& other) const Chris@16: { Chris@16: BOOST_ASSERT(m_pmap == other.m_pmap && "iterators incompatible"); Chris@16: return m_pp == other.m_pp; Chris@16: } Chris@16: }; Chris@16: Chris@16: struct mfc_cpair_map_functions Chris@16: { Chris@16: template< class Iterator, class X > Chris@16: Iterator begin(X& x) Chris@16: { Chris@16: // Workaround: Chris@16: // Assertion fails if empty. Chris@16: // MFC document is wrong. Chris@16: #if !defined(NDEBUG) Chris@16: if (x.GetCount() == 0) Chris@16: return Iterator(x, 0); Chris@16: #endif Chris@16: Chris@16: return Iterator(x, x.PGetFirstAssoc()); Chris@16: } Chris@16: Chris@16: template< class Iterator, class X > Chris@16: Iterator end(X& x) Chris@16: { Chris@16: return Iterator(x, 0); Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: #endif // !defined(BOOST_RANGE_MFC_NO_CPAIR) Chris@16: Chris@16: Chris@16: // maps Chris@16: // Chris@16: Chris@16: template< > Chris@16: struct customization< ::CMapPtrToWord > : Chris@16: mfc_map_functions Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: typedef void *key_t; Chris@16: typedef WORD mapped_t; Chris@16: Chris@16: typedef mfc_map_iterator mutable_iterator; Chris@16: typedef mutable_iterator const_iterator; Chris@16: }; Chris@16: }; Chris@16: Chris@16: Chris@16: template< > Chris@16: struct customization< ::CMapPtrToPtr > : Chris@16: mfc_map_functions Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: typedef void *key_t; Chris@16: typedef void *mapped_t; Chris@16: Chris@16: typedef mfc_map_iterator mutable_iterator; Chris@16: typedef mutable_iterator const_iterator; Chris@16: }; Chris@16: }; Chris@16: Chris@16: Chris@16: template< > Chris@16: struct customization< ::CMapStringToOb > : Chris@16: mfc_map_functions Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: typedef ::CString key_t; Chris@16: typedef ::CObject *mapped_t; Chris@16: Chris@16: typedef mfc_map_iterator mutable_iterator; Chris@16: typedef mutable_iterator const_iterator; Chris@16: }; Chris@16: }; Chris@16: Chris@16: Chris@16: template< > Chris@16: struct customization< ::CMapStringToPtr > : Chris@16: mfc_map_functions Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: typedef ::CString key_t; Chris@16: typedef void *mapped_t; Chris@16: Chris@16: typedef mfc_map_iterator mutable_iterator; Chris@16: typedef mutable_iterator const_iterator; Chris@16: }; Chris@16: }; Chris@16: Chris@16: Chris@16: template< > Chris@16: struct customization< ::CMapStringToString > : Chris@16: #if !defined(BOOST_RANGE_MFC_NO_CPAIR) Chris@16: mfc_cpair_map_functions Chris@16: #else Chris@16: mfc_map_functions Chris@16: #endif Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: #if !defined(BOOST_RANGE_MFC_NO_CPAIR) Chris@16: typedef typename X::CPair pair_t; Chris@16: Chris@16: typedef mfc_cpair_map_iterator mutable_iterator; Chris@16: typedef mfc_cpair_map_iterator const_iterator; Chris@16: #else Chris@16: typedef ::CString key_t; Chris@16: typedef ::CString mapped_t; Chris@16: Chris@16: typedef mfc_map_iterator mutable_iterator; Chris@16: typedef mutable_iterator const_iterator; Chris@16: #endif Chris@16: }; Chris@16: }; Chris@16: Chris@16: Chris@16: template< > Chris@16: struct customization< ::CMapWordToOb > : Chris@16: mfc_map_functions Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: typedef WORD key_t; Chris@16: typedef ::CObject *mapped_t; Chris@16: Chris@16: typedef mfc_map_iterator mutable_iterator; Chris@16: typedef mutable_iterator const_iterator; Chris@16: }; Chris@16: }; Chris@16: Chris@16: Chris@16: template< > Chris@16: struct customization< ::CMapWordToPtr > : Chris@16: mfc_map_functions Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: typedef WORD key_t; Chris@16: typedef void *mapped_t; Chris@16: Chris@16: typedef mfc_map_iterator mutable_iterator; Chris@16: typedef mutable_iterator const_iterator; Chris@16: }; Chris@16: }; Chris@16: Chris@16: Chris@16: // templates Chris@16: // Chris@16: Chris@16: template< class Type, class ArgType > Chris@16: struct customization< ::CArray > : Chris@16: array_functions Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: typedef Type 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 Type, class ArgType > Chris@16: struct customization< ::CList > : Chris@16: list_functions Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: typedef Type val_t; Chris@16: Chris@16: typedef list_iterator mutable_iterator; Chris@16: #if !defined(BOOST_RANGE_MFC_CONST_COL_RETURNS_NON_REF) Chris@16: typedef list_iterator const_iterator; Chris@16: #else Chris@16: typedef list_iterator const_iterator; Chris@16: #endif Chris@16: }; Chris@16: }; Chris@16: Chris@16: Chris@16: template< class Key, class ArgKey, class Mapped, class ArgMapped > Chris@16: struct customization< ::CMap > : Chris@16: #if !defined(BOOST_RANGE_MFC_NO_CPAIR) Chris@16: mfc_cpair_map_functions Chris@16: #else Chris@16: mfc_map_functions Chris@16: #endif Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: #if !defined(BOOST_RANGE_MFC_NO_CPAIR) Chris@16: typedef typename X::CPair pair_t; Chris@16: Chris@16: typedef mfc_cpair_map_iterator mutable_iterator; Chris@16: typedef mfc_cpair_map_iterator const_iterator; Chris@16: #else Chris@16: typedef Key key_t; Chris@16: typedef Mapped mapped_t; Chris@16: Chris@16: typedef mfc_map_iterator mutable_iterator; Chris@16: typedef mutable_iterator const_iterator; Chris@16: #endif Chris@16: }; Chris@16: }; Chris@16: Chris@16: Chris@16: template< class BaseClass, class PtrType > Chris@16: struct customization< ::CTypedPtrArray > Chris@16: { Chris@16: template< class X > Chris@16: struct fun Chris@16: { Chris@16: typedef typename remove_pointer::type val_t; Chris@16: Chris@16: typedef typename mpl::if_< is_const, Chris@16: val_t const, Chris@16: val_t Chris@16: >::type val_t_; Chris@16: Chris@16: typedef val_t_ * const result_type; Chris@16: Chris@16: template< class PtrType_ > Chris@16: result_type operator()(PtrType_ p) const Chris@16: { Chris@16: return static_cast(p); Chris@16: } Chris@16: }; Chris@16: Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: typedef typename compatible_mutable_iterator::type miter_t; Chris@16: typedef typename range_const_iterator::type citer_t; Chris@16: Chris@16: typedef transform_iterator, miter_t> mutable_iterator; Chris@16: typedef transform_iterator, citer_t> 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::begin(x), fun()); Chris@16: } Chris@16: Chris@16: template< class Iterator, class X > Chris@16: Iterator end(X& x) Chris@16: { Chris@16: return Iterator(boost::end(x), fun()); Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: template< class BaseClass, class PtrType > Chris@16: struct customization< ::CTypedPtrList > : Chris@16: list_functions Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: typedef typename remove_pointer::type val_t; Chris@16: Chris@16: // not l-value Chris@16: typedef list_iterator mutable_iterator; Chris@16: typedef list_iterator const_iterator; Chris@16: }; Chris@16: }; Chris@16: Chris@16: Chris@16: template< class BaseClass, class KeyPtrType, class MappedPtrType > Chris@16: struct customization< ::CTypedPtrMap > : Chris@16: mfc_map_functions Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: typedef mfc_map_iterator mutable_iterator; Chris@16: typedef mutable_iterator const_iterator; Chris@16: }; Chris@16: }; Chris@16: Chris@16: Chris@16: // strings Chris@16: // Chris@16: Chris@16: #if defined(BOOST_RANGE_MFC_HAS_LEGACY_STRING) Chris@16: Chris@16: template< > Chris@16: struct customization< ::CString > Chris@16: { Chris@16: template< class X > Chris@16: struct meta Chris@16: { Chris@16: // LPTSTR/LPCTSTR is not always defined in . Chris@16: typedef TCHAR *mutable_iterator; Chris@16: typedef TCHAR const *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; 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: #endif // defined(BOOST_RANGE_MFC_HAS_LEGACY_STRING) 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: // arrays Chris@16: // Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE( Chris@16: boost::range_detail_microsoft::using_type_as_tag, Chris@16: BOOST_PP_NIL, CByteArray Chris@16: ) Chris@16: Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE( Chris@16: boost::range_detail_microsoft::using_type_as_tag, Chris@16: BOOST_PP_NIL, CDWordArray Chris@16: ) Chris@16: Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE( Chris@16: boost::range_detail_microsoft::using_type_as_tag, Chris@16: BOOST_PP_NIL, CStringArray Chris@16: ) Chris@16: Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE( Chris@16: boost::range_detail_microsoft::using_type_as_tag, Chris@16: BOOST_PP_NIL, CUIntArray Chris@16: ) Chris@16: Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE( Chris@16: boost::range_detail_microsoft::using_type_as_tag, Chris@16: BOOST_PP_NIL, CWordArray Chris@16: ) Chris@16: Chris@16: Chris@16: // lists Chris@16: // Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE( Chris@16: boost::range_detail_microsoft::using_type_as_tag, Chris@16: BOOST_PP_NIL, CObList Chris@16: ) Chris@16: Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE( Chris@16: boost::range_detail_microsoft::using_type_as_tag, Chris@16: BOOST_PP_NIL, CPtrList Chris@16: ) Chris@16: Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE( Chris@16: boost::range_detail_microsoft::using_type_as_tag, Chris@16: BOOST_PP_NIL, CStringList Chris@16: ) Chris@16: Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE( Chris@16: boost::range_detail_microsoft::using_type_as_tag, Chris@16: BOOST_PP_NIL, CObArray Chris@16: ) Chris@16: Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE( Chris@16: boost::range_detail_microsoft::using_type_as_tag, Chris@16: BOOST_PP_NIL, CPtrArray Chris@16: ) Chris@16: Chris@16: Chris@16: // maps Chris@16: // Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE( Chris@16: boost::range_detail_microsoft::using_type_as_tag, Chris@16: BOOST_PP_NIL, CMapPtrToWord Chris@16: ) Chris@16: Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE( Chris@16: boost::range_detail_microsoft::using_type_as_tag, Chris@16: BOOST_PP_NIL, CMapPtrToPtr Chris@16: ) Chris@16: Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE( Chris@16: boost::range_detail_microsoft::using_type_as_tag, Chris@16: BOOST_PP_NIL, CMapStringToOb Chris@16: ) Chris@16: Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE( Chris@16: boost::range_detail_microsoft::using_type_as_tag, Chris@16: BOOST_PP_NIL, CMapStringToPtr Chris@16: ) Chris@16: Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE( Chris@16: boost::range_detail_microsoft::using_type_as_tag, Chris@16: BOOST_PP_NIL, CMapStringToString Chris@16: ) Chris@16: Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE( Chris@16: boost::range_detail_microsoft::using_type_as_tag, Chris@16: BOOST_PP_NIL, CMapWordToOb Chris@16: ) Chris@16: Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE( Chris@16: boost::range_detail_microsoft::using_type_as_tag, Chris@16: BOOST_PP_NIL, CMapWordToPtr Chris@16: ) Chris@16: Chris@16: Chris@16: // templates Chris@16: // Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE( Chris@16: boost::range_detail_microsoft::using_type_as_tag, Chris@16: BOOST_PP_NIL, CArray, 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: BOOST_PP_NIL, CList, 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: BOOST_PP_NIL, CMap, 4 Chris@16: ) Chris@16: Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE( Chris@16: boost::range_detail_microsoft::using_type_as_tag, Chris@16: BOOST_PP_NIL, CTypedPtrArray, 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: BOOST_PP_NIL, CTypedPtrList, 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: BOOST_PP_NIL, CTypedPtrMap, 3 Chris@16: ) Chris@16: Chris@16: Chris@16: // strings Chris@16: // Chris@16: #if defined(BOOST_RANGE_MFC_HAS_LEGACY_STRING) Chris@16: Chris@16: BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE( Chris@16: boost::range_detail_microsoft::using_type_as_tag, Chris@16: BOOST_PP_NIL, CString Chris@16: ) Chris@16: Chris@16: #endif Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: #endif