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