Brian Silverman | 598d029 | 2018-08-04 23:56:47 -0700 | [diff] [blame^] | 1 | [/ |
| 2 | Copyright 2010 Neil Groves |
| 3 | Distributed under the Boost Software License, Version 1.0. |
| 4 | (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
| 5 | /] |
| 6 | [def __mfc_collections__ [@http://msdn.microsoft.com/en-us/library/942860sh.aspx MFC Collection Classes]] |
| 7 | [def __atl_collections__ [@http://msdn.microsoft.com/en-us/library/15e672bd.aspx ATL Collection Classes]] |
| 8 | |
| 9 | [section:mfc_atl MFC/ATL (courtesy of Shunsuke Sogame)] |
| 10 | |
| 11 | [h4 Introduction] |
| 12 | This implementation was kindly donated by Shunsuke Sogame. This header adapts MFC and ATL containers to the appropriate Range concepts. |
| 13 | |
| 14 | [table |
| 15 | [] |
| 16 | [[[*Author:]] [Shunsuke Sogame]] |
| 17 | [[[*Contact:]] [mb2act@yahoo.co.jp]] |
| 18 | [[[*Date:]] [26th of May 2006]] |
| 19 | [[[*Copyright:]] [Shunsuke Sogame 2005-2006. Use, modification and distribution is subject to the Boost Software License, Version 1.0]] |
| 20 | ] |
| 21 | |
| 22 | [h4 Overview] |
| 23 | |
| 24 | Boost.Range MFC/ATL Extension provides Boost.Range support for MFC/ATL collection and string types. |
| 25 | |
| 26 | `` |
| 27 | CTypedPtrArray<CPtrArray, CList<CString> *> myArray; |
| 28 | ... |
| 29 | BOOST_FOREACH (CList<CString> *theList, myArray) |
| 30 | { |
| 31 | BOOST_FOREACH (CString& str, *theList) |
| 32 | { |
| 33 | boost::to_upper(str); |
| 34 | std::sort(boost::begin(str), boost::end(str)); |
| 35 | ... |
| 36 | } |
| 37 | } |
| 38 | `` |
| 39 | |
| 40 | [section:requirements Requirements] |
| 41 | |
| 42 | * Boost C++ Libraries Version 1.34.0 or later (no compilation required) |
| 43 | * Visual C++ 7.1 or later (for MFC and ATL) |
| 44 | |
| 45 | [endsect] |
| 46 | |
| 47 | [section:mfc_ranges MFC Ranges] |
| 48 | If the `<boost/range/mfc.hpp>` is included before or after Boost.Range headers, the MFC collections and strings become models of Range. The table below lists the Traversal Category and `range_reference` of MFC ranges. |
| 49 | |
| 50 | [table |
| 51 | [[Range] [Traversal Category] [`range_reference<Range>::type`]] |
| 52 | [[`CArray<T,A>`] [__random_access_range__] [`T&`]] |
| 53 | [[`CList<T,A>`] [__bidirectional_range__] [`T&`]] |
| 54 | [[`CMap<K,AK,M,AM>`] [__forward_range__] [`Range::CPair&`]] |
| 55 | [[`CTypedPtrArray<B,T*>`] [__random_access_range__] [`T* const`]] |
| 56 | [[`CTypedPtrList<B,T*>`] [__bidirectional_range__] [`T* const`]] |
| 57 | [[`CTypedPtrMap<B,T*,V*>`] [__forward_range__] [`std::pair<T*,V*> const`]] |
| 58 | [[`CByteArray`] [__random_access_range__] [`BYTE&`]] |
| 59 | [[`CDWordArray`] [__random_access_range__] [`DWORD&`]] |
| 60 | [[`CObArray`] [__random_access_range__] [`CObject*&`]] |
| 61 | [[`CPtrArray`] [__random_access_range__] [`void*&`]] |
| 62 | [[`CStringArray`] [__random_access_range__] [`CString&`]] |
| 63 | [[`CUIntArray`] [__random_access_range__] [`UINT&`]] |
| 64 | [[`CWordArray`] [__random_access_range__] [`WORD&`]] |
| 65 | [[`CObList`] [__bidirectional_range__] [`CObject*&`]] |
| 66 | [[`CPtrList`] [__bidirectional_range__] [`void*&`]] |
| 67 | [[`CStringList`] [__bidirectional_range__] [`CString&`]] |
| 68 | [[`CMapPtrToWord`] [__forward_range__] [`std::pair<void*,WORD> const`]] |
| 69 | [[`CMapPtrToPtr`] [__forward_range__] [`std::pair<void*,void*> const`]] |
| 70 | [[`CMapStringToOb`] [__forward_range__] [`std::pair<String,CObject*> const`]] |
| 71 | [[`CMapStringToString`] [__forward_range__] [`Range::CPair&`]] |
| 72 | [[`CMapWordToOb`] [__forward_range__] [`std::pair<WORD,CObject*> const`]] |
| 73 | [[`CMapWordToPtr`] [__forward_range__] [`std::pair<WORD,void*> const`]] |
| 74 | ] |
| 75 | |
| 76 | Other Boost.Range metafunctions are defined by the following. Let `Range` be any type listed above and `Ref` be the same as `range_reference<Range>::type`. `range_value<Range>::type` is the same as `remove_reference<remove_const<Ref>::type>::type`, `range_difference<Range>::type` is the same as `std::ptrdiff_t`, and `range_pointer<Range>::type` is the same as `add_pointer<remove_reference<Ref>::type>::type`. As for `const Range`, see below. |
| 77 | |
| 78 | Adam Walling has provided the header `<boost/range/mfc_map.hpp>` to add support |
| 79 | for the map adaptor with MFC map types. |
| 80 | |
| 81 | [endsect] |
| 82 | |
| 83 | [section:atl_ranges ATL Ranges] |
| 84 | |
| 85 | If the `<boost/range/atl.hpp>` is included before or after Boost.Range headers, the ATL collections and strings become models of Range. The table below lists the Traversal Category and `range_reference` of ATL ranges. |
| 86 | |
| 87 | [table |
| 88 | [[Range] [Traversal Category] [`range_reference<Range>::type`]] |
| 89 | [[`CAtlArray<E,ET>`] [__random_access_range__] [`E&`]] |
| 90 | [[`CAutoPtrArray<E>`] [__random_access_range__] [`E&`]] |
| 91 | [[`CInterfaceArray<I,pi>`] [__random_access_range__] [`CComQIPtr<I,pi>&`]] |
| 92 | [[`CAtlList<E,ET>`] [__bidirectional_range__] [`E&`]] |
| 93 | [[`CAutoPtrList<E>`] [__bidirectional_range__] [`E&`]] |
| 94 | [[`CHeapPtrList<E,A>`] [__bidirectional_range__] [`E&`]] |
| 95 | [[`CInterfaceList<I,pi>`] [__bidirectional_range__] [`CComQIPtr<I,pi>&`]] |
| 96 | [[`CAtlMap<K,V,KT,VT>`] [__forward_range__] [`Range::CPair&`]] |
| 97 | [[`CRBTree<K,V,KT,VT>`] [__bidirectional_range__] [`Range::CPair&`]] |
| 98 | [[`CRBMap<K,V,KT,VT>`] [__bidirectional_range__] [`Range::CPair&`]] |
| 99 | [[`CRBMultiMap<K,V,KT,VT>`] [__bidirectional_range__] [`Range::CPair&`]] |
| 100 | [[`CSimpleStringT<B,b>`] [__random_access_range__] [`B&`]] |
| 101 | [[`CStringT<B,ST>`] [__random_access_range__] [`B&`]] |
| 102 | [[`CFixedStringT<S,n>`] [__random_access_range__] [`range_reference<S>::type`]] |
| 103 | [[`CComBSTR`] [__random_access_range__] [`OLECHAR&`]] |
| 104 | [[`CSimpleArray<T,TE>`] [__random_access_range__] [`T&`]] |
| 105 | ] |
| 106 | |
| 107 | Other __boost_range_home__ metafunctions are defined by the following. Let `Range` be any type listed above and `Ref` be the same as `range_reference<Range>::type`. `range_value<Range>::type` is the same as `remove_reference<Ref>::type`, `range_difference<Range>::type` is the same as `std::ptrdiff_t`, and `range_pointer<Range>::type` is the same as `add_pointer<remove_reference<Ref>::type>::type`. As for `const Range`, see below. |
| 108 | |
| 109 | [endsect] |
| 110 | |
| 111 | [section:const_ranges const Ranges] |
| 112 | |
| 113 | `range_reference<const Range>::type` is defined by the following algorithm. Let `Range` be any type listed above and `Ref` be the same as `range_reference<Range>::type`. |
| 114 | |
| 115 | `` |
| 116 | if (Range is CObArray || Range is CObList) |
| 117 | return CObject const * & |
| 118 | else if (Range is CPtrArray || Range is CPtrList) |
| 119 | return void const * & |
| 120 | else if (there is a type X such that X& is the same as Ref) |
| 121 | return X const & |
| 122 | else if (there is a type X such that X* const is the same as Ref) |
| 123 | return X const * const |
| 124 | else |
| 125 | return Ref |
| 126 | `` |
| 127 | |
| 128 | |
| 129 | Other Boost.Range metafunctions are defined by the following. |
| 130 | |
| 131 | [table |
| 132 | [[Range metafunction] [Result]] |
| 133 | [[`range_value<const Range>::type`] [`range_value<Range>::type`]] |
| 134 | [[`range_difference<const Range>::type`] [`std::ptrdiff_t`]] |
| 135 | [[`range_pointer<const Range>::type`] [`add_pointer<remove_reference<range_reference<const Range>::type>::type>::type`]] |
| 136 | ] |
| 137 | |
| 138 | [endsect] |
| 139 | |
| 140 | [section:references References] |
| 141 | |
| 142 | # __boost_range_home__ |
| 143 | # __mfc_collections__ |
| 144 | # __atl_collections__ |
| 145 | |
| 146 | [endsect] |
| 147 | |
| 148 | [endsect] |