%module(directors="1",dirprot="1") director_nested #pragma SWIG nowarn=SWIGWARN_TYPEMAP_THREAD_UNSAFE,SWIGWARN_TYPEMAP_DIRECTOROUT_PTR %{ #include #include %} %include "std_string.i" %feature("director") Bar; %feature("director") Foo; %feature("director") FooBar; %newobject *::create(); %inline { template class Foo { public: virtual ~Foo() {} std::string advance() { return "Foo::advance;" + do_advance(); } protected: virtual std::string do_advance() = 0; }; } %template(Foo_int) Foo; %inline { class Bar : public Foo { public: std::string step() { return "Bar::step;" + advance(); } protected: std::string do_advance() { return "Bar::do_advance;" + do_step(); } #if defined(SWIGPYTHON) || defined(SWIGRUBY) || \ defined(SWIGJAVA) || defined(SWIGOCAML) || defined(SWIGCSHARP) virtual std::string do_step() const = 0; #else virtual std::string do_step() const {return "";}; #endif }; template class FooBar : public Bar { public: virtual C get_value() const = 0; virtual const char * get_name() { return "FooBar::get_name"; } const char *name() { return get_name(); } static FooBar *get_self(FooBar *a) { return a; } }; } %template(FooBar_int) FooBar;