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