| /* ----------------------------------------------------------------------------- |
| * std_complex.i |
| * |
| * Typemaps for handling std::complex<float> and std::complex<double> as a .NET |
| * System.Numerics.Complex type. Requires .NET 4 minimum. |
| * ----------------------------------------------------------------------------- */ |
| |
| %{ |
| #include <complex> |
| %} |
| |
| %fragment("SwigSystemNumericsComplex", "header") { |
| extern "C" { |
| // Identical to the layout of System.Numerics.Complex, but does assume that it is |
| // LayoutKind.Sequential on the managed side |
| struct SwigSystemNumericsComplex { |
| double real; |
| double imag; |
| }; |
| } |
| |
| SWIGINTERN SwigSystemNumericsComplex SwigCreateSystemNumericsComplex(double real, double imag) { |
| SwigSystemNumericsComplex cpx; |
| cpx.real = real; |
| cpx.imag = imag; |
| return cpx; |
| } |
| } |
| |
| namespace std { |
| |
| %naturalvar complex; |
| |
| template<typename T> |
| class complex |
| { |
| public: |
| complex(T re = T(), T im = T()); |
| }; |
| |
| } |
| |
| %define SWIG_COMPLEX_TYPEMAPS(T) |
| %typemap(ctype, fragment="SwigSystemNumericsComplex") std::complex<T>, const std::complex<T> & "SwigSystemNumericsComplex" |
| %typemap(imtype) std::complex<T>, const std::complex<T> & "System.Numerics.Complex" |
| %typemap(cstype) std::complex<T>, const std::complex<T> & "System.Numerics.Complex" |
| |
| %typemap(in) std::complex<T> |
| %{$1 = std::complex< double >($input.real, $input.imag);%} |
| |
| %typemap(in) const std::complex<T> &($*1_ltype temp) |
| %{temp = std::complex< T >((T)$input.real, (T)$input.imag); |
| $1 = &temp;%} |
| |
| %typemap(out, null="SwigCreateSystemNumericsComplex(0.0, 0.0)") std::complex<T> |
| %{$result = SwigCreateSystemNumericsComplex($1.real(), $1.imag());%} |
| |
| %typemap(out, null="SwigCreateSystemNumericsComplex(0.0, 0.0)") const std::complex<T> & |
| %{$result = SwigCreateSystemNumericsComplex($1->real(), $1->imag());%} |
| |
| %typemap(cstype) std::complex<T>, const std::complex<T> & "System.Numerics.Complex" |
| |
| %typemap(csin) std::complex<T>, const std::complex<T> & "$csinput" |
| |
| %typemap(csout, excode=SWIGEXCODE) std::complex<T>, const std::complex<T> & { |
| System.Numerics.Complex ret = $imcall;$excode |
| return ret; |
| } |
| |
| %typemap(csvarin, excode=SWIGEXCODE2) const std::complex<T> & %{ |
| set { |
| $imcall;$excode |
| } |
| %} |
| |
| %typemap(csvarout, excode=SWIGEXCODE2) const std::complex<T> & %{ |
| get { |
| System.Numerics.Complex ret = $imcall;$excode |
| return ret; |
| } |
| %} |
| |
| %template() std::complex<T>; |
| %enddef |
| |
| // By default, typemaps for both std::complex<double> and std::complex<float> |
| // are defined, but one of them can be disabled by predefining the |
| // corresponding symbol before including this file. |
| #ifndef SWIG_NO_STD_COMPLEX_DOUBLE |
| SWIG_COMPLEX_TYPEMAPS(double) |
| #endif |
| |
| #ifndef SWIG_NO_STD_COMPLEX_FLOAT |
| SWIG_COMPLEX_TYPEMAPS(float) |
| #endif |