diff options
Diffstat (limited to 'trunk/Examples/php/disown')
-rw-r--r-- | trunk/Examples/php/disown/Makefile | 24 | ||||
-rw-r--r-- | trunk/Examples/php/disown/example.cxx | 51 | ||||
-rw-r--r-- | trunk/Examples/php/disown/example.h | 50 | ||||
-rw-r--r-- | trunk/Examples/php/disown/example.i | 12 | ||||
-rw-r--r-- | trunk/Examples/php/disown/runme.php | 49 |
5 files changed, 186 insertions, 0 deletions
diff --git a/trunk/Examples/php/disown/Makefile b/trunk/Examples/php/disown/Makefile new file mode 100644 index 000000000..1bc0beaab --- /dev/null +++ b/trunk/Examples/php/disown/Makefile @@ -0,0 +1,24 @@ +TOP = ../.. +SWIG = $(TOP)/../preinst-swig +CXXSRCS = example.cxx +TARGET = example +INTERFACE = example.i +LIBS = +SWIGOPT = + +all:: + $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ + SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \ + php_cpp + +static:: + $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ + SWIGOPT='$(SWIGOPT)' TARGET='myphp' INTERFACE='$(INTERFACE)' \ + php_cpp_static + +clean:: + $(MAKE) -f $(TOP)/Makefile php_clean + rm -f $(TARGET).php + +check: all + $(MAKE) -f $(TOP)/Makefile php_run diff --git a/trunk/Examples/php/disown/example.cxx b/trunk/Examples/php/disown/example.cxx new file mode 100644 index 000000000..6393735e9 --- /dev/null +++ b/trunk/Examples/php/disown/example.cxx @@ -0,0 +1,51 @@ +/* File : example.c */ + +#include "example.h" +#include <math.h> +#ifndef M_PI +# define M_PI 3.14159265358979323846 +#endif + +int Shape::get_nshapes() { + return nshapes; +} + +/* Move the shape to a new location */ +void Shape::move(double dx, double dy) { + x += dx; + y += dy; +} + +int Shape::nshapes = 0; + +void Circle::set_radius( double r ) { + radius = r; +} + +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; +} + +ShapeContainer::~ShapeContainer() { + iterator i=shapes.begin(); + for( iterator i = shapes.begin(); i != shapes.end(); ++i ) { + delete *i; + } +} + +void +ShapeContainer::addShape( Shape *s ) { + shapes.push_back( s ); +} diff --git a/trunk/Examples/php/disown/example.h b/trunk/Examples/php/disown/example.h new file mode 100644 index 000000000..985bc333d --- /dev/null +++ b/trunk/Examples/php/disown/example.h @@ -0,0 +1,50 @@ +/* File : example.h */ + +#include <vector> + +class Shape { +public: + Shape() { + nshapes++; + } + virtual ~Shape() { + nshapes--; + }; + double x, y; + void move(double dx, double dy); + virtual double area(void) = 0; + virtual double perimeter(void) = 0; + static int nshapes; + static int get_nshapes(); +}; + +class Circle : public Shape { +private: + double radius; +public: + Circle(double r) : radius(r) { }; + ~Circle() { }; + void set_radius( double r ); + virtual double area(void); + virtual double perimeter(void); +}; + +class Square : public Shape { +private: + double width; +public: + Square(double w) : width(w) { }; + ~Square() { } + virtual double area(void); + virtual double perimeter(void); +}; + +class ShapeContainer { +private: + typedef std::vector<Shape*>::iterator iterator; + std::vector<Shape*> shapes; +public: + ShapeContainer() : shapes() {}; + ~ShapeContainer(); + void addShape( Shape *s ); +}; diff --git a/trunk/Examples/php/disown/example.i b/trunk/Examples/php/disown/example.i new file mode 100644 index 000000000..599f162c5 --- /dev/null +++ b/trunk/Examples/php/disown/example.i @@ -0,0 +1,12 @@ +/* File : example.i */ +%module example + +%{ +#include "example.h" +%} + +%apply SWIGTYPE *DISOWN {(Shape *s)}; + +/* Let's just grab the original header file here */ +%include "example.h" + diff --git a/trunk/Examples/php/disown/runme.php b/trunk/Examples/php/disown/runme.php new file mode 100644 index 000000000..d90b03a9d --- /dev/null +++ b/trunk/Examples/php/disown/runme.php @@ -0,0 +1,49 @@ +<?php + +# This file illustrates the low-level C++ interface +# created by SWIG. In this case, all of our C++ classes +# get converted into function calls. + +require("example.php"); + +# ----- Object creation ----- + +print "Creating some objects:\n"; +$c = new Circle(10); +print " Created circle \$c\n"; +$s = new Square(10); +print " Created square \$s\n"; + +# ----- Create the ShapeContainer ---- + +$container = new ShapeContainer(); + +$container->addShape($c); +$container->addShape($s); + +# ----- Access a static member ----- + +print "\nA total of " . Shape::nshapes() . " shapes were created\n"; + +# ----- Delete by the old references ----- +# This should not truely delete the shapes because they are now owned +# by the ShapeContainer. + +print "Delete the old references."; + +# Note: this invokes the virtual destructor +$c = NULL; +$s = NULL; + +print "\nA total of " . Shape::nshapes() . " shapes remain\n"; + +# ----- Delete by the container ----- +# This should truely delete the shapes + +print "Delete the container."; +$container = NULL; +print "\nA total of " . Shape::nshapes() . " shapes remain\n"; + +print "Goodbye\n"; + +?> |