git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@7605 626c5289-ae23-0410-ae9c-e8d60b6d4f22
132 lines
4.2 KiB
Text
132 lines
4.2 KiB
Text
/* ------------------------------------------------------------
|
|
* Overloaded operator support
|
|
* ------------------------------------------------------------ */
|
|
|
|
|
|
#ifdef __cplusplus
|
|
%define %pybinoperator(pyname,oper)
|
|
%rename(pyname) oper;
|
|
%pythonmaybecall oper;
|
|
%enddef
|
|
|
|
%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!=);
|
|
|
|
%define %pybinoperation(oper)
|
|
%pythonmaybecall __ ## oper ## __;
|
|
%pythonmaybecall __r ## oper ## __;
|
|
%enddef
|
|
|
|
%pybinoperation(add);
|
|
%pybinoperation(pos);
|
|
%pybinoperation(pos);
|
|
%pybinoperation(sub);
|
|
%pybinoperation(neg);
|
|
%pybinoperation(neg);
|
|
%pybinoperation(mul);
|
|
%pybinoperation(div);
|
|
%pybinoperation(mod);
|
|
%pybinoperation(lshift);
|
|
%pybinoperation(rshift);
|
|
%pybinoperation(and);
|
|
%pybinoperation(or);
|
|
%pybinoperation(xor);
|
|
%pybinoperation(lt);
|
|
%pybinoperation(le);
|
|
%pybinoperation(gt);
|
|
%pybinoperation(ge);
|
|
%pybinoperation(eq);
|
|
%pybinoperation(ne);
|
|
|
|
|
|
/* Special cases */
|
|
%rename(__invert__) *::operator~;
|
|
%rename(__call__) *::operator();
|
|
|
|
/* Ignored operators */
|
|
%ignorewarn("361:operator! ignored") operator!;
|
|
%ignorewarn("381:operator&& ignored") operator&&;
|
|
%ignorewarn("382:operator|| ignored") operator||;
|
|
%ignorewarn("362:operator= ignored") *::operator=;
|
|
%ignorewarn("383:operator++ ignored") *::operator++;
|
|
%ignorewarn("384:operator-- ignored") *::operator--;
|
|
%ignorewarn("386:operator->* ignored") *::operator->*;
|
|
%ignorewarn("389:operator[] ignored (consider using %extend)") *::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("self:disown") *::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("self:disown","") 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("self:disown","") *::operator+=;
|
|
%feature("new","") *::operator+=;
|
|
|
|
*/
|
|
|
|
%define %swig_inplace_oper(Oper, PyOper)
|
|
%feature("self:disown") *::Oper;
|
|
%feature("new") *::Oper;
|
|
%rename(__##PyOper##__) *::Oper;
|
|
%enddef
|
|
|
|
%swig_inplace_oper(operator +=, iadd);
|
|
%swig_inplace_oper(operator -=, isub);
|
|
%swig_inplace_oper(operator *=, imul);
|
|
%swig_inplace_oper(operator /=, idiv);
|
|
%swig_inplace_oper(operator %=, imod);
|
|
%swig_inplace_oper(operator &=, iand);
|
|
%swig_inplace_oper(operator |=, ior);
|
|
%swig_inplace_oper(operator ^=, ixor);
|
|
%swig_inplace_oper(operator <<=, ilshift);
|
|
%swig_inplace_oper(operator >>=, irshift);
|
|
|
|
#endif
|