123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- // 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 OBJECT_OPERATORS_DWA2002617_HPP
- # define OBJECT_OPERATORS_DWA2002617_HPP
- # include <boost/python/detail/prefix.hpp>
- # include <boost/python/object_core.hpp>
- # include <boost/python/call.hpp>
- # include <boost/iterator/detail/enable_if.hpp>
- # include <boost/mpl/bool.hpp>
- # include <boost/iterator/detail/config_def.hpp>
- namespace boost { namespace python { namespace api {
- template <class X>
- char is_object_operators_helper(object_operators<X> const*);
-
- typedef char (&no_type)[2];
- no_type is_object_operators_helper(...);
- template <class X> X* make_ptr();
- template <class L, class R = L>
- struct is_object_operators
- {
- enum {
- value
- = (sizeof(api::is_object_operators_helper(api::make_ptr<L>()))
- + sizeof(api::is_object_operators_helper(api::make_ptr<R>()))
- < 4
- )
- };
- typedef mpl::bool_<value> type;
- };
- # if !defined(BOOST_NO_SFINAE) && !defined(BOOST_NO_IS_CONVERTIBLE)
- template <class L, class R, class T>
- struct enable_binary
- : boost::iterators::enable_if<is_object_operators<L,R>, T>
- {};
- # define BOOST_PYTHON_BINARY_RETURN(T) typename enable_binary<L,R,T>::type
- # else
- # define BOOST_PYTHON_BINARY_RETURN(T) T
- # endif
- template <class U>
- object object_operators<U>::operator()() const
- {
- object_cref2 f = *static_cast<U const*>(this);
- return call<object>(f.ptr());
- }
- template <class U>
- inline
- object_operators<U>::operator bool_type() const
- {
- object_cref2 x = *static_cast<U const*>(this);
- int is_true = PyObject_IsTrue(x.ptr());
- if (is_true < 0) throw_error_already_set();
- return is_true ? &object::ptr : 0;
- }
- template <class U>
- inline bool
- object_operators<U>::operator!() const
- {
- object_cref2 x = *static_cast<U const*>(this);
- int is_true = PyObject_IsTrue(x.ptr());
- if (is_true < 0) throw_error_already_set();
- return !is_true;
- }
- # define BOOST_PYTHON_COMPARE_OP(op, opid) \
- template <class L, class R> \
- BOOST_PYTHON_BINARY_RETURN(object) operator op(L const& l, R const& r) \
- { \
- return PyObject_RichCompare( \
- object(l).ptr(), object(r).ptr(), opid); \
- }
- # undef BOOST_PYTHON_COMPARE_OP
-
- # define BOOST_PYTHON_BINARY_OPERATOR(op) \
- BOOST_PYTHON_DECL object operator op(object const& l, object const& r); \
- template <class L, class R> \
- BOOST_PYTHON_BINARY_RETURN(object) operator op(L const& l, R const& r) \
- { \
- return object(l) op object(r); \
- }
- BOOST_PYTHON_BINARY_OPERATOR(>)
- BOOST_PYTHON_BINARY_OPERATOR(>=)
- BOOST_PYTHON_BINARY_OPERATOR(<)
- BOOST_PYTHON_BINARY_OPERATOR(<=)
- BOOST_PYTHON_BINARY_OPERATOR(==)
- BOOST_PYTHON_BINARY_OPERATOR(!=)
- BOOST_PYTHON_BINARY_OPERATOR(+)
- BOOST_PYTHON_BINARY_OPERATOR(-)
- BOOST_PYTHON_BINARY_OPERATOR(*)
- BOOST_PYTHON_BINARY_OPERATOR(/)
- BOOST_PYTHON_BINARY_OPERATOR(%)
- BOOST_PYTHON_BINARY_OPERATOR(<<)
- BOOST_PYTHON_BINARY_OPERATOR(>>)
- BOOST_PYTHON_BINARY_OPERATOR(&)
- BOOST_PYTHON_BINARY_OPERATOR(^)
- BOOST_PYTHON_BINARY_OPERATOR(|)
- # undef BOOST_PYTHON_BINARY_OPERATOR
-
- # define BOOST_PYTHON_INPLACE_OPERATOR(op) \
- BOOST_PYTHON_DECL object& operator op(object& l, object const& r); \
- template <class R> \
- object& operator op(object& l, R const& r) \
- { \
- return l op object(r); \
- }
- BOOST_PYTHON_INPLACE_OPERATOR(+=)
- BOOST_PYTHON_INPLACE_OPERATOR(-=)
- BOOST_PYTHON_INPLACE_OPERATOR(*=)
- BOOST_PYTHON_INPLACE_OPERATOR(/=)
- BOOST_PYTHON_INPLACE_OPERATOR(%=)
- BOOST_PYTHON_INPLACE_OPERATOR(<<=)
- BOOST_PYTHON_INPLACE_OPERATOR(>>=)
- BOOST_PYTHON_INPLACE_OPERATOR(&=)
- BOOST_PYTHON_INPLACE_OPERATOR(^=)
- BOOST_PYTHON_INPLACE_OPERATOR(|=)
- # undef BOOST_PYTHON_INPLACE_OPERATOR
- }}} // namespace boost::python
- #include <boost/iterator/detail/config_undef.hpp>
- #endif // OBJECT_OPERATORS_DWA2002617_HPP
|