diff --git a/Examples/test-suite/java/li_boost_shared_ptr_director_runme.java b/Examples/test-suite/java/li_boost_shared_ptr_director_runme.java index 904eab387..9349c622b 100644 --- a/Examples/test-suite/java/li_boost_shared_ptr_director_runme.java +++ b/Examples/test-suite/java/li_boost_shared_ptr_director_runme.java @@ -1,60 +1,129 @@ -public class li_boost_shared_ptr_runme { +import li_boost_shared_ptr_director.*; + +public class li_boost_shared_ptr_director_runme { static { try { - System.loadLibrary("li_boost_shared_ptr"); + System.loadLibrary("li_boost_shared_ptr_director"); } catch (UnsatisfiedLinkError e) { System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); System.exit(1); } } - private static void check(String got, String expected) { - if (!got.equals(expected)) + private static void check(int got, int expected) { + if (got != expected) throw new RuntimeException("Failed, got: " + got + " expected: " + expected); } public static void main(String argv[]) { - li_boost_shared_ptr_director_Derived a = li_boost_shared_ptr_director_Derived.new(false); - li_boost_shared_ptr_director_Derived b = li_boost_shared_ptr_director_Derived.new(true); + li_boost_shared_ptr_director_Derived a = new li_boost_shared_ptr_director_Derived(false); + li_boost_shared_ptr_director_Derived b = new li_boost_shared_ptr_director_Derived(true); - check(call_ret_c_shared_ptr(a) == 1); - check(call_ret_c_shared_ptr(b) == -1); - check(call_ret_c_by_value(a) == 1); + check(li_boost_shared_ptr_director.call_ret_c_shared_ptr(a), 1); + check(li_boost_shared_ptr_director.call_ret_c_shared_ptr(b), -1); + check(li_boost_shared_ptr_director.call_ret_c_by_value(a), 1); - check(call_take_c_by_value(a) == 5); - check(call_take_c_shared_ptr_by_value(a) == 6); - check(call_take_c_shared_ptr_by_ref(a) == 7); - check(call_take_c_shared_ptr_by_pointer(a) == 8); - check(call_take_c_shared_ptr_by_pointer_ref(a) == 9); + check(li_boost_shared_ptr_director.call_ret_c_shared_ptr(a), 1); + check(li_boost_shared_ptr_director.call_ret_c_shared_ptr(b), -1); + check(li_boost_shared_ptr_director.call_ret_c_by_value(a), 1); - check(call_take_c_shared_ptr_by_value_with_null(a) == -2); - check(call_take_c_shared_ptr_by_ref_with_null(a) == -3); - check(call_take_c_shared_ptr_by_pointer_with_null(a) == -4); - check(call_take_c_shared_ptr_by_pointer_ref_with_null(a) == -5); + check(li_boost_shared_ptr_director.call_take_c_by_value(a), 5); + check(li_boost_shared_ptr_director.call_take_c_by_ref(a), 6); + check(li_boost_shared_ptr_director.call_take_c_by_pointer(a), 7); + check(li_boost_shared_ptr_director.call_take_c_by_pointer_ref(a), 8); + check(li_boost_shared_ptr_director.call_take_c_shared_ptr_by_value(a), 9); + check(li_boost_shared_ptr_director.call_take_c_shared_ptr_by_ref(a), 10); + check(li_boost_shared_ptr_director.call_take_c_shared_ptr_by_pointer(a), 11); + check(li_boost_shared_ptr_director.call_take_c_shared_ptr_by_pointer_ref(a), 12); + check(li_boost_shared_ptr_director.call_take_c_by_pointer_with_null(a), -2); + check(li_boost_shared_ptr_director.call_take_c_by_pointer_ref_with_null(a), -3); + check(li_boost_shared_ptr_director.call_take_c_shared_ptr_by_value_with_null(a), -4); + check(li_boost_shared_ptr_director.call_take_c_shared_ptr_by_ref_with_null(a), -5); + check(li_boost_shared_ptr_director.call_take_c_shared_ptr_by_pointer_with_null(a), -6); + check(li_boost_shared_ptr_director.call_take_c_shared_ptr_by_pointer_ref_with_null(a), -7); } } -class li_boost_shared_ptr_director_Derived extends li_boost_shared_ptr_director.Base { +class li_boost_shared_ptr_director_Derived extends Base { - @Override - public String ping() { - return "li_boost_shared_ptr_director_MyBarFoo.ping()"; + private boolean return_none; + + li_boost_shared_ptr_director_Derived(boolean flag) { + super(); + this.return_none = flag; } @Override - public String pong() { - return "li_boost_shared_ptr_director_MyBarFoo.pong();" + ping(); + public C ret_c_shared_ptr() { + if (this.return_none) + return null; + else + return new C(); } @Override - public String upcall(li_boost_shared_ptr_director.FooBar fooBarPtr) { - return "override;" + fooBarPtr.FooBarDo(); + public C ret_c_by_value() { + return new C(); } @Override - public li_boost_shared_ptr_director.Foo makeFoo() { - return new li_boost_shared_ptr_director.Foo(); + public int take_c_by_value(C c) { + return c.get_m(); } + + @Override + public int take_c_by_ref(C c) { + return c.get_m(); + } + + @Override + public int take_c_by_pointer(C c) { + if (c != null) + return c.get_m(); + else + return -2; + } + + @Override + public int take_c_by_pointer_ref(C c) { + if (c != null) + return c.get_m(); + else + return -3; + } + + @Override + public int take_c_shared_ptr_by_value(C c) { + if (c != null) + return c.get_m(); + else + return -4; + } + + @Override + public int take_c_shared_ptr_by_ref(C c) { + if (c != null) + return c.get_m(); + else + return -5; + } + + @Override + public int take_c_shared_ptr_by_pointer(C c) { + if (c != null) + return c.get_m(); + else + return -6; + } + + @Override + public int take_c_shared_ptr_by_pointer_ref(C c) { + if (c != null) + return c.get_m(); + else + return -7; + } + } diff --git a/Examples/test-suite/li_boost_shared_ptr_director.i b/Examples/test-suite/li_boost_shared_ptr_director.i index 3c48c7942..a2cad1766 100644 --- a/Examples/test-suite/li_boost_shared_ptr_director.i +++ b/Examples/test-suite/li_boost_shared_ptr_director.i @@ -4,7 +4,8 @@ #include %} -#if defined(SWIGPYTHON) || defined(SWIGOCTAVE) || defined(SWIGRUBY) || defined(SWIGR) +//#if defined(SWIGJAVA) || defined(SWIGCSHARP) || defined(SWIGPYTHON) || defined(SWIGD) || defined(SWIGOCTAVE) || defined(SWIGRUBY) || defined(SWIGR) +#if defined(SWIGJAVA) || defined(SWIGPYTHON) || defined(SWIGOCTAVE) || defined(SWIGRUBY) || defined(SWIGR) #define SHARED_PTR_WRAPPERS_IMPLEMENTED #endif @@ -29,7 +30,7 @@ struct Base { virtual int take_c_by_value(C c) = 0; virtual int take_c_by_ref(C& c) = 0; virtual int take_c_by_pointer(C* c) = 0; - virtual int take_c_by_pointer_ref(C*& c) = 0; + virtual int take_c_by_pointer_ref(C*const& c) = 0; virtual int take_c_shared_ptr_by_value(boost::shared_ptr c) = 0; virtual int take_c_shared_ptr_by_ref(boost::shared_ptr& c) = 0; virtual int take_c_shared_ptr_by_pointer(boost::shared_ptr* c) = 0; diff --git a/Lib/java/boost_shared_ptr.i b/Lib/java/boost_shared_ptr.i index 6a5e0b2ed..325a6832d 100644 --- a/Lib/java/boost_shared_ptr.i +++ b/Lib/java/boost_shared_ptr.i @@ -31,6 +31,19 @@ %typemap(out) CONST TYPE %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %} +%typemap(directorin,descriptor="L$packagepath/$&javaclassname;") CONST TYPE +%{ $input = 0; + *((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (new $1_ltype((const $1_ltype &)$1)); %} + +%typemap(directorout) CONST TYPE +%{ if (!$input) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Attempt to dereference null $1_type"); + return $null; + } + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input; + $result = *smartarg->get(); + %} + // plain pointer %typemap(in) CONST TYPE * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input; @@ -39,6 +52,16 @@ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner) : 0; %} +%typemap(directorin,descriptor="L$packagepath/$javaclassname;") CONST TYPE * +%{ $input = 0; + if ($1) { + *((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > ($1 SWIG_NO_NULL_DELETER_0); + } %} + +%typemap(directorout) CONST TYPE * %{ +#error "typemaps for $1_type not available" +%} + // plain reference %typemap(in) CONST TYPE & %{ $1 = ($1_ltype)((*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0); @@ -49,6 +72,14 @@ %typemap(out, fragment="SWIG_null_deleter") CONST TYPE & %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner); %} +%typemap(directorin,descriptor="L$packagepath/$javaclassname;") CONST TYPE & +%{ $input = 0; + *((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (&$1 SWIG_NO_NULL_DELETER_0); %} + +%typemap(directorout) CONST TYPE & %{ +#error "typemaps for $1_type not available" +%} + // plain pointer by reference %typemap(in) TYPE *CONST& ($*1_ltype temp = 0) %{ temp = (TYPE *)((*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0); @@ -56,6 +87,16 @@ %typemap(out, fragment="SWIG_null_deleter") TYPE *CONST& %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_$owner); %} +%typemap(directorin,descriptor="L$packagepath/$*javaclassname;") TYPE *CONST& +%{ $input = 0; + if ($1) { + *((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > ($1 SWIG_NO_NULL_DELETER_0); + } %} + +%typemap(directorout) TYPE *CONST& %{ +#error "typemaps for $1_type not available" +%} + // shared_ptr by value %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > ($&1_type argp) %{ argp = *($&1_ltype*)&$input; @@ -63,12 +104,34 @@ %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > %{ *($&1_ltype*)&$result = $1 ? new $1_ltype($1) : 0; %} +%typemap(directorin,descriptor="L$packagepath/$typemap(jstype, TYPE);") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > +%{ $input = 0; + if ($1) { + *((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1); + } %} + +%typemap(directorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > +%{ if ($input) { + $&1_type smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input; + $result = *smartarg; + } %} + // shared_ptr by reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & ($*1_ltype tempnull) %{ $1 = $input ? *($&1_ltype)&$input : &tempnull; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ *($&1_ltype)&$result = *$1 ? new $*1_ltype(*$1) : 0; %} +%typemap(directorin,descriptor="L$packagepath/$typemap(jstype, TYPE);") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & +%{ $input = 0; + if ($1) { + *((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1); + } %} + +%typemap(directorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ +#error "typemaps for $1_type not available" +%} + // shared_ptr by pointer %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * ($*1_ltype tempnull) %{ $1 = $input ? *($&1_ltype)&$input : &tempnull; %} @@ -76,6 +139,16 @@ %{ *($&1_ltype)&$result = ($1 && *$1) ? new $*1_ltype(*$1) : 0; if ($owner) delete $1; %} +%typemap(directorin,descriptor="L$packagepath/$typemap(jstype, TYPE);") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * +%{ $input = 0; + if ($1 && *$1) { + *((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1); + } %} + +%typemap(directorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ +#error "typemaps for $1_type not available" +%} + // shared_ptr by pointer reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempnull, $*1_ltype temp = 0) %{ temp = $input ? *($1_ltype)&$input : &tempnull; @@ -83,6 +156,16 @@ %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ *($1_ltype)&$result = (*$1 && **$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(**$1) : 0; %} +%typemap(directorin,descriptor="L$packagepath/$typemap(jstype, TYPE);") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& +%{ $input = 0; + if ($1 && *$1) { + *((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1); + } %} + +%typemap(directorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ +#error "typemaps for $1_type not available" +%} + // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" @@ -143,6 +226,18 @@ return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } +%typemap(javadirectorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > "$typemap(jstype, TYPE).getCPtr($javacall)" + +%typemap(javadirectorin) CONST TYPE, + CONST TYPE *, + CONST TYPE &, + TYPE *CONST& "($jniinput == 0) ? null : new $typemap(jstype, TYPE)($jniinput, true)" + +%typemap(javadirectorin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "($jniinput == 0) ? null : new $typemap(jstype, TYPE)($jniinput, true)" + // Base proxy classes %typemap(javabody) TYPE %{ private transient long swigCPtr;