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
|