--- /dev/null
+// Boost.Bimap
+//
+// Copyright (c) 2006-2007 Matias Capeletto
+//
+// Distributed under 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)
+
+/// \file detail/manage_additional_parameters.hpp
+/// \brief Utility class to extract the additional parameters from the template parameters.
+
+#ifndef BOOST_BIMAP_DETAIL_MANAGE_ADDITIONAL_PARAMETERS_HPP
+#define BOOST_BIMAP_DETAIL_MANAGE_ADDITIONAL_PARAMETERS_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER>=1200)
+#pragma once
+#endif
+
+#include <boost/config.hpp>
+
+#include <memory>
+
+// Boost.MPL
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/aux_/na.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+#include <boost/bimap/detail/is_set_type_of.hpp>
+
+namespace boost {
+namespace bimaps {
+
+template< class Type >
+struct with_info
+{
+ typedef Type value_type;
+};
+
+namespace detail {
+
+/// \brief Metafunction to check if a given type is a data_hook specification.
+
+template< class Type >
+struct is_with_info : ::boost::mpl::false_ {};
+
+template< class ValueType >
+struct is_with_info< with_info<ValueType> > : ::boost::mpl::true_ {};
+
+/** \struct boost::bimaps::detail::manage_additional_parameters
+\brief Utility class to extract the additional parameters from the template parameters.
+
+\code
+template< class AP1, class AP2, class AP3 >
+struct manage_additional_parameters
+{
+ struct parameters
+ {
+ typedef -unspecified- set_type_of_relation;
+ typedef -unspecified- data_hook;
+ typedef -unspecified- allocator;
+ };
+
+ typedef parameters type;
+};
+\endcode
+
+See also bimap, bimap_core.
+ **/
+
+#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
+
+template< class AP1, class AP2, class AP3 >
+struct manage_additional_parameters
+{
+ // (1) manage_additional_parameters<
+ // not_specified,not_specified,not_specified>
+ //
+ // set_type_of_relation: based on the left key type
+ // info_hook: no additional info
+ // allocator: default allocator
+
+ struct case_NNN
+ {
+ typedef left_based set_type_of_relation;
+ typedef std::allocator<void> allocator;
+ typedef ::boost::mpl::na additional_info;
+ };
+
+ // (2) manage_additional_parameters<Allocator,not_specified,not_specified>
+ //
+ // set_type_of_relation: based on the left key type
+ // info_hook: no additional info
+ // allocator: Allocator
+
+ struct case_ANN
+ {
+ typedef left_based set_type_of_relation;
+ typedef AP1 allocator;
+ typedef ::boost::mpl::na additional_info;
+ };
+
+ // (3) manage_additional_parameters<
+ // SetOfRelationType,not_specified,not_specified>
+ //
+ // set_type_of_relation: SetTypeOfRelation
+ // info_hook: no additional info
+ // allocator: default allocator
+
+ struct case_SNN
+ {
+ typedef AP1 set_type_of_relation;
+ typedef std::allocator<void> allocator;
+ typedef ::boost::mpl::na additional_info;
+ };
+
+ // (4) manage_additional_parameters<
+ // SetTypeOfRelation,Allocator,not_specified>
+ //
+ // set_type_of_relation: SetTypeOfRelation
+ // info_hook: no additional info
+ // allocator: Allocator
+
+ struct case_SAN
+ {
+ typedef AP1 set_type_of_relation;
+ typedef AP2 allocator;
+ typedef ::boost::mpl::na additional_info;
+ };
+
+ // (5) manage_additional_parameters<InfoToHook,not_specified,not_specified>
+ //
+ // set_type_of_relation: based on the left key type
+ // info_hook: InfoToHook
+ // allocator: default allocator
+
+ struct case_HNN
+ {
+ typedef left_based set_type_of_relation;
+ typedef std::allocator<void> allocator;
+ typedef BOOST_DEDUCED_TYPENAME AP1::value_type additional_info;
+ };
+
+ // (6) manage_additional_parameters<
+ // SetTypeOfRelation,InfoToHook,not_specified>
+ //
+ // set_type_of_relation: SetTypeOfRelation
+ // info_hook: InfoToHook
+ // allocator: default allocator
+
+ struct case_SHN
+ {
+ typedef AP1 set_type_of_relation;
+ typedef std::allocator<void> allocator;
+ typedef BOOST_DEDUCED_TYPENAME AP2::value_type additional_info;
+ };
+
+ // (7) manage_additional_parameters<
+ // DataToHook,Allocator,not_specified>
+ //
+ // set_type_of_relation: SetTypeOfRelation
+ // info_hook: InfoToHook
+ // allocator: default allocator
+
+ struct case_HAN
+ {
+ typedef left_based set_type_of_relation;
+ typedef AP2 allocator;
+ typedef BOOST_DEDUCED_TYPENAME AP1::value_type additional_info;
+ };
+
+ // (8) manage_additional_parameters<
+ // SetTypeOfRelation,DataToHook,Allocator>
+ //
+ // set_type_of_relation: SetTypeOfRelation
+ // info_hook: InfoToHook
+ // allocator: Allocator
+
+ struct case_SHA
+ {
+ typedef AP1 set_type_of_relation;
+ typedef AP2 allocator;
+ typedef BOOST_DEDUCED_TYPENAME AP2::value_type additional_info;
+ };
+
+ // Some annidated mpl::if_ and we are done!
+
+ typedef BOOST_DEDUCED_TYPENAME mpl::if_
+ <
+ ::boost::mpl::is_na<AP1>,
+ case_NNN, // (1)
+ BOOST_DEDUCED_TYPENAME mpl::if_
+ <
+ ::boost::mpl::is_na<AP2>,
+ BOOST_DEDUCED_TYPENAME mpl::if_
+ <
+ is_set_type_of_relation<AP1>,
+ case_SNN, // (3)
+ BOOST_DEDUCED_TYPENAME mpl::if_
+ <
+ is_with_info<AP1>,
+ case_HNN, // (5)
+ case_ANN // (2)
+
+ >::type
+
+ >::type,
+ BOOST_DEDUCED_TYPENAME mpl::if_
+ <
+ ::boost::mpl::is_na<AP3>,
+ BOOST_DEDUCED_TYPENAME mpl::if_
+ <
+ is_with_info<AP1>,
+ case_HAN, // (7)
+ BOOST_DEDUCED_TYPENAME mpl::if_
+ <
+ is_with_info<AP2>,
+ case_SHN, // (6)
+ case_SAN // (4)
+
+ >::type
+
+ >::type,
+
+ case_SHA // (8)
+
+ >::type
+
+ >::type
+
+ >::type type;
+
+};
+
+#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
+
+} // namespace detail
+} // namespace bimaps
+} // namespace boost
+
+
+#endif // BOOST_BIMAP_DETAIL_MANAGE_ADDITIONAL_PARAMETERS_HPP
+