137 lines
4.4 KiB
C++
137 lines
4.4 KiB
C++
|
// 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
|