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 | ||
|  | 
 |