annotate DEPENDENCIES/generic/include/boost/python/args.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents 2665513ce2d3
children
rev   line source
Chris@16 1 // Copyright David Abrahams 2002.
Chris@16 2 // Distributed under the Boost Software License, Version 1.0. (See
Chris@16 3 // accompanying file LICENSE_1_0.txt or copy at
Chris@16 4 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 5 #ifndef KEYWORDS_DWA2002323_HPP
Chris@16 6 # define KEYWORDS_DWA2002323_HPP
Chris@16 7
Chris@16 8 # include <boost/python/detail/prefix.hpp>
Chris@16 9
Chris@16 10 # include <boost/python/args_fwd.hpp>
Chris@16 11 # include <boost/config.hpp>
Chris@16 12 # include <boost/python/detail/preprocessor.hpp>
Chris@16 13 # include <boost/python/detail/type_list.hpp>
Chris@16 14
Chris@16 15 # include <boost/type_traits/is_reference.hpp>
Chris@16 16 # include <boost/type_traits/remove_reference.hpp>
Chris@16 17 # include <boost/type_traits/remove_cv.hpp>
Chris@16 18
Chris@16 19 # include <boost/preprocessor/enum_params.hpp>
Chris@16 20 # include <boost/preprocessor/repeat.hpp>
Chris@16 21 # include <boost/preprocessor/facilities/intercept.hpp>
Chris@16 22 # include <boost/preprocessor/iteration/local.hpp>
Chris@16 23
Chris@16 24 # include <boost/python/detail/mpl_lambda.hpp>
Chris@16 25 # include <boost/python/object_core.hpp>
Chris@16 26
Chris@16 27 # include <boost/mpl/bool.hpp>
Chris@16 28
Chris@16 29 # include <cstddef>
Chris@16 30 # include <algorithm>
Chris@16 31
Chris@16 32 namespace boost { namespace python {
Chris@16 33
Chris@16 34 typedef detail::keywords<1> arg;
Chris@16 35 typedef arg arg_; // gcc 2.96 workaround
Chris@16 36
Chris@16 37 namespace detail
Chris@16 38 {
Chris@16 39 template <std::size_t nkeywords>
Chris@16 40 struct keywords_base
Chris@16 41 {
Chris@16 42 BOOST_STATIC_CONSTANT(std::size_t, size = nkeywords);
Chris@16 43
Chris@16 44 keyword_range range() const
Chris@16 45 {
Chris@16 46 return keyword_range(elements, elements + nkeywords);
Chris@16 47 }
Chris@16 48
Chris@16 49 keyword elements[nkeywords];
Chris@16 50
Chris@16 51 keywords<nkeywords+1>
Chris@16 52 operator,(python::arg const &k) const;
Chris@16 53
Chris@16 54 keywords<nkeywords + 1>
Chris@16 55 operator,(char const *name) const;
Chris@16 56 };
Chris@16 57
Chris@16 58 template <std::size_t nkeywords>
Chris@16 59 struct keywords : keywords_base<nkeywords>
Chris@16 60 {
Chris@16 61 };
Chris@16 62
Chris@16 63 template <>
Chris@16 64 struct keywords<1> : keywords_base<1>
Chris@16 65 {
Chris@16 66 explicit keywords(char const *name)
Chris@16 67 {
Chris@16 68 elements[0].name = name;
Chris@16 69 }
Chris@16 70
Chris@16 71 template <class T>
Chris@16 72 python::arg& operator=(T const& value)
Chris@16 73 {
Chris@16 74 object z(value);
Chris@16 75 elements[0].default_value = handle<>(python::borrowed(object(value).ptr()));
Chris@16 76 return *this;
Chris@16 77 }
Chris@16 78
Chris@16 79 operator detail::keyword const&() const
Chris@16 80 {
Chris@16 81 return elements[0];
Chris@16 82 }
Chris@16 83 };
Chris@16 84
Chris@16 85 template <std::size_t nkeywords>
Chris@16 86 inline
Chris@16 87 keywords<nkeywords+1>
Chris@16 88 keywords_base<nkeywords>::operator,(python::arg const &k) const
Chris@16 89 {
Chris@16 90 keywords<nkeywords> const& l = *static_cast<keywords<nkeywords> const*>(this);
Chris@16 91 python::detail::keywords<nkeywords+1> res;
Chris@16 92 std::copy(l.elements, l.elements+nkeywords, res.elements);
Chris@16 93 res.elements[nkeywords] = k.elements[0];
Chris@16 94 return res;
Chris@16 95 }
Chris@16 96
Chris@16 97 template <std::size_t nkeywords>
Chris@16 98 inline
Chris@16 99 keywords<nkeywords + 1>
Chris@16 100 keywords_base<nkeywords>::operator,(char const *name) const
Chris@16 101 {
Chris@16 102 return this->operator,(python::arg(name));
Chris@16 103 }
Chris@16 104
Chris@16 105 # ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
Chris@16 106 template<typename T>
Chris@16 107 struct is_keywords
Chris@16 108 {
Chris@16 109 BOOST_STATIC_CONSTANT(bool, value = false);
Chris@16 110 };
Chris@16 111
Chris@16 112 template<std::size_t nkeywords>
Chris@16 113 struct is_keywords<keywords<nkeywords> >
Chris@16 114 {
Chris@16 115 BOOST_STATIC_CONSTANT(bool, value = true);
Chris@16 116 };
Chris@16 117 template <class T>
Chris@16 118 struct is_reference_to_keywords
Chris@16 119 {
Chris@16 120 BOOST_STATIC_CONSTANT(bool, is_ref = is_reference<T>::value);
Chris@16 121 typedef typename remove_reference<T>::type deref;
Chris@16 122 typedef typename remove_cv<deref>::type key_t;
Chris@16 123 BOOST_STATIC_CONSTANT(bool, is_key = is_keywords<key_t>::value);
Chris@16 124 BOOST_STATIC_CONSTANT(bool, value = (is_ref & is_key));
Chris@16 125
Chris@16 126 typedef mpl::bool_<value> type;
Chris@16 127 BOOST_PYTHON_MPL_LAMBDA_SUPPORT(1,is_reference_to_keywords,(T))
Chris@16 128 };
Chris@16 129 # else
Chris@16 130 typedef char (&yes_keywords_t)[1];
Chris@16 131 typedef char (&no_keywords_t)[2];
Chris@16 132
Chris@16 133 no_keywords_t is_keywords_test(...);
Chris@16 134
Chris@16 135 template<std::size_t nkeywords>
Chris@16 136 yes_keywords_t is_keywords_test(void (*)(keywords<nkeywords>&));
Chris@16 137
Chris@16 138 template<std::size_t nkeywords>
Chris@16 139 yes_keywords_t is_keywords_test(void (*)(keywords<nkeywords> const&));
Chris@16 140
Chris@16 141 template<typename T>
Chris@16 142 class is_reference_to_keywords
Chris@16 143 {
Chris@16 144 public:
Chris@16 145 BOOST_STATIC_CONSTANT(
Chris@16 146 bool, value = (
Chris@16 147 sizeof(detail::is_keywords_test( (void (*)(T))0 ))
Chris@16 148 == sizeof(detail::yes_keywords_t)));
Chris@16 149
Chris@16 150 typedef mpl::bool_<value> type;
Chris@16 151 BOOST_PYTHON_MPL_LAMBDA_SUPPORT(1,is_reference_to_keywords,(T))
Chris@16 152 };
Chris@16 153 # endif
Chris@16 154 }
Chris@16 155
Chris@16 156 inline detail::keywords<1> args(char const* name)
Chris@16 157 {
Chris@16 158 return detail::keywords<1>(name);
Chris@16 159 }
Chris@16 160
Chris@16 161 # define BOOST_PYTHON_ASSIGN_NAME(z, n, _) result.elements[n].name = name##n;
Chris@16 162 # define BOOST_PP_LOCAL_MACRO(n) \
Chris@16 163 inline detail::keywords<n> args(BOOST_PP_ENUM_PARAMS_Z(1, n, char const* name)) \
Chris@16 164 { \
Chris@16 165 detail::keywords<n> result; \
Chris@16 166 BOOST_PP_REPEAT_1(n, BOOST_PYTHON_ASSIGN_NAME, _) \
Chris@16 167 return result; \
Chris@16 168 }
Chris@16 169 # define BOOST_PP_LOCAL_LIMITS (2, BOOST_PYTHON_MAX_ARITY)
Chris@16 170 # include BOOST_PP_LOCAL_ITERATE()
Chris@16 171
Chris@16 172 }} // namespace boost::python
Chris@16 173
Chris@16 174
Chris@16 175 # endif // KEYWORDS_DWA2002323_HPP