1 // Boost.Range library
2 //
3 //  Copyright Adam D. Walling 2012. Use, modification and
4 //  distribution is subject to the Boost Software License, Version
5 //  1.0. (See accompanying file LICENSE_1_0.txt or copy at
6 //  http://www.boost.org/LICENSE_1_0.txt)
7 //
8 // For more information, see http://www.boost.org/libs/range/
9 //
10 
11 #ifndef BOOST_RANGE_ADAPTOR_MFC_MAP_HPP
12 #define BOOST_RANGE_ADAPTOR_MFC_MAP_HPP
13 
14 #if !defined(BOOST_RANGE_MFC_NO_CPAIR)
15 
16 #include <boost/range/mfc.hpp>
17 #include <boost/range/adaptor/map.hpp>
18 
19 namespace boost
20 {
21     namespace range_detail
22     {
23         // CMap and CMapStringToString range iterators return CPair,
24         // which has a key and value member. Other MFC range iterators
25         // already return adapted std::pair objects. This allows usage
26         // of the map_keys and map_values range adaptors with CMap
27         // and CMapStringToString
28 
29         // CPair has a VALUE value member, and a KEY key member; we will
30         // use VALUE& as the result_type consistent with CMap::operator[]
31 
32         // specialization for CMap
33         template<class KEY, class ARG_KEY, class VALUE, class ARG_VALUE>
34         struct select_first< CMap<KEY, ARG_KEY, VALUE, ARG_VALUE> >
35         {
36             typedef BOOST_DEDUCED_TYPENAME CMap<KEY, ARG_KEY, VALUE, ARG_VALUE> map_type;
37             typedef BOOST_DEDUCED_TYPENAME range_reference<const map_type>::type argument_type;
38             typedef BOOST_DEDUCED_TYPENAME const KEY& result_type;
39 
operator ()boost::range_detail::select_first40             result_type operator()( argument_type r ) const
41             {
42                 return r.key;
43             }
44         };
45 
46         template<class KEY, class ARG_KEY, class VALUE, class ARG_VALUE>
47         struct select_second_mutable< CMap<KEY, ARG_KEY, VALUE, ARG_VALUE> >
48         {
49             typedef BOOST_DEDUCED_TYPENAME CMap<KEY, ARG_KEY, VALUE, ARG_VALUE> map_type;
50             typedef BOOST_DEDUCED_TYPENAME range_reference<map_type>::type argument_type;
51             typedef BOOST_DEDUCED_TYPENAME VALUE& result_type;
52 
operator ()boost::range_detail::select_second_mutable53             result_type operator()( argument_type r ) const
54             {
55                 return r.value;
56             }
57         };
58 
59         template<class KEY, class ARG_KEY, class VALUE, class ARG_VALUE>
60         struct select_second_const< CMap<KEY, ARG_KEY, VALUE, ARG_VALUE> >
61         {
62             typedef BOOST_DEDUCED_TYPENAME CMap<KEY, ARG_KEY, VALUE, ARG_VALUE> map_type;
63             typedef BOOST_DEDUCED_TYPENAME range_reference<const map_type>::type argument_type;
64             typedef BOOST_DEDUCED_TYPENAME const VALUE& result_type;
65 
operator ()boost::range_detail::select_second_const66             result_type operator()( argument_type r ) const
67             {
68                 return r.value;
69             }
70         };
71 
72 
73         // specialization for CMapStringToString
74         template<>
75         struct select_first< CMapStringToString >
76         {
77             typedef range_reference<const CMapStringToString>::type argument_type;
78             typedef const CString& result_type;
79 
operator ()boost::range_detail::select_first80             result_type operator()( argument_type r ) const
81             {
82                 return r.key;
83             }
84         };
85 
86         template<>
87         struct select_second_mutable< CMapStringToString >
88         {
89             typedef range_reference<CMapStringToString>::type argument_type;
90             typedef CString& result_type;
91 
operator ()boost::range_detail::select_second_mutable92             result_type operator()( argument_type r ) const
93             {
94                 return r.value;
95             }
96         };
97 
98         template<>
99         struct select_second_const< CMapStringToString >
100         {
101             typedef range_reference<const CMapStringToString>::type argument_type;
102             typedef const CString& result_type;
103 
operator ()boost::range_detail::select_second_const104             result_type operator()( argument_type r ) const
105             {
106                 return r.value;
107             }
108         };
109     } // 'range_detail'
110 } // 'boost'
111 
112 #endif // !defined(BOOST_RANGE_MFC_NO_CPAIR)
113 
114 #endif
115