1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
|
/* 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<Bar *>($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<Bar *>((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
|