Add support for std::complex<> to C#
Create Lib/csharp/complex.i with simplest possible typemaps mapping std::complex<> to System.Numerics.Complex.
This commit is contained in:
parent
07d81cc1e9
commit
aa047c43f7
4 changed files with 77 additions and 0 deletions
|
|
@ -15,6 +15,9 @@ Version 3.0.13 (in progress)
|
||||||
[Ruby] Fix #939 - Wrapping std::vector<bool> fix due to incorrect null checks
|
[Ruby] Fix #939 - Wrapping std::vector<bool> fix due to incorrect null checks
|
||||||
on VALUE obj.
|
on VALUE obj.
|
||||||
|
|
||||||
|
2017-03-17: vadz
|
||||||
|
[C#] Add support for std::complex<T>
|
||||||
|
|
||||||
2017-03-17: wsfulton
|
2017-03-17: wsfulton
|
||||||
[Go] Fix handling of typedef'd function pointers and typedef'd member function pointers
|
[Go] Fix handling of typedef'd function pointers and typedef'd member function pointers
|
||||||
such as:
|
such as:
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ top_srcdir = ../@top_srcdir@
|
||||||
top_builddir = ../@top_builddir@
|
top_builddir = ../@top_builddir@
|
||||||
|
|
||||||
CPP_TEST_CASES = \
|
CPP_TEST_CASES = \
|
||||||
|
complextest \
|
||||||
csharp_attributes \
|
csharp_attributes \
|
||||||
csharp_swig2_compatibility \
|
csharp_swig2_compatibility \
|
||||||
csharp_exceptions \
|
csharp_exceptions \
|
||||||
|
|
@ -40,6 +41,7 @@ CSHARPFLAGSSPECIAL =
|
||||||
|
|
||||||
# Custom tests - tests with additional commandline options
|
# Custom tests - tests with additional commandline options
|
||||||
intermediary_classname.cpptest: SWIGOPT += -dllimport intermediary_classname
|
intermediary_classname.cpptest: SWIGOPT += -dllimport intermediary_classname
|
||||||
|
complextest.cpptest: CSHARPFLAGSSPECIAL = -r:System.Numerics.dll
|
||||||
csharp_lib_arrays.cpptest: CSHARPFLAGSSPECIAL = -unsafe
|
csharp_lib_arrays.cpptest: CSHARPFLAGSSPECIAL = -unsafe
|
||||||
csharp_swig2_compatibility.cpptest: SWIGOPT += -DSWIG2_CSHARP
|
csharp_swig2_compatibility.cpptest: SWIGOPT += -DSWIG2_CSHARP
|
||||||
|
|
||||||
|
|
|
||||||
28
Examples/test-suite/csharp/complextest_runme.cs
Normal file
28
Examples/test-suite/csharp/complextest_runme.cs
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
// This is the complex runtime testcase. It checks that the C++ std::complex type works.
|
||||||
|
// It requires .NET 4.0 as the previous versions didn't have System.Numerics.Complex type.
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Numerics;
|
||||||
|
|
||||||
|
using complextestNamespace;
|
||||||
|
|
||||||
|
public class complextest_runme {
|
||||||
|
|
||||||
|
public static void Main() {
|
||||||
|
var a = new Complex(-1, 2);
|
||||||
|
if ( complextest.Conj(a) != Complex.Conjugate(a) )
|
||||||
|
throw new Exception("std::complex<double> test failed");
|
||||||
|
|
||||||
|
if ( complextest.Conjf(a) != Complex.Conjugate(a) )
|
||||||
|
throw new Exception("std::complex<float> test failed");
|
||||||
|
|
||||||
|
var vec = new VectorStdCplx();
|
||||||
|
vec.Add(new Complex(1, 2));
|
||||||
|
vec.Add(new Complex(2, 3));
|
||||||
|
vec.Add(new Complex(4, 3));
|
||||||
|
vec.Add(new Complex(1, 0));
|
||||||
|
|
||||||
|
if ( complextest.Copy_h(vec).Count != 2 )
|
||||||
|
throw new Exception("vector<complex> test failed");
|
||||||
|
}
|
||||||
|
}
|
||||||
44
Lib/csharp/complex.i
Normal file
44
Lib/csharp/complex.i
Normal file
|
|
@ -0,0 +1,44 @@
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#error C# module only supports complex in C++ mode.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
%{
|
||||||
|
#include <complex>
|
||||||
|
%}
|
||||||
|
|
||||||
|
namespace std {
|
||||||
|
|
||||||
|
// An extremely simplified subset of std::complex<> which contains just the
|
||||||
|
// methods we need.
|
||||||
|
template<typename T>
|
||||||
|
class complex
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
complex(T re, T im);
|
||||||
|
|
||||||
|
T real() const;
|
||||||
|
T imag() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace std
|
||||||
|
|
||||||
|
%define swig_complex_typemaps(T)
|
||||||
|
%typemap(cstype) std::complex<T>, const std::complex<T>& "System.Numerics.Complex"
|
||||||
|
|
||||||
|
// The casts in "pre" are needed in order to allow creating std::complex<float>
|
||||||
|
// from System.Numerics.Complex, which always uses doubles. It relies on the
|
||||||
|
// fact that the name of the C++ and C# float/double types are the same.
|
||||||
|
%typemap(csin,
|
||||||
|
pre=" var cpp$csinput = new Complex_" #T "((" #T ")$csinput.Real, (" #T ")$csinput.Imaginary);"
|
||||||
|
) std::complex<T>, const std::complex<T>& "Complex_" #T ".getCPtr(cpp$csinput)"
|
||||||
|
|
||||||
|
%typemap(csout, excode=SWIGEXCODE) std::complex<T>, const std::complex<T>& {
|
||||||
|
Complex_##T cppret = new Complex_##T($imcall, $owner);$excode
|
||||||
|
return new System.Numerics.Complex(cppret.real(), cppret.imag());
|
||||||
|
}
|
||||||
|
|
||||||
|
%template(Complex_##T) std::complex<T>;
|
||||||
|
%enddef
|
||||||
|
|
||||||
|
swig_complex_typemaps(double)
|
||||||
|
swig_complex_typemaps(float)
|
||||||
Loading…
Add table
Add a link
Reference in a new issue