Chris@16: // Copyright David Abrahams 2002. Chris@16: // Distributed under the Boost Software License, Version 1.0. (See Chris@16: // accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: #ifndef OBJECT_OPERATORS_DWA2002617_HPP Chris@16: # define OBJECT_OPERATORS_DWA2002617_HPP Chris@16: Chris@16: # include Chris@16: Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: Chris@16: # include Chris@16: Chris@16: namespace boost { namespace python { namespace api { Chris@16: Chris@16: template Chris@16: char is_object_operators_helper(object_operators const*); Chris@16: Chris@16: typedef char (&no_type)[2]; Chris@16: no_type is_object_operators_helper(...); Chris@16: Chris@16: template X* make_ptr(); Chris@16: Chris@16: template Chris@16: struct is_object_operators Chris@16: { Chris@16: enum { Chris@16: value Chris@16: = (sizeof(api::is_object_operators_helper(api::make_ptr())) Chris@16: + sizeof(api::is_object_operators_helper(api::make_ptr())) Chris@16: < 4 Chris@16: ) Chris@16: }; Chris@16: typedef mpl::bool_ type; Chris@16: }; Chris@16: Chris@16: # if !defined(BOOST_NO_SFINAE) && !defined(BOOST_NO_IS_CONVERTIBLE) Chris@16: template Chris@16: struct enable_binary Chris@16: : boost::iterators::enable_if, T> Chris@16: {}; Chris@16: # define BOOST_PYTHON_BINARY_RETURN(T) typename enable_binary::type Chris@16: # else Chris@16: # define BOOST_PYTHON_BINARY_RETURN(T) T Chris@16: # endif Chris@16: Chris@16: template Chris@16: object object_operators::operator()() const Chris@16: { Chris@16: object_cref2 f = *static_cast(this); Chris@16: return call(f.ptr()); Chris@16: } Chris@16: Chris@16: Chris@16: template Chris@16: inline Chris@16: object_operators::operator bool_type() const Chris@16: { Chris@16: object_cref2 x = *static_cast(this); Chris@16: int is_true = PyObject_IsTrue(x.ptr()); Chris@16: if (is_true < 0) throw_error_already_set(); Chris@16: return is_true ? &object::ptr : 0; Chris@16: } Chris@16: Chris@16: template Chris@16: inline bool Chris@16: object_operators::operator!() const Chris@16: { Chris@16: object_cref2 x = *static_cast(this); Chris@16: int is_true = PyObject_IsTrue(x.ptr()); Chris@16: if (is_true < 0) throw_error_already_set(); Chris@16: return !is_true; Chris@16: } Chris@16: Chris@16: # define BOOST_PYTHON_COMPARE_OP(op, opid) \ Chris@16: template \ Chris@16: BOOST_PYTHON_BINARY_RETURN(object) operator op(L const& l, R const& r) \ Chris@16: { \ Chris@16: return PyObject_RichCompare( \ Chris@16: object(l).ptr(), object(r).ptr(), opid); \ Chris@16: } Chris@16: # undef BOOST_PYTHON_COMPARE_OP Chris@16: Chris@16: # define BOOST_PYTHON_BINARY_OPERATOR(op) \ Chris@16: BOOST_PYTHON_DECL object operator op(object const& l, object const& r); \ Chris@16: template \ Chris@16: BOOST_PYTHON_BINARY_RETURN(object) operator op(L const& l, R const& r) \ Chris@16: { \ Chris@16: return object(l) op object(r); \ Chris@16: } Chris@16: BOOST_PYTHON_BINARY_OPERATOR(>) Chris@16: BOOST_PYTHON_BINARY_OPERATOR(>=) Chris@16: BOOST_PYTHON_BINARY_OPERATOR(<) Chris@16: BOOST_PYTHON_BINARY_OPERATOR(<=) Chris@16: BOOST_PYTHON_BINARY_OPERATOR(==) Chris@16: BOOST_PYTHON_BINARY_OPERATOR(!=) Chris@16: BOOST_PYTHON_BINARY_OPERATOR(+) Chris@16: BOOST_PYTHON_BINARY_OPERATOR(-) Chris@16: BOOST_PYTHON_BINARY_OPERATOR(*) Chris@16: BOOST_PYTHON_BINARY_OPERATOR(/) Chris@16: BOOST_PYTHON_BINARY_OPERATOR(%) Chris@16: BOOST_PYTHON_BINARY_OPERATOR(<<) Chris@16: BOOST_PYTHON_BINARY_OPERATOR(>>) Chris@16: BOOST_PYTHON_BINARY_OPERATOR(&) Chris@16: BOOST_PYTHON_BINARY_OPERATOR(^) Chris@16: BOOST_PYTHON_BINARY_OPERATOR(|) Chris@16: # undef BOOST_PYTHON_BINARY_OPERATOR Chris@16: Chris@16: Chris@16: # define BOOST_PYTHON_INPLACE_OPERATOR(op) \ Chris@16: BOOST_PYTHON_DECL object& operator op(object& l, object const& r); \ Chris@16: template \ Chris@16: object& operator op(object& l, R const& r) \ Chris@16: { \ Chris@16: return l op object(r); \ Chris@16: } Chris@16: BOOST_PYTHON_INPLACE_OPERATOR(+=) Chris@16: BOOST_PYTHON_INPLACE_OPERATOR(-=) Chris@16: BOOST_PYTHON_INPLACE_OPERATOR(*=) Chris@16: BOOST_PYTHON_INPLACE_OPERATOR(/=) Chris@16: BOOST_PYTHON_INPLACE_OPERATOR(%=) Chris@16: BOOST_PYTHON_INPLACE_OPERATOR(<<=) Chris@16: BOOST_PYTHON_INPLACE_OPERATOR(>>=) Chris@16: BOOST_PYTHON_INPLACE_OPERATOR(&=) Chris@16: BOOST_PYTHON_INPLACE_OPERATOR(^=) Chris@16: BOOST_PYTHON_INPLACE_OPERATOR(|=) Chris@16: # undef BOOST_PYTHON_INPLACE_OPERATOR Chris@16: Chris@16: }}} // namespace boost::python Chris@16: Chris@16: #include Chris@16: Chris@16: #endif // OBJECT_OPERATORS_DWA2002617_HPP