diff --git a/SWIG/Examples/tcl/mpointer/Makefile b/SWIG/Examples/tcl/mpointer/Makefile new file mode 100644 index 000000000..7d3d5f9cb --- /dev/null +++ b/SWIG/Examples/tcl/mpointer/Makefile @@ -0,0 +1,19 @@ +TOP = ../.. +SWIG = $(TOP)/../swig +CXXSRCS = example.cxx +TARGET = example +INTERFACE = example.i +LIBS = -lm + +all:: + $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ + TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' tcl_cpp + +static:: + $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ + TARGET='mytclsh' INTERFACE='$(INTERFACE)' tclsh_cpp_static + +clean:: + $(MAKE) -f $(TOP)/Makefile tcl_clean + +check: all diff --git a/SWIG/Examples/tcl/mpointer/example.cxx b/SWIG/Examples/tcl/mpointer/example.cxx new file mode 100644 index 000000000..80d95f618 --- /dev/null +++ b/SWIG/Examples/tcl/mpointer/example.cxx @@ -0,0 +1,48 @@ +/* File : example.c */ + +#include "example.h" +#include +#ifndef M_PI +# define M_PI 3.14159265358979323846 +#endif + +/* 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 M_PI*radius*radius; +} + +double Circle::perimeter(void) { + return 2*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; + diff --git a/SWIG/Examples/tcl/mpointer/example.h b/SWIG/Examples/tcl/mpointer/example.h new file mode 100644 index 000000000..110fe91c1 --- /dev/null +++ b/SWIG/Examples/tcl/mpointer/example.h @@ -0,0 +1,50 @@ +/* File : example.h */ + +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); + + + diff --git a/SWIG/Examples/tcl/mpointer/example.i b/SWIG/Examples/tcl/mpointer/example.i new file mode 100644 index 000000000..238792be8 --- /dev/null +++ b/SWIG/Examples/tcl/mpointer/example.i @@ -0,0 +1,16 @@ +/* File : example.i */ +%module example + +%{ +#include "example.h" +%} + +/* Let's just grab the original header file here */ +%include "example.h" + +/* Some constants */ + +%constant double (Shape::*AREAPT)(void) = &Shape::area; +%constant double (Shape::*PERIMPT)(void) = &Shape::perimeter; +%constant double (Shape::*NULLPT)(void) = 0; + diff --git a/SWIG/Examples/tcl/mpointer/runme.tcl b/SWIG/Examples/tcl/mpointer/runme.tcl new file mode 100644 index 000000000..5eefad89f --- /dev/null +++ b/SWIG/Examples/tcl/mpointer/runme.tcl @@ -0,0 +1,49 @@ +# Example using pointers to member functions + +catch { load ./example[info sharedlibextension] example} + +# Get the pointers + +set area_pt [ areapt ] +set perim_pt [ perimeterpt ] + +puts "area_pt = $area_pt" +puts "perim_pt = $perim_pt" + +# Create some objects + +set c [Circle -args 4] +set s [Square -args 10] + +# Do some calculations + +puts "Circle area = [do_op $c $area_pt]" +puts "Circle perim = [do_op $c $perim_pt]" +puts "Square area = [do_op $s $area_pt]" +puts "Square perim = [do_op $s $perim_pt]" + +puts "areavar = $areavar"; +puts "perimetervar = $perimetervar"; + +# Try the variables +puts "Circle area = [do_op $c $areavar]" +puts "Circle perim = [do_op $c $perimetervar]" +puts "Square area = [do_op $s $areavar]" +puts "Square perim = [do_op $s $perimetervar]" + +# Modify one of the variables +set areavar $perim_pt + +puts "Circle perimeter = [do_op $c $areavar]" + +# Try the constants + +puts "example.AREAPT = $AREAPT" +puts "example.PERIMPT= $PERIMPT" +puts "example.NULLPT = $NULLPT" + +puts "Circle area = [do_op $c $AREAPT]" +puts "Circle perim = [do_op $c $PERIMPT]" +puts "Square area = [do_op $s $AREAPT]" +puts "Square perim = [do_op $s $PERIMPT]" +