Chris@16: // Copyright Daniel Wallin, David Abrahams 2005. Use, modification and Chris@16: // distribution is subject to the Boost Software License, Version 1.0. (See Chris@16: // accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef KEYWORD_050328_HPP Chris@16: #define KEYWORD_050328_HPP Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { namespace parameter { Chris@16: Chris@16: // Instances of unique specializations of keyword<...> serve to Chris@16: // associate arguments with parameter names. For example: Chris@16: // Chris@16: // struct rate_; // parameter names Chris@16: // struct skew_; Chris@16: // namespace Chris@16: // { Chris@16: // keyword rate; // keywords Chris@16: // keyword skew; Chris@16: // } Chris@16: // Chris@16: // ... Chris@16: // Chris@16: // f(rate = 1, skew = 2.4); Chris@16: // Chris@16: template Chris@16: struct keyword Chris@16: { Chris@16: template Chris@16: typename aux::tag::type const Chris@16: operator=(T& x) const Chris@16: { Chris@16: typedef typename aux::tag::type result; Chris@16: return result(x); Chris@16: } Chris@16: Chris@16: template Chris@16: aux::default_ Chris@16: operator|(Default& default_) const Chris@16: { Chris@16: return aux::default_(default_); Chris@16: } Chris@16: Chris@16: template Chris@16: aux::lazy_default Chris@16: operator||(Default& default_) const Chris@16: { Chris@16: return aux::lazy_default(default_); Chris@16: } Chris@16: Chris@16: #if !BOOST_WORKAROUND(BOOST_MSVC, < 1300) // avoid partial ordering bugs Chris@16: template Chris@16: typename aux::tag::type const Chris@16: operator=(T const& x) const Chris@16: { Chris@16: typedef typename aux::tag::type result; Chris@16: return result(x); Chris@16: } Chris@16: #endif Chris@16: Chris@16: #if !BOOST_WORKAROUND(BOOST_MSVC, < 1300) // avoid partial ordering bugs Chris@16: template Chris@16: aux::default_ Chris@16: operator|(const Default& default_) const Chris@16: #if BOOST_WORKAROUND(BOOST_MSVC, == 1300) Chris@16: volatile Chris@16: #endif Chris@16: { Chris@16: return aux::default_(default_); Chris@16: } Chris@16: Chris@16: template Chris@16: aux::lazy_default Chris@16: operator||(Default const& default_) const Chris@16: #if BOOST_WORKAROUND(BOOST_MSVC, == 1300) Chris@16: volatile Chris@16: #endif Chris@16: { Chris@16: return aux::lazy_default(default_); Chris@16: } Chris@16: #endif Chris@16: Chris@16: public: // Insurance against ODR violations Chris@16: Chris@16: // People will need to define these keywords in header files. To Chris@16: // prevent ODR violations, it's important that the keyword used in Chris@16: // every instantiation of a function template is the same object. Chris@16: // We provide a reference to a common instance of each keyword Chris@16: // object and prevent construction by users. Chris@16: static keyword const instance; Chris@16: Chris@16: // This interface is deprecated Chris@16: static keyword& get() Chris@16: { Chris@16: return const_cast&>(instance); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: keyword const keyword::instance = {}; Chris@16: Chris@16: // Reduces boilerplate required to declare and initialize keywords Chris@16: // without violating ODR. Declares a keyword tag type with the given Chris@16: // name in namespace tag_namespace, and declares and initializes a Chris@16: // reference in an anonymous namespace to a singleton instance of that Chris@16: // type. Chris@16: Chris@16: #if BOOST_WORKAROUND(BOOST_MSVC, < 1300) Chris@16: Chris@16: # define BOOST_PARAMETER_KEYWORD(tag_namespace,name) \ Chris@16: namespace tag_namespace \ Chris@16: { \ Chris@16: struct name \ Chris@16: { \ Chris@16: static char const* keyword_name() \ Chris@16: { \ Chris@16: return #name; \ Chris@16: } \ Chris@16: }; \ Chris@16: } \ Chris@16: static ::boost::parameter::keyword const& name \ Chris@16: = ::boost::parameter::keyword::instance; Chris@16: Chris@16: #else Chris@16: Chris@16: #define BOOST_PARAMETER_KEYWORD(tag_namespace,name) \ Chris@16: namespace tag_namespace \ Chris@16: { \ Chris@16: struct name \ Chris@16: { \ Chris@16: static char const* keyword_name() \ Chris@16: { \ Chris@16: return #name; \ Chris@16: } \ Chris@16: }; \ Chris@16: } \ Chris@16: namespace \ Chris@16: { \ Chris@16: ::boost::parameter::keyword const& name \ Chris@16: = ::boost::parameter::keyword::instance;\ Chris@16: } Chris@16: Chris@16: #endif Chris@16: Chris@16: }} // namespace boost::parameter Chris@16: Chris@16: #endif // KEYWORD_050328_HPP Chris@16: