diff options
Diffstat (limited to 'Examples/test-suite/li_factory.i')
| -rw-r--r-- | Examples/test-suite/li_factory.i | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/Examples/test-suite/li_factory.i b/Examples/test-suite/li_factory.i new file mode 100644 index 0000000..7c59d53 --- /dev/null +++ b/Examples/test-suite/li_factory.i @@ -0,0 +1,49 @@ +%module li_factory +%include factory.i + +%newobject Geometry::create; + +%newobject Geometry::clone; +%factory(Geometry *Geometry::create, Point, Circle); +%factory(Geometry *Geometry::clone, Point, Circle); +#ifdef SWIGPHP +%rename(clone_) clone; +#endif +%factory(Geometry *Point::clone, Point, Circle); +%factory(Geometry *Circle::clone, Point, Circle); + +%inline { + struct Geometry { + enum GeomType{ + POINT, + CIRCLE + }; + + virtual ~Geometry() {} + virtual int draw() = 0; + static Geometry *create(GeomType i); + virtual Geometry *clone() = 0; + }; + + struct Point : Geometry { + int draw() { return 1; } + double width() { return 1.0; } + Geometry *clone() { return new Point(); } + }; + + struct Circle : Geometry { + int draw() { return 2; } + double radius() { return 1.5; } + Geometry *clone() { return new Circle(); } + }; + + Geometry *Geometry::create(GeomType type) { + switch (type) { + case POINT: return new Point(); + case CIRCLE: return new Circle(); + default: return 0; + } + } +} + + |
