Add director shared_ptr typemaps for C#
This commit is contained in:
parent
99bbc65bae
commit
46ea2ab0a6
3 changed files with 189 additions and 2 deletions
111
Examples/test-suite/csharp/li_boost_shared_ptr_director_runme.cs
Normal file
111
Examples/test-suite/csharp/li_boost_shared_ptr_director_runme.cs
Normal file
|
|
@ -0,0 +1,111 @@
|
||||||
|
using System;
|
||||||
|
using li_boost_shared_ptr_directorNamespace;
|
||||||
|
|
||||||
|
public class li_boost_shared_ptr_director_runme {
|
||||||
|
|
||||||
|
private static void check(int got, int expected) {
|
||||||
|
if (got != expected)
|
||||||
|
throw new Exception("Failed, got: " + got + " expected: " + expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Main() {
|
||||||
|
Derived a = new Derived(false);
|
||||||
|
Derived b = new Derived(true);
|
||||||
|
|
||||||
|
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(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(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 Derived : Base {
|
||||||
|
|
||||||
|
private bool return_none;
|
||||||
|
|
||||||
|
public Derived(bool flag) : base() {
|
||||||
|
this.return_none = flag;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override C ret_c_shared_ptr() {
|
||||||
|
if (this.return_none)
|
||||||
|
return null;
|
||||||
|
else
|
||||||
|
return new C();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override C ret_c_by_value() {
|
||||||
|
return new C();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int take_c_by_value(C c) {
|
||||||
|
return c.get_m();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int take_c_by_ref(C c) {
|
||||||
|
return c.get_m();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int take_c_by_pointer(C c) {
|
||||||
|
if (c != null)
|
||||||
|
return c.get_m();
|
||||||
|
else
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int take_c_by_pointer_ref(C c) {
|
||||||
|
if (c != null)
|
||||||
|
return c.get_m();
|
||||||
|
else
|
||||||
|
return -3;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int take_c_shared_ptr_by_value(C c) {
|
||||||
|
if (c != null)
|
||||||
|
return c.get_m();
|
||||||
|
else
|
||||||
|
return -4;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int take_c_shared_ptr_by_ref(C c) {
|
||||||
|
if (c != null)
|
||||||
|
return c.get_m();
|
||||||
|
else
|
||||||
|
return -5;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int take_c_shared_ptr_by_pointer(C c) {
|
||||||
|
if (c != null)
|
||||||
|
return c.get_m();
|
||||||
|
else
|
||||||
|
return -6;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int take_c_shared_ptr_by_pointer_ref(C c) {
|
||||||
|
if (c != null)
|
||||||
|
return c.get_m();
|
||||||
|
else
|
||||||
|
return -7;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
%}
|
%}
|
||||||
|
|
||||||
//#if defined(SWIGJAVA) || defined(SWIGCSHARP) || defined(SWIGPYTHON) || defined(SWIGD) || 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)
|
#if defined(SWIGJAVA) || defined(SWIGCSHARP) || defined(SWIGPYTHON) || defined(SWIGOCTAVE) || defined(SWIGRUBY) || defined(SWIGR)
|
||||||
#define SHARED_PTR_WRAPPERS_IMPLEMENTED
|
#define SHARED_PTR_WRAPPERS_IMPLEMENTED
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
@ -20,6 +20,7 @@ struct C {
|
||||||
C() : m(1) {}
|
C() : m(1) {}
|
||||||
C(int n) : m(n) {}
|
C(int n) : m(n) {}
|
||||||
int get_m() { return m; }
|
int get_m() { return m; }
|
||||||
|
private:
|
||||||
int m;
|
int m;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,18 @@
|
||||||
%typemap(out) CONST TYPE
|
%typemap(out) CONST TYPE
|
||||||
%{ $result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %}
|
%{ $result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %}
|
||||||
|
|
||||||
|
%typemap(directorin) 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_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Attempt to dereference null $1_type", 0);
|
||||||
|
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
|
// plain pointer
|
||||||
%typemap(in, canthrow=1) CONST TYPE * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{
|
%typemap(in, canthrow=1) CONST TYPE * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{
|
||||||
smartarg = (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input;
|
smartarg = (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input;
|
||||||
|
|
@ -39,6 +51,13 @@
|
||||||
$result = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner) : 0;
|
$result = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner) : 0;
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
%typemap(directorin) CONST TYPE *
|
||||||
|
%{ $input = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; %}
|
||||||
|
|
||||||
|
%typemap(directorout) CONST TYPE * %{
|
||||||
|
#error "typemaps for $1_type not available"
|
||||||
|
%}
|
||||||
|
|
||||||
// plain reference
|
// plain reference
|
||||||
%typemap(in, canthrow=1) CONST TYPE & %{
|
%typemap(in, canthrow=1) 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);
|
$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 +68,13 @@
|
||||||
%typemap(out, fragment="SWIG_null_deleter") CONST TYPE &
|
%typemap(out, fragment="SWIG_null_deleter") CONST TYPE &
|
||||||
%{ $result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner); %}
|
%{ $result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner); %}
|
||||||
|
|
||||||
|
%typemap(directorin) 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
|
// plain pointer by reference
|
||||||
%typemap(in) TYPE *CONST& ($*1_ltype temp = 0)
|
%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);
|
%{ temp = (TYPE *)(((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input) ? ((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input)->get() : 0);
|
||||||
|
|
@ -56,18 +82,42 @@
|
||||||
%typemap(out, fragment="SWIG_null_deleter") TYPE *CONST&
|
%typemap(out, fragment="SWIG_null_deleter") TYPE *CONST&
|
||||||
%{ $result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_$owner); %}
|
%{ $result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_$owner); %}
|
||||||
|
|
||||||
|
%typemap(directorin) TYPE *CONST&
|
||||||
|
%{ $input = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; %}
|
||||||
|
|
||||||
|
%typemap(directorout) TYPE *CONST& %{
|
||||||
|
#error "typemaps for $1_type not available"
|
||||||
|
%}
|
||||||
|
|
||||||
// shared_ptr by value
|
// shared_ptr by value
|
||||||
%typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >
|
%typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >
|
||||||
%{ if ($input) $1 = *($&1_ltype)$input; %}
|
%{ if ($input) $1 = *($&1_ltype)$input; %}
|
||||||
%typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >
|
%typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >
|
||||||
%{ $result = $1 ? new $1_ltype($1) : 0; %}
|
%{ $result = $1 ? new $1_ltype($1) : 0; %}
|
||||||
|
|
||||||
|
%typemap(directorin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >
|
||||||
|
%{ $input = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %}
|
||||||
|
|
||||||
|
%typemap(directorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >
|
||||||
|
%{ if ($input) {
|
||||||
|
SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input;
|
||||||
|
$result = *smartarg;
|
||||||
|
}
|
||||||
|
%}
|
||||||
|
|
||||||
// shared_ptr by reference
|
// shared_ptr by reference
|
||||||
%typemap(in, canthrow=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & ($*1_ltype tempnull)
|
%typemap(in, canthrow=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & ($*1_ltype tempnull)
|
||||||
%{ $1 = $input ? ($1_ltype)$input : &tempnull; %}
|
%{ $1 = $input ? ($1_ltype)$input : &tempnull; %}
|
||||||
%typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &
|
%typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &
|
||||||
%{ $result = *$1 ? new $*1_ltype(*$1) : 0; %}
|
%{ $result = *$1 ? new $*1_ltype(*$1) : 0; %}
|
||||||
|
|
||||||
|
%typemap(directorin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &
|
||||||
|
%{ $input = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %}
|
||||||
|
|
||||||
|
%typemap(directorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{
|
||||||
|
#error "typemaps for $1_type not available"
|
||||||
|
%}
|
||||||
|
|
||||||
// shared_ptr by pointer
|
// shared_ptr by pointer
|
||||||
%typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * ($*1_ltype tempnull)
|
%typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * ($*1_ltype tempnull)
|
||||||
%{ $1 = $input ? ($1_ltype)$input : &tempnull; %}
|
%{ $1 = $input ? ($1_ltype)$input : &tempnull; %}
|
||||||
|
|
@ -75,6 +125,13 @@
|
||||||
%{ $result = ($1 && *$1) ? new $*1_ltype(*($1_ltype)$1) : 0;
|
%{ $result = ($1 && *$1) ? new $*1_ltype(*($1_ltype)$1) : 0;
|
||||||
if ($owner) delete $1; %}
|
if ($owner) delete $1; %}
|
||||||
|
|
||||||
|
%typemap(directorin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *
|
||||||
|
%{ $input = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %}
|
||||||
|
|
||||||
|
%typemap(directorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{
|
||||||
|
#error "typemaps for $1_type not available"
|
||||||
|
%}
|
||||||
|
|
||||||
// shared_ptr by pointer reference
|
// 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)
|
%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;
|
%{ temp = $input ? *($1_ltype)&$input : &tempnull;
|
||||||
|
|
@ -82,6 +139,13 @@
|
||||||
%typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *&
|
%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; %}
|
%{ *($1_ltype)&$result = (*$1 && **$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(**$1) : 0; %}
|
||||||
|
|
||||||
|
%typemap(directorin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *&
|
||||||
|
%{ $input = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %}
|
||||||
|
|
||||||
|
%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
|
// various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug
|
||||||
%typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{
|
%typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{
|
||||||
#error "typemaps for $1_type not available"
|
#error "typemaps for $1_type not available"
|
||||||
|
|
@ -175,6 +239,18 @@
|
||||||
return ret;
|
return ret;
|
||||||
} %}
|
} %}
|
||||||
|
|
||||||
|
%typemap(csdirectorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > "$typemap(cstype, TYPE).getCPtr($cscall).Handle"
|
||||||
|
|
||||||
|
%typemap(csdirectorin) CONST TYPE,
|
||||||
|
CONST TYPE *,
|
||||||
|
CONST TYPE &,
|
||||||
|
TYPE *CONST& "($iminput == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)($iminput, true)"
|
||||||
|
|
||||||
|
%typemap(csdirectorin) 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 > *& "($iminput == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)($iminput, true)"
|
||||||
|
|
||||||
|
|
||||||
// Proxy classes (base classes, ie, not derived classes)
|
// Proxy classes (base classes, ie, not derived classes)
|
||||||
%typemap(csbody) TYPE %{
|
%typemap(csbody) TYPE %{
|
||||||
|
|
@ -247,4 +323,3 @@
|
||||||
|
|
||||||
%template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >;
|
%template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >;
|
||||||
%enddef
|
%enddef
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue