Add C# wchar_t * director typemaps

More Python std::wstring directors Python testing
This commit is contained in:
William S Fulton 2022-05-04 19:33:47 +01:00
parent 751d443046
commit bb39235c9c
5 changed files with 30 additions and 8 deletions

View File

@ -7,6 +7,9 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/
Version 4.1.0 (in progress) Version 4.1.0 (in progress)
=========================== ===========================
2022-05-04: wsfulton
[C#] Add C# wchar_t * director typemaps
2022-04-20: cminyard 2022-04-20: cminyard
Fix an issue where newlines were not properly generated Fix an issue where newlines were not properly generated
for godirectorin typemaps. If you have a virtual function for godirectorin typemaps. If you have a virtual function

View File

@ -17,11 +17,9 @@ public class runme
if (b.get_first() != "hello world!") if (b.get_first() != "hello world!")
throw new ApplicationException("Incorrect get_first:" + b.get_first()); throw new ApplicationException("Incorrect get_first:" + b.get_first());
/*
b.call_process_func(); b.call_process_func();
if (b.smem != "hello") if (b.smem != "hello")
throw new ApplicationException("Incorrect smem:" + b.smem); throw new ApplicationException("Incorrect smem:" + b.smem);
*/
b.call_process_wstring_func(); b.call_process_wstring_func();
if (b.smem != "hello (wstring)") if (b.smem != "hello (wstring)")

View File

@ -39,15 +39,11 @@ struct A
std::vector<std::wstring> m_strings; std::vector<std::wstring> m_strings;
virtual const wchar_t * wchar_out() { return L"ciao"; }
#if !defined(SWIGCSHARP)
virtual void process_text(const wchar_t *text) {} virtual void process_text(const wchar_t *text) {}
#else
// temp until wchar_t* fixed
virtual void process_text(std::wstring text) {}
virtual void process_wstring_text(std::wstring text) {} virtual void process_wstring_text(std::wstring text) {}
virtual void process_wstring_ref_text(const std::wstring& text) {} virtual void process_wstring_ref_text(const std::wstring& text) {}
#endif
virtual std::wstring multiple_params_val(const std::wstring& p1, const std::wstring& p2, std::wstring p3, std::wstring p4) const virtual std::wstring multiple_params_val(const std::wstring& p1, const std::wstring& p2, std::wstring p3, std::wstring p4) const
{ return get_first(); } { return get_first(); }

View File

@ -12,6 +12,12 @@ class B(A):
def process_text(self, s): def process_text(self, s):
self.smem = s self.smem = s
def process_wstring_text(self, s):
self.smem = s + " (wstring)"
def process_wstring_ref_text(self, s):
self.smem = s + " (wstring ref)"
b = B("hello") b = B("hello")
@ -24,3 +30,13 @@ b.call_process_func()
if b.smem != "hello": if b.smem != "hello":
raise RuntimeError("smem: {}".format(smem)) raise RuntimeError("smem: {}".format(smem))
b.call_process_wstring_func()
if b.smem != "hello (wstring)":
raise RuntimeError("smem: {}".format(smem))
b.call_process_wstring_ref_func()
if b.smem != "hello (wstring ref)":
raise RuntimeError("smem: {}".format(smem))

View File

@ -211,9 +211,13 @@ static void Swig_csharp_UTF16ToWCharPtrFree(wchar_t *str) {
%typemap(ctype, out="void *") wchar_t * "unsigned short *" %typemap(ctype, out="void *") wchar_t * "unsigned short *"
%typemap(imtype, %typemap(imtype,
inattributes="[global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPWStr)]", inattributes="[global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPWStr)]",
outattributes="[return: global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPWStr)]" outattributes="[return: global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPWStr)]",
directorinattributes="[global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPWStr)]",
directoroutattributes="[return: global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPWStr)]"
) wchar_t * "string" ) wchar_t * "string"
%typemap(cstype) wchar_t * "string" %typemap(cstype) wchar_t * "string"
%typemap(csdirectorin) wchar_t * "$iminput"
%typemap(csdirectorout) wchar_t * "$cscall"
%typemap(csin) wchar_t * "$csinput" %typemap(csin) wchar_t * "$csinput"
%typemap(csout, excode=SWIGEXCODE) wchar_t * { %typemap(csout, excode=SWIGEXCODE) wchar_t * {
@ -238,6 +242,11 @@ static void Swig_csharp_UTF16ToWCharPtrFree(wchar_t *str) {
%typemap(freearg, fragment="Swig_csharp_UTF16ToWCharPtrFree") wchar_t * %typemap(freearg, fragment="Swig_csharp_UTF16ToWCharPtrFree") wchar_t *
%{ Swig_csharp_UTF16ToWCharPtrFree($1); %} %{ Swig_csharp_UTF16ToWCharPtrFree($1); %}
%typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) wchar_t *
%{ $result = Swig_csharp_UTF16ToWCharPtr($input); %}
%typemap(directorin) wchar_t * %{ $input = SWIG_csharp_wstring_with_length_callback($1, (int)wcslen($1)); %}
%typemap(typecheck) wchar_t * = char *; %typemap(typecheck) wchar_t * = char *;
%typemap(throws, canthrow=1, fragment="<wchar.h>") wchar_t * %typemap(throws, canthrow=1, fragment="<wchar.h>") wchar_t *