diff options
author | Haibo Huang <hhb@google.com> | 2019-10-08 15:48:26 -0700 |
---|---|---|
committer | Haibo Huang <hhb@google.com> | 2019-11-14 22:14:23 +0000 |
commit | 80b4251e302efb18c145a4786249d695397ed42a (patch) | |
tree | 12b9dec2513f7caa92e7835bc17ab16ae5635df6 /Examples/test-suite/member_pointer_const.i | |
parent | 189852d8cdfd5863c52ec7aa73affd926c5a3f43 (diff) | |
parent | 1e36f51346d95f8b9848e682c2eb986e9cb9b4f4 (diff) | |
download | swig-80b4251e302efb18c145a4786249d695397ed42a.tar.gz |
Upgrade swig to 'rel-4.0.1'llvm-r383902b
Also run autogen.sh to generate configure files.
Exempt-From-Owner-Approval: add myself to owners
Change-Id: I391aa20428836ae74dab8c8427627ca4dbc8ecf4
Diffstat (limited to 'Examples/test-suite/member_pointer_const.i')
-rw-r--r-- | Examples/test-suite/member_pointer_const.i | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/Examples/test-suite/member_pointer_const.i b/Examples/test-suite/member_pointer_const.i new file mode 100644 index 000000000..4af712f7f --- /dev/null +++ b/Examples/test-suite/member_pointer_const.i @@ -0,0 +1,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; |