137 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			137 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
// 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
 |