/* File : example.i */ %module dynamic_cast #if !defined(SWIGJAVA) && !defined(SWIGCSHARP) && !defined(SWIGGO) && !defined(SWIGD) %apply SWIGTYPE *DYNAMIC { Foo * }; #endif %inline %{ class Foo { public: virtual ~Foo() { } virtual Foo *blah() { return this; } }; %} #if defined(SWIGJAVA) || defined(SWIGCSHARP) || defined(SWIGGO) || defined(SWIGD) %typemap(out) Foo *blah { Bar *downcast = dynamic_cast($1); *(Bar **)&$result = downcast; } #endif #if defined(SWIGJAVA) %typemap(javaout) Foo * { return new Bar($jnicall, $owner); } #endif #if defined(SWIGCSHARP) %typemap(csout, excode=SWIGEXCODE) Foo * { Bar ret = new Bar($imcall, $owner);$excode return ret; } #endif #if defined(SWIGD) %typemap(dout, excode=SWIGEXCODE) Foo * { Bar ret = new Bar($imcall, $owner);$excode return ret; } #endif #if defined(SWIGGO) %insert(go_runtime) %{ func FooToBar(f Foo) Bar { return SwigcptrBar(f.Swigcptr()) } %} #endif %inline %{ class Bar : public Foo { public: virtual Foo *blah() { return (Foo *) this; } virtual char * test() { return (char *) "Bar::test"; } }; char *do_test(Bar *b) { return b->test(); } %} #if !defined(SWIGJAVA) && !defined(SWIGCSHARP) && !defined(SWIGGO) && !defined(SWIGD) // A general purpose function for dynamic casting of a Foo * %{ static swig_type_info * Foo_dynamic(void **ptr) { Bar *b; b = dynamic_cast((Foo *) *ptr); if (b) { *ptr = (void *) b; return SWIGTYPE_p_Bar; } return 0; } %} // Register the above casting function DYNAMIC_CAST(SWIGTYPE_p_Foo, Foo_dynamic); #endif