123 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| // Copyright Daniel Wallin, David Abrahams 2005. 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 KEYWORD_050328_HPP
 | |
| #define KEYWORD_050328_HPP
 | |
| 
 | |
| #include <boost/parameter/aux_/unwrap_cv_reference.hpp>
 | |
| #include <boost/parameter/aux_/tag.hpp>
 | |
| #include <boost/parameter/aux_/default.hpp>
 | |
| 
 | |
| namespace boost { namespace parameter {
 | |
| 
 | |
| // Instances of unique specializations of keyword<...> serve to
 | |
| // associate arguments with parameter names.  For example:
 | |
| //
 | |
| //    struct rate_;           // parameter names
 | |
| //    struct skew_;
 | |
| //    namespace
 | |
| //    {
 | |
| //      keyword<rate_> rate;  // keywords
 | |
| //      keyword<skew_> skew;
 | |
| //    }
 | |
| //
 | |
| //    ...
 | |
| //
 | |
| //    f(rate = 1, skew = 2.4);
 | |
| //
 | |
| template <class Tag>
 | |
| struct keyword
 | |
| {
 | |
|     template <class T>
 | |
|     typename aux::tag<Tag, T>::type const
 | |
|     operator=(T& x) const
 | |
|     {
 | |
|         typedef typename aux::tag<Tag, T>::type result;
 | |
|         return result(x);
 | |
|     }
 | |
| 
 | |
|     template <class Default>
 | |
|     aux::default_<Tag, Default>
 | |
|     operator|(Default& default_) const
 | |
|     {
 | |
|         return aux::default_<Tag, Default>(default_);
 | |
|     }
 | |
| 
 | |
|     template <class Default>
 | |
|     aux::lazy_default<Tag, Default>
 | |
|     operator||(Default& default_) const
 | |
|     {
 | |
|         return aux::lazy_default<Tag, Default>(default_);
 | |
|     }
 | |
| 
 | |
|     template <class T>
 | |
|     typename aux::tag<Tag, T const>::type const
 | |
|     operator=(T const& x) const
 | |
|     {
 | |
|         typedef typename aux::tag<Tag, T const>::type result;
 | |
|         return result(x);
 | |
|     }
 | |
| 
 | |
|     template <class Default>
 | |
|     aux::default_<Tag, const Default>
 | |
|     operator|(const Default& default_) const
 | |
|     {
 | |
|         return aux::default_<Tag, const Default>(default_);
 | |
|     }
 | |
| 
 | |
|     template <class Default>
 | |
|     aux::lazy_default<Tag, Default>
 | |
|     operator||(Default const& default_) const
 | |
|     {
 | |
|         return aux::lazy_default<Tag, Default>(default_);
 | |
|     }
 | |
| 
 | |
|  public: // Insurance against ODR violations
 | |
|     
 | |
|     // People will need to define these keywords in header files.  To
 | |
|     // prevent ODR violations, it's important that the keyword used in
 | |
|     // every instantiation of a function template is the same object.
 | |
|     // We provide a reference to a common instance of each keyword
 | |
|     // object and prevent construction by users.
 | |
|     static keyword<Tag> const instance;
 | |
| 
 | |
|     // This interface is deprecated
 | |
|     static keyword<Tag>& get()
 | |
|     {
 | |
|         return const_cast<keyword<Tag>&>(instance);
 | |
|     }
 | |
| };
 | |
| 
 | |
| template <class Tag>
 | |
| keyword<Tag> const keyword<Tag>::instance = {};
 | |
| 
 | |
| // Reduces boilerplate required to declare and initialize keywords
 | |
| // without violating ODR.  Declares a keyword tag type with the given
 | |
| // name in namespace tag_namespace, and declares and initializes a
 | |
| // reference in an anonymous namespace to a singleton instance of that
 | |
| // type.
 | |
| 
 | |
| #define BOOST_PARAMETER_KEYWORD(tag_namespace,name)                 \
 | |
|     namespace tag_namespace                                         \
 | |
|     {                                                               \
 | |
|       struct name                                                   \
 | |
|       {                                                             \
 | |
|           static char const* keyword_name()                         \
 | |
|           {                                                         \
 | |
|               return #name;                                         \
 | |
|           }                                                         \
 | |
|       };                                                            \
 | |
|     }                                                               \
 | |
|     namespace                                                       \
 | |
|     {                                                               \
 | |
|        ::boost::parameter::keyword<tag_namespace::name> const& name \
 | |
|        = ::boost::parameter::keyword<tag_namespace::name>::instance;\
 | |
|     }
 | |
| 
 | |
| }} // namespace boost::parameter
 | |
| 
 | |
| #endif // KEYWORD_050328_HPP
 | |
| 
 | 
