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