• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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