147 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			147 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| // 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) \
 | |
|   && !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 boost::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
 | |
| 
 | |
| # 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;                                                     \
 | |
|       };                                                            \
 | |
|     }                                                               \
 | |
|     namespace                                                       \
 | |
|     {                                                               \
 | |
|        ::boost::parameter::keyword<tag_namespace::tag> const& name  \
 | |
|        = ::boost::parameter::keyword<tag_namespace::tag>::instance; \
 | |
|     }
 | |
| 
 | |
| # 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
 | |
| 
 | 
