Index: swig/Lib/python/pyopers.swg |
=================================================================== |
--- swig/Lib/python/pyopers.swg (revision 0) |
+++ swig/Lib/python/pyopers.swg (revision 0) |
@@ -0,0 +1,136 @@ |
+/* ------------------------------------------------------------ |
+ * Overloaded operator support |
+ * ------------------------------------------------------------ */ |
+ |
+ |
+#ifdef __cplusplus |
+ |
+#define %pybinoperator(pyname,oper) %rename(pyname) oper; %pythonmaybecall oper |
+ |
+%pybinoperator(__add__, *::operator+); |
+%pybinoperator(__pos__, *::operator+()); |
+%pybinoperator(__pos__, *::operator+() const); |
+%pybinoperator(__sub__, *::operator-); |
+%pybinoperator(__neg__, *::operator-()); |
+%pybinoperator(__neg__, *::operator-() const); |
+%pybinoperator(__mul__, *::operator*); |
+%pybinoperator(__div__, *::operator/); |
+%pybinoperator(__mod__, *::operator%); |
+%pybinoperator(__lshift__, *::operator<<); |
+%pybinoperator(__rshift__, *::operator>>); |
+%pybinoperator(__and__, *::operator&); |
+%pybinoperator(__or__, *::operator|); |
+%pybinoperator(__xor__, *::operator^); |
+%pybinoperator(__lt__, *::operator<); |
+%pybinoperator(__le__, *::operator<=); |
+%pybinoperator(__gt__, *::operator>); |
+%pybinoperator(__ge__, *::operator>=); |
+%pybinoperator(__eq__, *::operator==); |
+%pybinoperator(__ne__, *::operator!=); |
+ |
+ |
+ |
+/* Special cases */ |
+%rename(__invert__) *::operator~; |
+%rename(__call__) *::operator(); |
+ |
+%feature("shadow") *::operator bool %{ |
+def __nonzero__(self): |
+ return $action(self) |
+__bool__ = __nonzero__ |
+%}; |
+%rename(__nonzero__) *::operator bool; |
+ |
+/* Ignored operators */ |
+%ignoreoperator(LNOT) operator!; |
+%ignoreoperator(LAND) operator&&; |
+%ignoreoperator(LOR) operator||; |
+%ignoreoperator(EQ) *::operator=; |
+%ignoreoperator(PLUSPLUS) *::operator++; |
+%ignoreoperator(MINUSMINUS) *::operator--; |
+%ignoreoperator(ARROWSTAR) *::operator->*; |
+%ignoreoperator(INDEX) *::operator[]; |
+ |
+/* |
+ Inplace operator declarations. |
+ |
+ They translate the inplace C++ operators (+=, -=, ...) into the |
+ corresponding python equivalents(__iadd__,__isub__), etc, |
+ disabling the ownership of the input 'self' pointer, and assigning |
+ it to the returning object: |
+ |
+ %feature("del") *::Operator; |
+ %feature("new") *::Operator; |
+ |
+ This makes the most common case safe, ie: |
+ |
+ A& A::operator+=(int i) { ...; return *this; } |
+ ^^^^ ^^^^^^ |
+ |
+ will work fine, even when the resulting python object shares the |
+ 'this' pointer with the input one. The input object is usually |
+ deleted after the operation, including the shared 'this' pointer, |
+ producing 'strange' seg faults, as reported by Lucriz |
+ (lucriz@sitilandia.it). |
+ |
+ If you have an interface that already takes care of that, ie, you |
+ already are using inplace operators and you are not getting |
+ seg. faults, with the new scheme you could end with 'free' elements |
+ that never get deleted (maybe, not sure, it depends). But if that is |
+ the case, you could recover the old behaviour using |
+ |
+ %feature("del","") A::operator+=; |
+ %feature("new","") A::operator+=; |
+ |
+ which recovers the old behaviour for the class 'A', or if you are |
+ 100% sure your entire system works fine in the old way, use: |
+ |
+ %feature("del","") *::operator+=; |
+ %feature("new","") *::operator+=; |
+ |
+*/ |
+ |
+#define %pyinplaceoper(SwigPyOper, Oper) %delobject Oper; %newobject Oper; %rename(SwigPyOper) Oper |
+ |
+%pyinplaceoper(__iadd__ , *::operator +=); |
+%pyinplaceoper(__isub__ , *::operator -=); |
+%pyinplaceoper(__imul__ , *::operator *=); |
+%pyinplaceoper(__idiv__ , *::operator /=); |
+%pyinplaceoper(__imod__ , *::operator %=); |
+%pyinplaceoper(__iand__ , *::operator &=); |
+%pyinplaceoper(__ior__ , *::operator |=); |
+%pyinplaceoper(__ixor__ , *::operator ^=); |
+%pyinplaceoper(__ilshift__, *::operator <<=); |
+%pyinplaceoper(__irshift__, *::operator >>=); |
+ |
+ |
+/* Finally, in python we need to mark the binary operations to fail as |
+ 'maybecall' methods */ |
+ |
+#define %pybinopermaybecall(oper) %pythonmaybecall __ ## oper ## __; %pythonmaybecall __r ## oper ## __ |
+ |
+%pybinopermaybecall(add); |
+%pybinopermaybecall(pos); |
+%pybinopermaybecall(pos); |
+%pybinopermaybecall(sub); |
+%pybinopermaybecall(neg); |
+%pybinopermaybecall(neg); |
+%pybinopermaybecall(mul); |
+%pybinopermaybecall(div); |
+%pybinopermaybecall(mod); |
+%pybinopermaybecall(lshift); |
+%pybinopermaybecall(rshift); |
+%pybinopermaybecall(and); |
+%pybinopermaybecall(or); |
+%pybinopermaybecall(xor); |
+%pybinopermaybecall(lt); |
+%pybinopermaybecall(le); |
+%pybinopermaybecall(gt); |
+%pybinopermaybecall(ge); |
+%pybinopermaybecall(eq); |
+%pybinopermaybecall(ne); |
+ |
+#endif |
+ |
+ |
+ |