aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Examples/test-suite/csharp/Makefile.in5
-rw-r--r--Examples/test-suite/csharp/csharp_lib_arrays_bool_runme.cs78
-rw-r--r--Examples/test-suite/csharp_lib_arrays_bool.i78
-rw-r--r--Lib/csharp/arrays_csharp.i42
4 files changed, 202 insertions, 1 deletions
diff --git a/Examples/test-suite/csharp/Makefile.in b/Examples/test-suite/csharp/Makefile.in
index c9e48f804..49608e809 100644
--- a/Examples/test-suite/csharp/Makefile.in
+++ b/Examples/test-suite/csharp/Makefile.in
@@ -19,6 +19,7 @@ CPP_TEST_CASES = \
csharp_exceptions \
csharp_features \
csharp_lib_arrays \
+ csharp_lib_arrays_bool \
csharp_namespace_system_collision \
csharp_prepost \
csharp_typemaps \
@@ -36,6 +37,9 @@ CPP11_TEST_CASES = \
cpp11_shared_ptr_upcast \
cpp11_strongly_typed_enumerations_simple \
+# bool[] typemaps don't work correctly when running under mono
+FAILING_CPP_TESTS = csharp_lib_arrays_bool
+
include $(srcdir)/../common.mk
# Overridden variables here
@@ -48,6 +52,7 @@ CSHARPFLAGSSPECIAL =
intermediary_classname.cpptest: SWIGOPT += -dllimport intermediary_classname
complextest.cpptest: CSHARPFLAGSSPECIAL = -r:System.Numerics.dll
csharp_lib_arrays.cpptest: CSHARPFLAGSSPECIAL = -unsafe
+csharp_lib_arrays_bool.cpptest: CSHARPFLAGSSPECIAL = -unsafe
csharp_swig2_compatibility.cpptest: SWIGOPT += -DSWIG2_CSHARP
# Rules for the different types of tests
diff --git a/Examples/test-suite/csharp/csharp_lib_arrays_bool_runme.cs b/Examples/test-suite/csharp/csharp_lib_arrays_bool_runme.cs
new file mode 100644
index 000000000..25b7fe699
--- /dev/null
+++ b/Examples/test-suite/csharp/csharp_lib_arrays_bool_runme.cs
@@ -0,0 +1,78 @@
+using System;
+using csharp_lib_arrays_boolNamespace;
+
+public class runme
+{
+ static void Main()
+ {
+ {
+ bool[] source = { true, false, false, true, false, true, true, false };
+ bool[] target = new bool[ source.Length ];
+
+ csharp_lib_arrays_bool.myArrayCopyUsingFixedArraysBool( source, target, target.Length );
+ CompareArrays(source, target, "bool[] INPUT/OUTPUT Fixed");
+ }
+
+ {
+ bool[] source = { true, false, false, true, false, true, true, false };
+ bool[] target = { false, true, true, false, true, false, false, true };
+
+ csharp_lib_arrays_bool.myArraySwapUsingFixedArraysBool( source, target, target.Length );
+
+ for (int i=0; i<target.Length; ++i)
+ target[i] = !target[i];
+
+ CompareArrays(source, target, "bool[] INOUT");
+ }
+
+ {
+ bool[] source = { true, false, false, true, false, true, true, false };
+ bool[] target = new bool[ source.Length ];
+
+ if( !csharp_lib_arrays_bool.checkBoolArrayCorrect( source, source.Length ) )
+ {
+ throw new Exception("bool[] INPUT incorrect");
+ }
+
+ csharp_lib_arrays_bool.myArrayCopyBool( source, target, target.Length );
+ CompareArrays(source, target, "bool[] INPUT/OUTPUT");
+ }
+
+ {
+ bool[] source = { true, false, false, true, false, true, true, false };
+ bool[] target = { false, true, true, false, true, false, false, true };
+
+ csharp_lib_arrays_bool.myArraySwapBool( source, target, target.Length );
+
+ for (int i=0; i<target.Length; ++i)
+ target[i] = !target[i];
+
+ CompareArrays(source, target, "bool[] INOUT");
+ }
+ }
+
+ static void CompareArrays<T>( T[] a, T[] b, string testName )
+ {
+ if (a.Length != b.Length)
+ throw new Exception("size mismatch");
+
+ for(int i=0; i<a.Length; ++i) {
+ if (a[i].Equals(b[i]) == false) {
+ Console.Error.WriteLine("C# Array mismatch: " + testName);
+ Console.Error.WriteLine("a:");
+ PrintArray(a);
+ Console.Error.WriteLine("b:");
+ PrintArray(b);
+ throw new Exception("element mismatch");
+ }
+ }
+ }
+
+ static void PrintArray<T>( T[] a )
+ {
+ foreach ( T i in a )
+ Console.Error.Write( "{0} ", i );
+ Console.Error.WriteLine();
+ }
+}
+
diff --git a/Examples/test-suite/csharp_lib_arrays_bool.i b/Examples/test-suite/csharp_lib_arrays_bool.i
new file mode 100644
index 000000000..58cee9d80
--- /dev/null
+++ b/Examples/test-suite/csharp_lib_arrays_bool.i
@@ -0,0 +1,78 @@
+%module csharp_lib_arrays_bool
+
+%include "arrays_csharp.i"
+
+%apply bool INPUT[] { bool* sourceArray }
+%apply bool OUTPUT[] { bool* targetArray }
+
+%apply bool INOUT[] { bool* array1 }
+%apply bool INOUT[] { bool* array2 }
+
+%inline %{
+#include <iostream>
+
+/* copy the contents of the first array to the second */
+void myArrayCopyBool( bool* sourceArray, bool* targetArray, int nitems ) {
+ int i;
+ for ( i = 0; i < nitems; i++ ) {
+ targetArray[ i ] = sourceArray[ i ];
+ }
+}
+
+/* swap the contents of the two arrays */
+void myArraySwapBool( bool* array1, bool* array2, int nitems ) {
+ int i;
+ bool temp;
+ for ( i = 0; i < nitems; i++ ) {
+ temp = array1[ i ];
+ array1[ i ] = array2[ i ];
+ array2[ i ] = temp;
+ }
+}
+
+bool checkBoolArrayCorrect( bool* sourceArray, int sourceArraySize ) {
+ if( sourceArraySize != 8 ) {
+ std::cout << "checkBoolArrayCorrect: Expected array with 8 elements" << std::endl;
+ return false;
+ }
+ return sourceArray[0] == true &&
+ sourceArray[1] == false &&
+ sourceArray[2] == false &&
+ sourceArray[3] == true &&
+ sourceArray[4] == false &&
+ sourceArray[5] == true &&
+ sourceArray[6] == true &&
+ sourceArray[7] == false;
+}
+%}
+
+%clear bool* sourceArray;
+%clear bool* targetArray;
+
+%clear bool* array1;
+%clear bool* array2;
+
+// Below replicates the above array handling but this time using the pinned (fixed) array typemaps
+%csmethodmodifiers myArrayCopyUsingFixedArraysBool "public unsafe";
+%csmethodmodifiers myArraySwapUsingFixedArraysBool "public unsafe";
+
+%apply bool FIXED[] { bool* sourceArray }
+%apply bool FIXED[] { bool* targetArray }
+
+%inline %{
+void myArrayCopyUsingFixedArraysBool( bool *sourceArray, bool* targetArray, int nitems ) {
+ myArrayCopyBool(sourceArray, targetArray, nitems);
+}
+%}
+
+%apply bool FIXED[] { bool* array1 }
+%apply bool FIXED[] { bool* array2 }
+
+%inline %{
+void myArraySwapUsingFixedArraysBool( bool* array1, bool* array2, int nitems ) {
+ myArraySwapBool(array1, array2, nitems);
+}
+%}
+
+
+
diff --git a/Lib/csharp/arrays_csharp.i b/Lib/csharp/arrays_csharp.i
index 237067a88..861da8386 100644
--- a/Lib/csharp/arrays_csharp.i
+++ b/Lib/csharp/arrays_csharp.i
@@ -103,7 +103,47 @@ CSHARP_ARRAYS(long long, long)
CSHARP_ARRAYS(unsigned long long, ulong)
CSHARP_ARRAYS(float, float)
CSHARP_ARRAYS(double, double)
-CSHARP_ARRAYS(bool, bool)
+
+// By default C# will marshal bools as 4 bytes
+// UnmanagedType.I1 will change this to 1 byte
+// FIXME - When running on mono ArraySubType appears to be ignored and bools will be marshalled as 4-byte
+// https://github.com/mono/mono/issues/15592
+
+// input only arrays
+%typemap(ctype) bool INPUT[] "bool*"
+%typemap(cstype) bool INPUT[] "bool[]"
+%typemap(imtype, inattributes="[global::System.Runtime.InteropServices.In, global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPArray,ArraySubType=System.Runtime.InteropServices.UnmanagedType.I1)]") bool INPUT[] "bool[]"
+%typemap(csin) bool INPUT[] "$csinput"
+
+%typemap(in) bool INPUT[] %{
+$1 = $input;
+%}
+%typemap(freearg) bool INPUT[] ""
+%typemap(argout) bool INPUT[] ""
+
+// output only arrays
+%typemap(ctype) bool OUTPUT[] "bool*"
+%typemap(cstype) bool OUTPUT[] "bool[]"
+%typemap(imtype, inattributes="[global::System.Runtime.InteropServices.Out, global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPArray,ArraySubType=System.Runtime.InteropServices.UnmanagedType.I1)]") bool OUTPUT[] "bool[]"
+%typemap(csin) bool OUTPUT[] "$csinput"
+
+%typemap(in) bool OUTPUT[] %{
+$1 = $input;
+%}
+%typemap(freearg) bool OUTPUT[] ""
+%typemap(argout) bool OUTPUT[] ""
+
+// inout arrays
+%typemap(ctype) bool INOUT[] "bool*"
+%typemap(cstype) bool INOUT[] "bool[]"
+%typemap(imtype, inattributes="[global::System.Runtime.InteropServices.In, global::System.Runtime.InteropServices.Out, global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPArray,ArraySubType=System.Runtime.InteropServices.UnmanagedType.I1)]") bool INOUT[] "bool[]"
+%typemap(csin) bool INOUT[] "$csinput"
+
+%typemap(in) bool INOUT[] %{
+$1 = $input;
+%}
+%typemap(freearg) bool INOUT[] ""
+%typemap(argout) bool INOUT[] ""
%define CSHARP_ARRAYS_FIXED( CTYPE, CSTYPE )