annotate DEPENDENCIES/generic/include/boost/python/object_operators.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 OBJECT_OPERATORS_DWA2002617_HPP
Chris@16 6 # define OBJECT_OPERATORS_DWA2002617_HPP
Chris@16 7
Chris@16 8 # include <boost/python/detail/prefix.hpp>
Chris@16 9
Chris@16 10 # include <boost/python/object_core.hpp>
Chris@16 11 # include <boost/python/call.hpp>
Chris@16 12 # include <boost/iterator/detail/enable_if.hpp>
Chris@16 13 # include <boost/mpl/bool.hpp>
Chris@16 14
Chris@16 15 # include <boost/iterator/detail/config_def.hpp>
Chris@16 16
Chris@16 17 namespace boost { namespace python { namespace api {
Chris@16 18
Chris@16 19 template <class X>
Chris@16 20 char is_object_operators_helper(object_operators<X> const*);
Chris@16 21
Chris@16 22 typedef char (&no_type)[2];
Chris@16 23 no_type is_object_operators_helper(...);
Chris@16 24
Chris@16 25 template <class X> X* make_ptr();
Chris@16 26
Chris@16 27 template <class L, class R = L>
Chris@16 28 struct is_object_operators
Chris@16 29 {
Chris@16 30 enum {
Chris@16 31 value
Chris@16 32 = (sizeof(api::is_object_operators_helper(api::make_ptr<L>()))
Chris@16 33 + sizeof(api::is_object_operators_helper(api::make_ptr<R>()))
Chris@16 34 < 4
Chris@16 35 )
Chris@16 36 };
Chris@16 37 typedef mpl::bool_<value> type;
Chris@16 38 };
Chris@16 39
Chris@16 40 # if !defined(BOOST_NO_SFINAE) && !defined(BOOST_NO_IS_CONVERTIBLE)
Chris@16 41 template <class L, class R, class T>
Chris@16 42 struct enable_binary
Chris@16 43 : boost::iterators::enable_if<is_object_operators<L,R>, T>
Chris@16 44 {};
Chris@16 45 # define BOOST_PYTHON_BINARY_RETURN(T) typename enable_binary<L,R,T>::type
Chris@16 46 # else
Chris@16 47 # define BOOST_PYTHON_BINARY_RETURN(T) T
Chris@16 48 # endif
Chris@16 49
Chris@16 50 template <class U>
Chris@16 51 object object_operators<U>::operator()() const
Chris@16 52 {
Chris@16 53 object_cref2 f = *static_cast<U const*>(this);
Chris@16 54 return call<object>(f.ptr());
Chris@16 55 }
Chris@16 56
Chris@16 57
Chris@16 58 template <class U>
Chris@16 59 inline
Chris@16 60 object_operators<U>::operator bool_type() const
Chris@16 61 {
Chris@16 62 object_cref2 x = *static_cast<U const*>(this);
Chris@16 63 int is_true = PyObject_IsTrue(x.ptr());
Chris@16 64 if (is_true < 0) throw_error_already_set();
Chris@16 65 return is_true ? &object::ptr : 0;
Chris@16 66 }
Chris@16 67
Chris@16 68 template <class U>
Chris@16 69 inline bool
Chris@16 70 object_operators<U>::operator!() const
Chris@16 71 {
Chris@16 72 object_cref2 x = *static_cast<U const*>(this);
Chris@16 73 int is_true = PyObject_IsTrue(x.ptr());
Chris@16 74 if (is_true < 0) throw_error_already_set();
Chris@16 75 return !is_true;
Chris@16 76 }
Chris@16 77
Chris@16 78 # define BOOST_PYTHON_COMPARE_OP(op, opid) \
Chris@16 79 template <class L, class R> \
Chris@16 80 BOOST_PYTHON_BINARY_RETURN(object) operator op(L const& l, R const& r) \
Chris@16 81 { \
Chris@16 82 return PyObject_RichCompare( \
Chris@16 83 object(l).ptr(), object(r).ptr(), opid); \
Chris@16 84 }
Chris@16 85 # undef BOOST_PYTHON_COMPARE_OP
Chris@16 86
Chris@16 87 # define BOOST_PYTHON_BINARY_OPERATOR(op) \
Chris@16 88 BOOST_PYTHON_DECL object operator op(object const& l, object const& r); \
Chris@16 89 template <class L, class R> \
Chris@16 90 BOOST_PYTHON_BINARY_RETURN(object) operator op(L const& l, R const& r) \
Chris@16 91 { \
Chris@16 92 return object(l) op object(r); \
Chris@16 93 }
Chris@16 94 BOOST_PYTHON_BINARY_OPERATOR(>)
Chris@16 95 BOOST_PYTHON_BINARY_OPERATOR(>=)
Chris@16 96 BOOST_PYTHON_BINARY_OPERATOR(<)
Chris@16 97 BOOST_PYTHON_BINARY_OPERATOR(<=)
Chris@16 98 BOOST_PYTHON_BINARY_OPERATOR(==)
Chris@16 99 BOOST_PYTHON_BINARY_OPERATOR(!=)
Chris@16 100 BOOST_PYTHON_BINARY_OPERATOR(+)
Chris@16 101 BOOST_PYTHON_BINARY_OPERATOR(-)
Chris@16 102 BOOST_PYTHON_BINARY_OPERATOR(*)
Chris@16 103 BOOST_PYTHON_BINARY_OPERATOR(/)
Chris@16 104 BOOST_PYTHON_BINARY_OPERATOR(%)
Chris@16 105 BOOST_PYTHON_BINARY_OPERATOR(<<)
Chris@16 106 BOOST_PYTHON_BINARY_OPERATOR(>>)
Chris@16 107 BOOST_PYTHON_BINARY_OPERATOR(&)
Chris@16 108 BOOST_PYTHON_BINARY_OPERATOR(^)
Chris@16 109 BOOST_PYTHON_BINARY_OPERATOR(|)
Chris@16 110 # undef BOOST_PYTHON_BINARY_OPERATOR
Chris@16 111
Chris@16 112
Chris@16 113 # define BOOST_PYTHON_INPLACE_OPERATOR(op) \
Chris@16 114 BOOST_PYTHON_DECL object& operator op(object& l, object const& r); \
Chris@16 115 template <class R> \
Chris@16 116 object& operator op(object& l, R const& r) \
Chris@16 117 { \
Chris@16 118 return l op object(r); \
Chris@16 119 }
Chris@16 120 BOOST_PYTHON_INPLACE_OPERATOR(+=)
Chris@16 121 BOOST_PYTHON_INPLACE_OPERATOR(-=)
Chris@16 122 BOOST_PYTHON_INPLACE_OPERATOR(*=)
Chris@16 123 BOOST_PYTHON_INPLACE_OPERATOR(/=)
Chris@16 124 BOOST_PYTHON_INPLACE_OPERATOR(%=)
Chris@16 125 BOOST_PYTHON_INPLACE_OPERATOR(<<=)
Chris@16 126 BOOST_PYTHON_INPLACE_OPERATOR(>>=)
Chris@16 127 BOOST_PYTHON_INPLACE_OPERATOR(&=)
Chris@16 128 BOOST_PYTHON_INPLACE_OPERATOR(^=)
Chris@16 129 BOOST_PYTHON_INPLACE_OPERATOR(|=)
Chris@16 130 # undef BOOST_PYTHON_INPLACE_OPERATOR
Chris@16 131
Chris@16 132 }}} // namespace boost::python
Chris@16 133
Chris@16 134 #include <boost/iterator/detail/config_undef.hpp>
Chris@16 135
Chris@16 136 #endif // OBJECT_OPERATORS_DWA2002617_HPP