X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=boost_ext%2Fboost%2Fbimap%2Fdetail%2Fmanage_additional_parameters.hpp;fp=boost_ext%2Fboost%2Fbimap%2Fdetail%2Fmanage_additional_parameters.hpp;h=3d22d730e78b1f22ac2fce75b8e9f1b7d4d298bf;hb=4123b4fe58a7fd4659fa01476581690b47c83600;hp=0000000000000000000000000000000000000000;hpb=79564b90f6c9f7cd0bc5b11a6146bb7067b11a75;p=senf.git diff --git a/boost_ext/boost/bimap/detail/manage_additional_parameters.hpp b/boost_ext/boost/bimap/detail/manage_additional_parameters.hpp new file mode 100644 index 0000000..3d22d73 --- /dev/null +++ b/boost_ext/boost/bimap/detail/manage_additional_parameters.hpp @@ -0,0 +1,243 @@ +// 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 + +#include + +// Boost.MPL +#include +#include +#include +#include + +#include + +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 > : ::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 allocator; + typedef ::boost::mpl::na additional_info; + }; + + // (2) manage_additional_parameters + // + // 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 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 + // + // 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 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 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, + case_NNN, // (1) + BOOST_DEDUCED_TYPENAME mpl::if_ + < + ::boost::mpl::is_na, + BOOST_DEDUCED_TYPENAME mpl::if_ + < + is_set_type_of_relation, + case_SNN, // (3) + BOOST_DEDUCED_TYPENAME mpl::if_ + < + is_with_info, + case_HNN, // (5) + case_ANN // (2) + + >::type + + >::type, + BOOST_DEDUCED_TYPENAME mpl::if_ + < + ::boost::mpl::is_na, + BOOST_DEDUCED_TYPENAME mpl::if_ + < + is_with_info, + case_HAN, // (7) + BOOST_DEDUCED_TYPENAME mpl::if_ + < + is_with_info, + 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 +