1 // Boost.Bimap
2 //
3 // Copyright (c) 2006-2007 Matias Capeletto
4 //
5 // Distributed under the Boost Software License, Version 1.0.
6 // (See accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt)
8 
9 /// \file container_adaptor/detail/identity_converters.hpp
10 /// \brief Value and iterators identity converters.
11 
12 #ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_DETAIL_IDENTITY_CONVERTERS_HPP
13 #define BOOST_BIMAP_CONTAINER_ADAPTOR_DETAIL_IDENTITY_CONVERTERS_HPP
14 
15 #if defined(_MSC_VER)
16 #pragma once
17 #endif
18 
19 #include <boost/config.hpp>
20 
21 namespace boost {
22 namespace bimaps {
23 namespace container_adaptor {
24 
25 /// \brief Details of the container adaptor toolbox
26 
27 namespace detail {
28 
29 /// \brief Iterator identity converter used by default in container adaptors.
30 /**
31 If Iterator and ConstIterator are of the same type one of the convert function is not
32 included.
33                                                                                     **/
34 
35 template
36 <
37     class BaseIterator              , class Iterator,
38     class BaseConstIterator         , class ConstIterator
39 >
40 struct iterator_to_base_identity
41 {
operator ()boost::bimaps::container_adaptor::detail::iterator_to_base_identity42     BaseIterator operator()(Iterator iter) const
43     {
44         return BaseIterator(iter);
45     }
46 
operator ()boost::bimaps::container_adaptor::detail::iterator_to_base_identity47     BaseConstIterator operator()(ConstIterator iter) const
48     {
49         return BaseConstIterator(iter);
50     }
51 };
52 
53 #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
54 
55 template< class BaseIterator, class Iterator >
56 struct iterator_to_base_identity<BaseIterator,Iterator,BaseIterator,Iterator>
57 {
operator ()boost::bimaps::container_adaptor::detail::iterator_to_base_identity58     BaseIterator operator()(Iterator iter) const
59     {
60         return BaseIterator(iter);
61     }
62 };
63 
64 #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
65 
66 /// \brief Iterator from base identity converter used by default in container adaptors.
67 /**
68 If Iterator and ConstIterator are of the same type one of the convert function is not
69 included.
70                                                                                     **/
71 
72 template
73 <
74     class BaseIterator              , class Iterator,
75     class BaseConstIterator         , class ConstIterator
76 >
77 struct iterator_from_base_identity
78 {
operator ()boost::bimaps::container_adaptor::detail::iterator_from_base_identity79     Iterator operator()(BaseIterator iter) const
80     {
81         return Iterator(iter);
82     }
operator ()boost::bimaps::container_adaptor::detail::iterator_from_base_identity83     ConstIterator operator()(BaseConstIterator iter) const
84     {
85         return ConstIterator(iter);
86     }
87 };
88 
89 #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
90 
91 template< class BaseIterator, class Iterator, class ConstIterator >
92 struct iterator_from_base_identity<BaseIterator,Iterator,BaseIterator,ConstIterator>
93 {
operator ()boost::bimaps::container_adaptor::detail::iterator_from_base_identity94     Iterator operator()(BaseIterator iter) const
95     {
96         return Iterator(iter);
97     }
98 };
99 
100 #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
101 
102 /// \brief Value to base identity converter used by default in container adaptors.
103 
104 template< class BaseValue, class Value >
105 struct value_to_base_identity
106 {
operator ()boost::bimaps::container_adaptor::detail::value_to_base_identity107     BaseValue operator()(const Value & val) const
108     {
109         return BaseValue(val);
110     }
111 };
112 
113 #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
114 
115 template< class Value >
116 struct value_to_base_identity< Value, Value >
117 {
operator ()boost::bimaps::container_adaptor::detail::value_to_base_identity118     const Value & operator()(const Value & val) const
119     {
120         return val;
121     }
122 };
123 
124 #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
125 
126 /// \brief Value from base identity converter used by default in container adaptors.
127 
128 template< class BaseValue, class Value >
129 struct value_from_base_identity
130 {
operator ()boost::bimaps::container_adaptor::detail::value_from_base_identity131     Value operator()(const BaseValue & val) const
132     {
133         return Value(val);
134     }
135 };
136 
137 #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
138 
139 template< class Value >
140 struct value_from_base_identity<Value,Value>
141 {
operator ()boost::bimaps::container_adaptor::detail::value_from_base_identity142     Value & operator()(Value & val) const
143     {
144         return val;
145     }
146 
operator ()boost::bimaps::container_adaptor::detail::value_from_base_identity147     const Value & operator()(const Value & val) const
148     {
149         return val;
150     }
151 };
152 
153 #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
154 
155 /// \brief Key to base identity converter used by default in container adaptors.
156 
157 template< class BaseKey, class Key >
158 struct key_to_base_identity
159 {
operator ()boost::bimaps::container_adaptor::detail::key_to_base_identity160     BaseKey operator()(const Key & k) const
161     {
162         return BaseKey(k);
163     }
164 };
165 
166 #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
167 
168 template< class Key >
169 struct key_to_base_identity< Key, Key >
170 {
171     // As default accept any type as key in order to allow container
172     // adaptors to work with compatible key types
173 
174     template< class CompatibleKey >
operator ()boost::bimaps::container_adaptor::detail::key_to_base_identity175     const CompatibleKey & operator()(const CompatibleKey & k) const
176     {
177         return k;
178     }
179 };
180 
181 #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
182 
183 } // namespace detail
184 } // namespace container_adaptor
185 } // namespace bimaps
186 } // namespace boost
187 
188 
189 #endif // BOOST_BIMAP_CONTAINER_ADAPTOR_DETAIL_IDENTITY_CONVERTERS_HPP
190 
191 
192