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 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
|
%module member_pointer_const
// Same as member_pointer.i but using member pointer const functions
%{
#if defined(__SUNPRO_CC)
#pragma error_messages (off, badargtype2w) /* Formal argument ... is being passed extern "C" ... */
#pragma error_messages (off, wbadinit) /* Using extern "C" ... to initialize ... */
#pragma error_messages (off, wbadasg) /* Assigning extern "C" ... */
#endif
%}
%inline %{
class Shape {
public:
Shape() {
nshapes++;
}
virtual ~Shape() {
nshapes--;
};
double x, y;
double *z;
void move(double dx, double dy);
virtual double area(void) const = 0;
virtual double perimeter(void) const = 0;
static int nshapes;
};
class Circle : public Shape {
private:
double radius;
public:
Circle(double r) : radius(r) { };
virtual double area(void) const;
virtual double perimeter(void) const;
};
class Square : public Shape {
private:
double width;
public:
Square(double w) : width(w) { };
virtual double area(void) const;
virtual double perimeter(void) const;
};
/* Typedef */
typedef double (Shape::*PerimeterFunc_td)(void) const;
extern double do_op(Shape *s, double (Shape::*m)(void) const);
extern double do_op_td(Shape *s, PerimeterFunc_td m);
/* Functions that return member pointers */
extern double (Shape::*areapt())(void) const;
extern double (Shape::*perimeterpt())(void) const;
extern PerimeterFunc_td perimeterpt_td();
/* Global variables that are member pointers */
extern double (Shape::*areavar)(void) const;
extern double (Shape::*perimetervar)(void) const;
extern PerimeterFunc_td perimetervar_td;
%}
%{
# define SWIG_M_PI 3.14159265358979323846
/* Move the shape to a new location */
void Shape::move(double dx, double dy) {
x += dx;
y += dy;
}
int Shape::nshapes = 0;
double Circle::area(void) const {
return SWIG_M_PI*radius*radius;
}
double Circle::perimeter(void) const {
return 2*SWIG_M_PI*radius;
}
double Square::area(void) const {
return width*width;
}
double Square::perimeter(void) const {
return 4*width;
}
double do_op(Shape *s, double (Shape::*m)(void) const) {
return (s->*m)();
}
double do_op_td(Shape *s, PerimeterFunc_td m) {
return (s->*m)();
}
double (Shape::*areapt())(void) const {
return &Shape::area;
}
double (Shape::*perimeterpt())(void) const {
return &Shape::perimeter;
}
PerimeterFunc_td perimeterpt_td() {
return &Shape::perimeter;
}
/* Member pointer variables */
double (Shape::*areavar)(void) const = &Shape::area;
double (Shape::*perimetervar)(void) const = &Shape::perimeter;
PerimeterFunc_td perimetervar_td = &Shape::perimeter;
%}
/* Some constants */
%constant double (Shape::*AREAPT)(void) const = &Shape::area;
%constant double (Shape::*PERIMPT)(void) const = &Shape::perimeter;
%constant double (Shape::*NULLPT)(void) const = 0;
/*
%inline %{
struct Funktions {
void retByRef(int & (*d)(double)) {}
};
void byRef(int & (Funktions::*d)(double)) {}
%}
*/
%inline %{
struct Funktions {
int addByValue(const int &a, int b) const { return a+b; }
int * addByPointer(const int &a, int b) const { static int val; val = a+b; return &val; }
int & addByReference(const int &a, int b) const { static int val; val = a+b; return val; }
};
int call1(int (Funktions::*d)(const int &, int) const, int a, int b) { Funktions f; return (f.*d)(a, b); }
//int call2(int * (Funktions::*d)(const int &, int) const, int a, int b) { Funktions f; return *(f.*d)(a, b); }
//int call3(int & (Funktions::*d)(const int &, int) const, int a, int b) { Funktions f; return (f.*d)(a, b); }
%}
%constant int (Funktions::*ADD_BY_VALUE)(const int &, int) const = &Funktions::addByValue;
//%constant int * (Funktions::*ADD_BY_POINTER)(const int &, int) const = &Funktions::addByPointer;
//%constant int & (Funktions::*ADD_BY_REFERENCE)(const int &, int) const = &Funktions::addByReference;
|