diff --git a/Lib/csharp/complex.i b/Lib/csharp/complex.i index 21c84adbb..4a6f91cdf 100644 --- a/Lib/csharp/complex.i +++ b/Lib/csharp/complex.i @@ -1,58 +1,5 @@ -#ifndef __cplusplus +#ifdef __cplusplus +%include +#else #error C# module only supports complex in C++ mode. #endif - -%{ -#include -%} - -namespace std { - -// An extremely simplified subset of std::complex<> which contains just the -// methods we need. -template -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, std::complex*, const std::complex& "System.Numerics.Complex" - -// The casts in "pre" are needed in order to allow creating std::complex -// 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, std::complex*, const std::complex& "Complex_" #T ".getCPtr(cpp$csinput)" - -%typemap(csout, excode=SWIGEXCODE) std::complex, const std::complex& { - Complex_##T cppret = new Complex_##T($imcall, $owner);$excode - return new System.Numerics.Complex(cppret.real(), cppret.imag()); - } - -%typemap(csvarin, excode=SWIGEXCODE2) std::complex* %{ - set { - var cppvalue = new Complex_##T((T)value.Real, (T)value.Imaginary); - $imcall;$excode - } - %} - -%typemap(csvarout, excode=SWIGEXCODE2) std::complex* %{ - get { - var cppret = new Complex_##T($imcall, $owner);$excode - return new System.Numerics.Complex(cppret.real(), cppret.imag()); - } - %} - -%template(Complex_##T) std::complex; -%enddef - -swig_complex_typemaps(double) -swig_complex_typemaps(float) diff --git a/Lib/csharp/std_complex.i b/Lib/csharp/std_complex.i new file mode 100644 index 000000000..d7cf7e6d3 --- /dev/null +++ b/Lib/csharp/std_complex.i @@ -0,0 +1,54 @@ +%{ +#include +%} + +namespace std { + +// An extremely simplified subset of std::complex<> which contains just the +// methods we need. +template +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, std::complex*, const std::complex& "System.Numerics.Complex" + +// The casts in "pre" are needed in order to allow creating std::complex +// 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, std::complex*, const std::complex& "Complex_" #T ".getCPtr(cpp$csinput)" + +%typemap(csout, excode=SWIGEXCODE) std::complex, const std::complex& { + Complex_##T cppret = new Complex_##T($imcall, $owner);$excode + return new System.Numerics.Complex(cppret.real(), cppret.imag()); + } + +%typemap(csvarin, excode=SWIGEXCODE2) std::complex* %{ + set { + var cppvalue = new Complex_##T((T)value.Real, (T)value.Imaginary); + $imcall;$excode + } + %} + +%typemap(csvarout, excode=SWIGEXCODE2) std::complex* %{ + get { + var cppret = new Complex_##T($imcall, $owner);$excode + return new System.Numerics.Complex(cppret.real(), cppret.imag()); + } + %} + +%template(Complex_##T) std::complex; +%enddef + +swig_complex_typemaps(double) +swig_complex_typemaps(float)