%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;