Chris@16: // Copyright David Abrahams 2002. Chris@16: // Distributed under 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: #ifndef KEYWORDS_DWA2002323_HPP Chris@16: # define KEYWORDS_DWA2002323_HPP Chris@16: Chris@16: # include Chris@16: Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: Chris@16: # include Chris@16: # include Chris@16: Chris@16: # include Chris@16: Chris@16: # include Chris@16: # include Chris@16: Chris@16: namespace boost { namespace python { Chris@16: Chris@16: typedef detail::keywords<1> arg; Chris@16: typedef arg arg_; // gcc 2.96 workaround Chris@16: Chris@16: namespace detail Chris@16: { Chris@16: template Chris@16: struct keywords_base Chris@16: { Chris@16: BOOST_STATIC_CONSTANT(std::size_t, size = nkeywords); Chris@16: Chris@16: keyword_range range() const Chris@16: { Chris@16: return keyword_range(elements, elements + nkeywords); Chris@16: } Chris@16: Chris@16: keyword elements[nkeywords]; Chris@16: Chris@16: keywords Chris@16: operator,(python::arg const &k) const; Chris@16: Chris@16: keywords Chris@16: operator,(char const *name) const; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct keywords : keywords_base Chris@16: { Chris@16: }; Chris@16: Chris@16: template <> Chris@16: struct keywords<1> : keywords_base<1> Chris@16: { Chris@16: explicit keywords(char const *name) Chris@16: { Chris@16: elements[0].name = name; Chris@16: } Chris@16: Chris@16: template Chris@16: python::arg& operator=(T const& value) Chris@16: { Chris@16: object z(value); Chris@16: elements[0].default_value = handle<>(python::borrowed(object(value).ptr())); Chris@16: return *this; Chris@16: } Chris@16: Chris@16: operator detail::keyword const&() const Chris@16: { Chris@16: return elements[0]; Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: inline Chris@16: keywords Chris@16: keywords_base::operator,(python::arg const &k) const Chris@16: { Chris@16: keywords const& l = *static_cast const*>(this); Chris@16: python::detail::keywords res; Chris@16: std::copy(l.elements, l.elements+nkeywords, res.elements); Chris@16: res.elements[nkeywords] = k.elements[0]; Chris@16: return res; Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: keywords Chris@16: keywords_base::operator,(char const *name) const Chris@16: { Chris@16: return this->operator,(python::arg(name)); Chris@16: } Chris@16: Chris@16: # ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION Chris@16: template Chris@16: struct is_keywords Chris@16: { Chris@16: BOOST_STATIC_CONSTANT(bool, value = false); Chris@16: }; Chris@16: Chris@16: template Chris@16: struct is_keywords > Chris@16: { Chris@16: BOOST_STATIC_CONSTANT(bool, value = true); Chris@16: }; Chris@16: template Chris@16: struct is_reference_to_keywords Chris@16: { Chris@16: BOOST_STATIC_CONSTANT(bool, is_ref = is_reference::value); Chris@16: typedef typename remove_reference::type deref; Chris@16: typedef typename remove_cv::type key_t; Chris@16: BOOST_STATIC_CONSTANT(bool, is_key = is_keywords::value); Chris@16: BOOST_STATIC_CONSTANT(bool, value = (is_ref & is_key)); Chris@16: Chris@16: typedef mpl::bool_ type; Chris@16: BOOST_PYTHON_MPL_LAMBDA_SUPPORT(1,is_reference_to_keywords,(T)) Chris@16: }; Chris@16: # else Chris@16: typedef char (&yes_keywords_t)[1]; Chris@16: typedef char (&no_keywords_t)[2]; Chris@16: Chris@16: no_keywords_t is_keywords_test(...); Chris@16: Chris@16: template Chris@16: yes_keywords_t is_keywords_test(void (*)(keywords&)); Chris@16: Chris@16: template Chris@16: yes_keywords_t is_keywords_test(void (*)(keywords const&)); Chris@16: Chris@16: template Chris@16: class is_reference_to_keywords Chris@16: { Chris@16: public: Chris@16: BOOST_STATIC_CONSTANT( Chris@16: bool, value = ( Chris@16: sizeof(detail::is_keywords_test( (void (*)(T))0 )) Chris@16: == sizeof(detail::yes_keywords_t))); Chris@16: Chris@16: typedef mpl::bool_ type; Chris@16: BOOST_PYTHON_MPL_LAMBDA_SUPPORT(1,is_reference_to_keywords,(T)) Chris@16: }; Chris@16: # endif Chris@16: } Chris@16: Chris@16: inline detail::keywords<1> args(char const* name) Chris@16: { Chris@16: return detail::keywords<1>(name); Chris@16: } Chris@16: Chris@16: # define BOOST_PYTHON_ASSIGN_NAME(z, n, _) result.elements[n].name = name##n; Chris@16: # define BOOST_PP_LOCAL_MACRO(n) \ Chris@16: inline detail::keywords args(BOOST_PP_ENUM_PARAMS_Z(1, n, char const* name)) \ Chris@16: { \ Chris@16: detail::keywords result; \ Chris@16: BOOST_PP_REPEAT_1(n, BOOST_PYTHON_ASSIGN_NAME, _) \ Chris@16: return result; \ Chris@16: } Chris@16: # define BOOST_PP_LOCAL_LIMITS (2, BOOST_PYTHON_MAX_ARITY) Chris@16: # include BOOST_PP_LOCAL_ITERATE() Chris@16: Chris@16: }} // namespace boost::python Chris@16: Chris@16: Chris@16: # endif // KEYWORDS_DWA2002323_HPP