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 detail/manage_additional_parameters.hpp |
10 | /// \brief Utility class to extract the additional parameters from the template parameters. |
11 | |
12 | #ifndef BOOST_BIMAP_DETAIL_MANAGE_ADDITIONAL_PARAMETERS_HPP |
13 | #define BOOST_BIMAP_DETAIL_MANAGE_ADDITIONAL_PARAMETERS_HPP |
14 | |
15 | #if defined(_MSC_VER) |
16 | #pragma once |
17 | #endif |
18 | |
19 | #include <boost/config.hpp> |
20 | |
21 | #include <memory> |
22 | |
23 | // Boost.MPL |
24 | #include <boost/mpl/bool.hpp> |
25 | #include <boost/mpl/if.hpp> |
26 | #include <boost/mpl/aux_/na.hpp> |
27 | #include <boost/type_traits/is_same.hpp> |
28 | |
29 | #include <boost/bimap/detail/is_set_type_of.hpp> |
30 | |
31 | namespace boost { |
32 | namespace bimaps { |
33 | |
34 | template< class Type > |
35 | struct with_info |
36 | { |
37 | typedef Type value_type; |
38 | }; |
39 | |
40 | namespace detail { |
41 | |
42 | /// \brief Metafunction to check if a given type is a data_hook specification. |
43 | |
44 | template< class Type > |
45 | struct is_with_info : ::boost::mpl::false_ {}; |
46 | |
47 | template< class ValueType > |
48 | struct is_with_info< with_info<ValueType> > : ::boost::mpl::true_ {}; |
49 | |
50 | /** \struct boost::bimaps::detail::manage_additional_parameters |
51 | \brief Utility class to extract the additional parameters from the template parameters. |
52 | |
53 | \code |
54 | template< class AP1, class AP2, class AP3 > |
55 | struct manage_additional_parameters |
56 | { |
57 | struct parameters |
58 | { |
59 | typedef -unspecified- set_type_of_relation; |
60 | typedef -unspecified- data_hook; |
61 | typedef -unspecified- allocator; |
62 | }; |
63 | |
64 | typedef parameters type; |
65 | }; |
66 | \endcode |
67 | |
68 | See also bimap, bimap_core. |
69 | **/ |
70 | |
71 | #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES |
72 | |
73 | template< class AP1, class AP2, class AP3 > |
74 | struct manage_additional_parameters |
75 | { |
76 | // (1) manage_additional_parameters< |
77 | // not_specified,not_specified,not_specified> |
78 | // |
79 | // set_type_of_relation: based on the left key type |
80 | // info_hook: no additional info |
81 | // allocator: default allocator |
82 | |
83 | struct case_NNN |
84 | { |
85 | typedef left_based set_type_of_relation; |
86 | typedef std::allocator<char> allocator; |
87 | typedef ::boost::mpl::na additional_info; |
88 | }; |
89 | |
90 | // (2) manage_additional_parameters<Allocator,not_specified,not_specified> |
91 | // |
92 | // set_type_of_relation: based on the left key type |
93 | // info_hook: no additional info |
94 | // allocator: Allocator |
95 | |
96 | struct case_ANN |
97 | { |
98 | typedef left_based set_type_of_relation; |
99 | typedef AP1 allocator; |
100 | typedef ::boost::mpl::na additional_info; |
101 | }; |
102 | |
103 | // (3) manage_additional_parameters< |
104 | // SetOfRelationType,not_specified,not_specified> |
105 | // |
106 | // set_type_of_relation: SetTypeOfRelation |
107 | // info_hook: no additional info |
108 | // allocator: default allocator |
109 | |
110 | struct case_SNN |
111 | { |
112 | typedef AP1 set_type_of_relation; |
113 | typedef std::allocator<char> allocator; |
114 | typedef ::boost::mpl::na additional_info; |
115 | }; |
116 | |
117 | // (4) manage_additional_parameters< |
118 | // SetTypeOfRelation,Allocator,not_specified> |
119 | // |
120 | // set_type_of_relation: SetTypeOfRelation |
121 | // info_hook: no additional info |
122 | // allocator: Allocator |
123 | |
124 | struct case_SAN |
125 | { |
126 | typedef AP1 set_type_of_relation; |
127 | typedef AP2 allocator; |
128 | typedef ::boost::mpl::na additional_info; |
129 | }; |
130 | |
131 | // (5) manage_additional_parameters<InfoToHook,not_specified,not_specified> |
132 | // |
133 | // set_type_of_relation: based on the left key type |
134 | // info_hook: InfoToHook |
135 | // allocator: default allocator |
136 | |
137 | struct case_HNN |
138 | { |
139 | typedef left_based set_type_of_relation; |
140 | typedef std::allocator<char> allocator; |
141 | typedef BOOST_DEDUCED_TYPENAME AP1::value_type additional_info; |
142 | }; |
143 | |
144 | // (6) manage_additional_parameters< |
145 | // SetTypeOfRelation,InfoToHook,not_specified> |
146 | // |
147 | // set_type_of_relation: SetTypeOfRelation |
148 | // info_hook: InfoToHook |
149 | // allocator: default allocator |
150 | |
151 | struct case_SHN |
152 | { |
153 | typedef AP1 set_type_of_relation; |
154 | typedef std::allocator<char> allocator; |
155 | typedef BOOST_DEDUCED_TYPENAME AP2::value_type additional_info; |
156 | }; |
157 | |
158 | // (7) manage_additional_parameters< |
159 | // DataToHook,Allocator,not_specified> |
160 | // |
161 | // set_type_of_relation: SetTypeOfRelation |
162 | // info_hook: InfoToHook |
163 | // allocator: default allocator |
164 | |
165 | struct case_HAN |
166 | { |
167 | typedef left_based set_type_of_relation; |
168 | typedef AP2 allocator; |
169 | typedef BOOST_DEDUCED_TYPENAME AP1::value_type additional_info; |
170 | }; |
171 | |
172 | // (8) manage_additional_parameters< |
173 | // SetTypeOfRelation,DataToHook,Allocator> |
174 | // |
175 | // set_type_of_relation: SetTypeOfRelation |
176 | // info_hook: InfoToHook |
177 | // allocator: Allocator |
178 | |
179 | struct case_SHA |
180 | { |
181 | typedef AP1 set_type_of_relation; |
182 | typedef AP2 allocator; |
183 | typedef BOOST_DEDUCED_TYPENAME AP2::value_type additional_info; |
184 | }; |
185 | |
186 | // Some annidated mpl::if_ and we are done! |
187 | |
188 | typedef BOOST_DEDUCED_TYPENAME mpl::if_ |
189 | < |
190 | ::boost::mpl::is_na<AP1>, |
191 | case_NNN, // (1) |
192 | BOOST_DEDUCED_TYPENAME mpl::if_ |
193 | < |
194 | ::boost::mpl::is_na<AP2>, |
195 | BOOST_DEDUCED_TYPENAME mpl::if_ |
196 | < |
197 | is_set_type_of_relation<AP1>, |
198 | case_SNN, // (3) |
199 | BOOST_DEDUCED_TYPENAME mpl::if_ |
200 | < |
201 | is_with_info<AP1>, |
202 | case_HNN, // (5) |
203 | case_ANN // (2) |
204 | |
205 | >::type |
206 | |
207 | >::type, |
208 | BOOST_DEDUCED_TYPENAME mpl::if_ |
209 | < |
210 | ::boost::mpl::is_na<AP3>, |
211 | BOOST_DEDUCED_TYPENAME mpl::if_ |
212 | < |
213 | is_with_info<AP1>, |
214 | case_HAN, // (7) |
215 | BOOST_DEDUCED_TYPENAME mpl::if_ |
216 | < |
217 | is_with_info<AP2>, |
218 | case_SHN, // (6) |
219 | case_SAN // (4) |
220 | |
221 | >::type |
222 | |
223 | >::type, |
224 | |
225 | case_SHA // (8) |
226 | |
227 | >::type |
228 | |
229 | >::type |
230 | |
231 | >::type type; |
232 | |
233 | }; |
234 | |
235 | #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES |
236 | |
237 | } // namespace detail |
238 | } // namespace bimaps |
239 | } // namespace boost |
240 | |
241 | |
242 | #endif // BOOST_BIMAP_DETAIL_MANAGE_ADDITIONAL_PARAMETERS_HPP |
243 | |
244 | |