From 194f357eeb5957e430b740f68cf4f8b10e59eee8 Mon Sep 17 00:00:00 2001 From: Neil Groves Date: Tue, 4 Mar 2014 13:33:59 +0000 Subject: [PATCH] trac 6685 - MFC range map adaptor. --- doc/mfc_atl.qbk | 4 ++ doc/upgrade.qbk | 11 +++ include/boost/range/mfc_map.hpp | 114 ++++++++++++++++++++++++++++++++ 3 files changed, 129 insertions(+) create mode 100644 include/boost/range/mfc_map.hpp diff --git a/doc/mfc_atl.qbk b/doc/mfc_atl.qbk index de2e225..0056283 100644 --- a/doc/mfc_atl.qbk +++ b/doc/mfc_atl.qbk @@ -74,6 +74,10 @@ If the `` is included before or after Boost.Range headers, ] Other Boost.Range metafunctions are defined by the following. Let `Range` be any type listed above and `Ref` be the same as `range_reference::type`. `range_value::type` is the same as `remove_reference::type>::type`, `range_difference::type` is the same as `std::ptrdiff_t`, and `range_pointer::type` is the same as `add_pointer::type>::type`. As for `const Range`, see below. + +Adam Walling has provided the header `` to add support +for the map adaptor with MFC map types. + [endsect] [section:atl_ranges ATL Ranges] diff --git a/doc/upgrade.qbk b/doc/upgrade.qbk index 482a825..ef66325 100644 --- a/doc/upgrade.qbk +++ b/doc/upgrade.qbk @@ -5,6 +5,17 @@ /] [section:upgrade Upgrade version of Boost.Range] +[section:upgrade_from_1_55 Upgrade from version 1.55] +# __iterator_range__ is now implemented by implementing the member functions +`size()`, `operator[]` via inheritance of base-classes specialized by the +traversal type of the underlying iterator. This is normally requires no +alteration of code. It does mean that types that derive from iterator_range may +need to prefix `this->` to the various member functions. Additionally it has +been noted that some calling code was relying on member functions such as +`size()` being present despite the underlying iterators not being random-access +due to `iterator_reference::type` not being a reference. The suggested +refactoring is to use `boost::size(rng)`. + [section:upgrade_from_1_49 Upgrade from version 1.49] # __size__ now returns the type Rng::size_type if the range has size_type; diff --git a/include/boost/range/mfc_map.hpp b/include/boost/range/mfc_map.hpp new file mode 100644 index 0000000..2cd42b4 --- /dev/null +++ b/include/boost/range/mfc_map.hpp @@ -0,0 +1,114 @@ +// Boost.Range library +// +// Copyright Adam D. Walling 2012. Use, modification and +// distribution is subject to 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) +// +// For more information, see http://www.boost.org/libs/range/ +// + +#ifndef BOOST_RANGE_ADAPTOR_MFC_MAP_HPP +#define BOOST_RANGE_ADAPTOR_MFC_MAP_HPP + +#if !defined(BOOST_RANGE_MFC_NO_CPAIR) + +#include +#include + +namespace boost +{ + namespace range_detail + { + // CMap and CMapStringToString range iterators return CPair, + // which has a key and value member. Other MFC range iterators + // already return adapted std::pair objects. This allows usage + // of the map_keys and map_values range adaptors with CMap + // and CMapStringToString + + // CPair has a VALUE value member, and a KEY key member; we will + // use VALUE& as the result_type consistent with CMap::operator[] + + // specialization for CMap + template + struct select_first< CMap > + { + typedef BOOST_DEDUCED_TYPENAME CMap map_type; + typedef BOOST_DEDUCED_TYPENAME range_reference::type argument_type; + typedef BOOST_DEDUCED_TYPENAME const KEY& result_type; + + result_type operator()( argument_type r ) const + { + return r.key; + } + }; + + template + struct select_second_mutable< CMap > + { + typedef BOOST_DEDUCED_TYPENAME CMap map_type; + typedef BOOST_DEDUCED_TYPENAME range_reference::type argument_type; + typedef BOOST_DEDUCED_TYPENAME VALUE& result_type; + + result_type operator()( argument_type r ) const + { + return r.value; + } + }; + + template + struct select_second_const< CMap > + { + typedef BOOST_DEDUCED_TYPENAME CMap map_type; + typedef BOOST_DEDUCED_TYPENAME range_reference::type argument_type; + typedef BOOST_DEDUCED_TYPENAME const VALUE& result_type; + + result_type operator()( argument_type r ) const + { + return r.value; + } + }; + + + // specialization for CMapStringToString + template<> + struct select_first< CMapStringToString > + { + typedef range_reference::type argument_type; + typedef const CString& result_type; + + result_type operator()( argument_type r ) const + { + return r.key; + } + }; + + template<> + struct select_second_mutable< CMapStringToString > + { + typedef range_reference::type argument_type; + typedef CString& result_type; + + result_type operator()( argument_type r ) const + { + return r.value; + } + }; + + template<> + struct select_second_const< CMapStringToString > + { + typedef range_reference::type argument_type; + typedef const CString& result_type; + + result_type operator()( argument_type r ) const + { + return r.value; + } + }; + } // 'range_detail' +} // 'boost' + +#endif // !defined(BOOST_RANGE_MFC_NO_CPAIR) + +#endif