summaryrefslogtreecommitdiff
path: root/devtools/swigwin-1.3.34/Lib/python/pyopers.swg
blob: 442515dace9335fb565e04da569be1f528687be4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
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