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
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