123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- // Copyright Daniel Wallin 2006. Use, modification and distribution is
- // subject to 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)
- #ifndef BOOST_PARAMETER_NAME_060806_HPP
- # define BOOST_PARAMETER_NAME_060806_HPP
- # include <boost/parameter/keyword.hpp>
- # include <boost/parameter/value_type.hpp>
- # include <boost/detail/workaround.hpp>
- # include <boost/preprocessor/cat.hpp>
- # include <boost/preprocessor/stringize.hpp>
- # include <boost/preprocessor/control/iif.hpp>
- # include <boost/preprocessor/tuple/eat.hpp>
- # include <boost/preprocessor/tuple/elem.hpp>
- # include <boost/mpl/placeholders.hpp>
- # if !defined(BOOST_NO_SFINAE) \
- && !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
- && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x592))
- # include <boost/utility/enable_if.hpp>
- # include <boost/mpl/lambda.hpp>
- namespace boost { namespace parameter { namespace aux {
- // Tag type passed to MPL lambda.
- struct lambda_tag;
- struct name_tag_base
- {};
- template <class Tag>
- struct name_tag
- {};
- template <class T>
- struct is_name_tag
- : mpl::false_
- {};
- }}} // namespace boost::parameter::aux
- namespace boost { namespace mpl {
- template <class T>
- struct lambda<
- T
- , typename enable_if<
- parameter::aux::is_name_tag<T>, parameter::aux::lambda_tag
- >::type
- >
- {
- typedef true_ is_le;
- typedef bind3< quote3<parameter::value_type>, arg<2>, T, void> result_;
- typedef result_ type;
- };
- }} // namespace boost::mpl
- # endif
- # if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
- # include <boost/preprocessor/detail/split.hpp>
- // From Paul Mensonides
- # define BOOST_PARAMETER_IS_BINARY(x) \
- BOOST_PP_SPLIT(1, BOOST_PARAMETER_IS_BINARY_C x BOOST_PP_COMMA() 0) \
- /**/
- # define BOOST_PARAMETER_IS_BINARY_C(x,y) \
- ~, 1 BOOST_PP_RPAREN() \
- BOOST_PP_TUPLE_EAT(2) BOOST_PP_LPAREN() ~ \
- /**/
- # else
- # include <boost/preprocessor/detail/is_binary.hpp>
- # define BOOST_PARAMETER_IS_BINARY(x) BOOST_PP_IS_BINARY(x)
- # endif
- # if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
- # define BOOST_PARAMETER_NAME_OBJECT(tag, name) \
- static ::boost::parameter::keyword<tag> const& name \
- = ::boost::parameter::keyword<tag>::instance;
- # else
- # define BOOST_PARAMETER_NAME_OBJECT(tag, name) \
- namespace \
- { \
- ::boost::parameter::keyword<tag> const& name \
- = ::boost::parameter::keyword<tag>::instance; \
- }
- # endif
- # define BOOST_PARAMETER_BASIC_NAME(tag_namespace, tag, name) \
- namespace tag_namespace \
- { \
- struct tag \
- { \
- static char const* keyword_name() \
- { \
- return BOOST_PP_STRINGIZE(tag); \
- } \
- \
- typedef boost::parameter::value_type< \
- boost::mpl::_2, tag, boost::parameter::void_ \
- > _; \
- \
- typedef boost::parameter::value_type< \
- boost::mpl::_2, tag, boost::parameter::void_ \
- > _1; \
- }; \
- } \
- BOOST_PARAMETER_NAME_OBJECT(tag_namespace::tag, name)
- # define BOOST_PARAMETER_COMPLEX_NAME_TUPLE1(tag,namespace) \
- (tag, namespace), ~
- # define BOOST_PARAMETER_COMPLEX_NAME_TUPLE(name) \
- BOOST_PP_TUPLE_ELEM(2, 0, (BOOST_PARAMETER_COMPLEX_NAME_TUPLE1 name))
- # define BOOST_PARAMETER_COMPLEX_NAME_TAG(name) \
- BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PARAMETER_COMPLEX_NAME_TUPLE(name))
- # define BOOST_PARAMETER_COMPLEX_NAME_NAMESPACE(name) \
- BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PARAMETER_COMPLEX_NAME_TUPLE(name))
- # define BOOST_PARAMETER_COMPLEX_NAME(name) \
- BOOST_PARAMETER_BASIC_NAME( \
- BOOST_PARAMETER_COMPLEX_NAME_NAMESPACE(name) \
- , BOOST_PP_TUPLE_EAT(2) name \
- , BOOST_PARAMETER_COMPLEX_NAME_TAG(name) \
- ) \
- /**/
- # define BOOST_PARAMETER_SIMPLE_NAME(name) \
- BOOST_PARAMETER_BASIC_NAME(tag, name, BOOST_PP_CAT(_, name))
- # define BOOST_PARAMETER_NAME(name) \
- BOOST_PP_IIF( \
- BOOST_PARAMETER_IS_BINARY(name) \
- , BOOST_PARAMETER_COMPLEX_NAME \
- , BOOST_PARAMETER_SIMPLE_NAME \
- )(name) \
- /**/
- # define BOOST_PARAMETER_TEMPLATE_KEYWORD(name) \
- namespace tag \
- { \
- struct name; \
- } \
- template <class T> \
- struct name \
- : boost::parameter::template_keyword<tag::name, T> \
- {}; \
- /**/
- #endif // BOOST_PARAMETER_NAME_060806_HPP
|