diff options
Diffstat (limited to 'Examples/test-suite/member_pointer.i')
| -rw-r--r-- | Examples/test-suite/member_pointer.i | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/Examples/test-suite/member_pointer.i b/Examples/test-suite/member_pointer.i new file mode 100644 index 0000000..f03528c --- /dev/null +++ b/Examples/test-suite/member_pointer.i @@ -0,0 +1,101 @@ +%module member_pointer + +%inline %{ +class Shape { +public: + Shape() { + nshapes++; + } + virtual ~Shape() { + nshapes--; + }; + double x, y; + double *z; + + void move(double dx, double dy); + virtual double area(void) = 0; + virtual double perimeter(void) = 0; + static int nshapes; +}; + +class Circle : public Shape { +private: + double radius; +public: + Circle(double r) : radius(r) { }; + virtual double area(void); + virtual double perimeter(void); +}; + +class Square : public Shape { +private: + double width; +public: + Square(double w) : width(w) { }; + virtual double area(void); + virtual double perimeter(void); +}; + +extern double do_op(Shape *s, double (Shape::*m)(void)); + +/* Functions that return member pointers */ + +extern double (Shape::*areapt())(void); +extern double (Shape::*perimeterpt())(void); + +/* Global variables that are member pointers */ +extern double (Shape::*areavar)(void); +extern double (Shape::*perimetervar)(void); + +%} + +%{ +# 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) { + return SWIG_M_PI*radius*radius; +} + +double Circle::perimeter(void) { + return 2*SWIG_M_PI*radius; +} + +double Square::area(void) { + return width*width; +} + +double Square::perimeter(void) { + return 4*width; +} + +double do_op(Shape *s, double (Shape::*m)(void)) { + return (s->*m)(); +} + +double (Shape::*areapt())(void) { + return &Shape::area; +} + +double (Shape::*perimeterpt())(void) { + return &Shape::perimeter; +} + +/* Member pointer variables */ +double (Shape::*areavar)(void) = &Shape::area; +double (Shape::*perimetervar)(void) = &Shape::perimeter; +%} + + +/* Some constants */ +%constant double (Shape::*AREAPT)(void) = &Shape::area; +%constant double (Shape::*PERIMPT)(void) = &Shape::perimeter; +%constant double (Shape::*NULLPT)(void) = 0; + |
