Chris@16: // Copyright Daniel Wallin 2006. Use, modification and distribution is Chris@16: // subject to the Boost Software License, Version 1.0. (See accompanying Chris@16: // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_PARAMETER_NAME_060806_HPP Chris@16: # define BOOST_PARAMETER_NAME_060806_HPP Chris@16: Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: Chris@16: # if !defined(BOOST_NO_SFINAE) \ Chris@16: && !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \ Chris@16: && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x592)) Chris@16: Chris@16: # include Chris@16: # include Chris@16: Chris@16: namespace boost { namespace parameter { namespace aux { Chris@16: Chris@16: // Tag type passed to MPL lambda. Chris@16: struct lambda_tag; Chris@16: Chris@16: struct name_tag_base Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct name_tag Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct is_name_tag Chris@16: : mpl::false_ Chris@16: {}; Chris@16: Chris@16: }}} // namespace boost::parameter::aux Chris@16: Chris@16: namespace boost { namespace mpl { Chris@16: Chris@16: template Chris@16: struct lambda< Chris@16: T Chris@16: , typename boost::enable_if< Chris@16: parameter::aux::is_name_tag, parameter::aux::lambda_tag Chris@16: >::type Chris@16: > Chris@16: { Chris@16: typedef true_ is_le; Chris@16: typedef bind3< quote3, arg<2>, T, void> result_; Chris@16: typedef result_ type; Chris@16: }; Chris@16: Chris@16: }} // namespace boost::mpl Chris@16: Chris@16: # endif Chris@16: Chris@16: # if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) Chris@16: # include Chris@16: // From Paul Mensonides Chris@16: # define BOOST_PARAMETER_IS_BINARY(x) \ Chris@16: BOOST_PP_SPLIT(1, BOOST_PARAMETER_IS_BINARY_C x BOOST_PP_COMMA() 0) \ Chris@16: /**/ Chris@16: # define BOOST_PARAMETER_IS_BINARY_C(x,y) \ Chris@16: ~, 1 BOOST_PP_RPAREN() \ Chris@16: BOOST_PP_TUPLE_EAT(2) BOOST_PP_LPAREN() ~ \ Chris@16: /**/ Chris@16: # else Chris@16: # include Chris@16: # define BOOST_PARAMETER_IS_BINARY(x) BOOST_PP_IS_BINARY(x) Chris@16: # endif Chris@16: Chris@16: # if BOOST_WORKAROUND(BOOST_MSVC, < 1300) Chris@16: # define BOOST_PARAMETER_NAME_OBJECT(tag, name) \ Chris@16: static ::boost::parameter::keyword const& name \ Chris@16: = ::boost::parameter::keyword::instance; Chris@16: # else Chris@16: # define BOOST_PARAMETER_NAME_OBJECT(tag, name) \ Chris@16: namespace \ Chris@16: { \ Chris@16: ::boost::parameter::keyword const& name \ Chris@16: = ::boost::parameter::keyword::instance; \ Chris@16: } Chris@16: # endif Chris@16: Chris@16: # define BOOST_PARAMETER_BASIC_NAME(tag_namespace, tag, name) \ Chris@16: namespace tag_namespace \ Chris@16: { \ Chris@16: struct tag \ Chris@16: { \ Chris@16: static char const* keyword_name() \ Chris@16: { \ Chris@16: return BOOST_PP_STRINGIZE(tag); \ Chris@16: } \ Chris@16: \ Chris@16: typedef boost::parameter::value_type< \ Chris@16: boost::mpl::_2, tag, boost::parameter::void_ \ Chris@16: > _; \ Chris@16: \ Chris@16: typedef boost::parameter::value_type< \ Chris@16: boost::mpl::_2, tag, boost::parameter::void_ \ Chris@16: > _1; \ Chris@16: }; \ Chris@16: } \ Chris@16: BOOST_PARAMETER_NAME_OBJECT(tag_namespace::tag, name) Chris@16: Chris@16: # define BOOST_PARAMETER_COMPLEX_NAME_TUPLE1(tag,namespace) \ Chris@16: (tag, namespace), ~ Chris@16: Chris@16: # define BOOST_PARAMETER_COMPLEX_NAME_TUPLE(name) \ Chris@16: BOOST_PP_TUPLE_ELEM(2, 0, (BOOST_PARAMETER_COMPLEX_NAME_TUPLE1 name)) Chris@16: Chris@16: # define BOOST_PARAMETER_COMPLEX_NAME_TAG(name) \ Chris@16: BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PARAMETER_COMPLEX_NAME_TUPLE(name)) Chris@16: Chris@16: # define BOOST_PARAMETER_COMPLEX_NAME_NAMESPACE(name) \ Chris@16: BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PARAMETER_COMPLEX_NAME_TUPLE(name)) Chris@16: Chris@16: # define BOOST_PARAMETER_COMPLEX_NAME(name) \ Chris@16: BOOST_PARAMETER_BASIC_NAME( \ Chris@16: BOOST_PARAMETER_COMPLEX_NAME_NAMESPACE(name) \ Chris@16: , BOOST_PP_TUPLE_EAT(2) name \ Chris@16: , BOOST_PARAMETER_COMPLEX_NAME_TAG(name) \ Chris@16: ) \ Chris@16: /**/ Chris@16: Chris@16: # define BOOST_PARAMETER_SIMPLE_NAME(name) \ Chris@16: BOOST_PARAMETER_BASIC_NAME(tag, name, BOOST_PP_CAT(_, name)) Chris@16: Chris@16: # define BOOST_PARAMETER_NAME(name) \ Chris@16: BOOST_PP_IIF( \ Chris@16: BOOST_PARAMETER_IS_BINARY(name) \ Chris@16: , BOOST_PARAMETER_COMPLEX_NAME \ Chris@16: , BOOST_PARAMETER_SIMPLE_NAME \ Chris@16: )(name) \ Chris@16: /**/ Chris@16: Chris@16: Chris@16: # define BOOST_PARAMETER_TEMPLATE_KEYWORD(name) \ Chris@16: namespace tag \ Chris@16: { \ Chris@16: struct name; \ Chris@16: } \ Chris@16: template \ Chris@16: struct name \ Chris@16: : boost::parameter::template_keyword \ Chris@16: {}; \ Chris@16: /**/ Chris@16: Chris@16: #endif // BOOST_PARAMETER_NAME_060806_HPP Chris@16: