diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /devtools/swigwin-1.3.34/Lib/python/pyopers.swg | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'devtools/swigwin-1.3.34/Lib/python/pyopers.swg')
| -rw-r--r-- | devtools/swigwin-1.3.34/Lib/python/pyopers.swg | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/devtools/swigwin-1.3.34/Lib/python/pyopers.swg b/devtools/swigwin-1.3.34/Lib/python/pyopers.swg new file mode 100644 index 0000000..442515d --- /dev/null +++ b/devtools/swigwin-1.3.34/Lib/python/pyopers.swg @@ -0,0 +1,129 @@ +/* ------------------------------------------------------------ + * 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(); + +/* 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 + ([email protected]). + + 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(PyOper, Oper) %delobject Oper; %newobject Oper; %rename(PyOper) 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 + + + |