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