From 32769435fd4f5c0ab7dde07feac70c0da1f19ebd Mon Sep 17 00:00:00 2001 From: William S Fulton Date: Wed, 8 Dec 2010 19:35:03 +0000 Subject: [PATCH] More extensive member function pointer test git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@12336 626c5289-ae23-0410-ae9c-e8d60b6d4f22 --- Examples/test-suite/common.mk | 1 + Examples/test-suite/member_funcptr_galore.i | 83 +++++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 Examples/test-suite/member_funcptr_galore.i diff --git a/Examples/test-suite/common.mk b/Examples/test-suite/common.mk index f0fe4af1c..833e1532b 100644 --- a/Examples/test-suite/common.mk +++ b/Examples/test-suite/common.mk @@ -231,6 +231,7 @@ CPP_TEST_CASES += \ li_windows \ long_long_apply \ memberin_extend \ + member_funcptr_galore \ member_pointer \ member_template \ minherit \ diff --git a/Examples/test-suite/member_funcptr_galore.i b/Examples/test-suite/member_funcptr_galore.i new file mode 100644 index 000000000..02ff02be0 --- /dev/null +++ b/Examples/test-suite/member_funcptr_galore.i @@ -0,0 +1,83 @@ +%module member_pointer + +%inline %{ + +namespace FunkSpace { +struct Funktions { + int addByValue(const int &a, int b) { return a+b; } + int * addByPointer(const int &a, int b) { static int val; val = a+b; return &val; } + int & addByReference(const int &a, int b) { static int val; val = a+b; return val; } +}; +} + +template struct Thing {}; +namespace Space { +class Shape { +public: + double x, y; + double *z; + + void move(double dx, double dy); + virtual double area(Shape &ref, int & (FunkSpace::Funktions::*d)(const int &, int)); + virtual double abc(Thing ts, Thing< const Space::Shape * > tda[]); +}; +} + +extern double do_op(Space::Shape *s, double (Space::Shape::*m)(void)); + +/* Functions that return member pointers */ + +extern double (Space::Shape::*areapt())(Space::Shape &, int & (FunkSpace::Funktions::*)(const int &, int)); +extern double (Space::Shape::*abcpt())(Thing, Thing< const Space::Shape * > tda[]); + +/* Global variables that are member pointers */ +extern double (Space::Shape::*areavar)(Space::Shape &, int & (FunkSpace::Funktions::*)(const int &, int)); +extern double (Space::Shape::*abcvar)(Thing, Thing< const Space::Shape * >[]); + +%} + +%{ +void Space::Shape::move(double dx, double dy) { + x += dx; + y += dy; +} + +double do_op(Space::Shape *s, double (Space::Shape::*m)(void)) { + return (s->*m)(); +} + +double (Space::Shape::*areapt(Space::Shape &ref, int & (FunkSpace::Funktions::*d)(const int &, int)))(Space::Shape &, int & (FunkSpace::Funktions::*d)(const int &, int)) { + return &Space::Shape::area; +} + +double (Space::Shape::*abcpt())(Thing, Thing< const Space::Shape * >[]) { + return &Space::Shape::abc; +} + +/* Member pointer variables */ +double (Space::Shape::*areavar)(Space::Shape &, int & (FunkSpace::Funktions::*)(const int &, int)) = &Space::Shape::area; +double (Space::Shape::*abcvar)(Thing, Thing< const Space::Shape * >[]) = &Space::Shape::abc; +%} + + +/* Some constants */ +%constant double (Space::Shape::*AREAPT)(Space::Shape &, int & (FunkSpace::Funktions::*)(const int &, int)) = &Space::Shape::area; +%constant double (Space::Shape::*PERIMPT)(Thing, Thing< const Space::Shape * >[]) = &Space::Shape::abc; +%constant double (Space::Shape::*NULLPT)(void) = 0; + +%inline %{ + +int call1(int (FunkSpace::Funktions::*d)(const int &, int), int a, int b) { FunkSpace::Funktions f; return (f.*d)(a, b); } +int call2(int * (FunkSpace::Funktions::*d)(const int &, int), int a, int b) { FunkSpace::Funktions f; return *(f.*d)(a, b); } +int call3(int & (FunkSpace::Funktions::*d)(const int &, int), int a, int b) { FunkSpace::Funktions f; return (f.*d)(a, b); } +%} + +%constant int (FunkSpace::Funktions::*ADD_BY_VALUE)(const int &, int) = &FunkSpace::Funktions::addByValue; +%constant int * (FunkSpace::Funktions::*ADD_BY_POINTER)(const int &, int) = &FunkSpace::Funktions::addByPointer; +%constant int & (FunkSpace::Funktions::*ADD_BY_REFERENCE)(const int &, int) = &FunkSpace::Funktions::addByReference; + +%inline %{ +// parameter that is a member pointer containing a function ptr, urgh :) +int unreal1(double (Space::Shape::*memptr)(Space::Shape &, int & (FunkSpace::Funktions::*)(const int &, int))) { return 0; } +int unreal2(double (Space::Shape::*memptr)(Thing)) { return 0; } +%}