Add std_complex.i for C# too
For consistency with the other modules (Python, Ruby and JS), allow including <std_complex.i> directly when using C# too instead of including <complex.i> which only works in C++ mode (i.e. when using std::complex) anyhow with C# for now.
This commit is contained in:
parent
ec565f74cf
commit
485efd511f
2 changed files with 57 additions and 56 deletions
|
|
@ -1,58 +1,5 @@
|
||||||
#ifndef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
%include <std_complex.i>
|
||||||
|
#else
|
||||||
#error C# module only supports complex in C++ mode.
|
#error C# module only supports complex in C++ mode.
|
||||||
#endif
|
#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>, 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>, 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());
|
|
||||||
}
|
|
||||||
|
|
||||||
%typemap(csvarin, excode=SWIGEXCODE2) std::complex<T>* %{
|
|
||||||
set {
|
|
||||||
var cppvalue = new Complex_##T((T)value.Real, (T)value.Imaginary);
|
|
||||||
$imcall;$excode
|
|
||||||
}
|
|
||||||
%}
|
|
||||||
|
|
||||||
%typemap(csvarout, excode=SWIGEXCODE2) std::complex<T>* %{
|
|
||||||
get {
|
|
||||||
var 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)
|
|
||||||
|
|
|
||||||
54
Lib/csharp/std_complex.i
Normal file
54
Lib/csharp/std_complex.i
Normal file
|
|
@ -0,0 +1,54 @@
|
||||||
|
%{
|
||||||
|
#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>, 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>, 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());
|
||||||
|
}
|
||||||
|
|
||||||
|
%typemap(csvarin, excode=SWIGEXCODE2) std::complex<T>* %{
|
||||||
|
set {
|
||||||
|
var cppvalue = new Complex_##T((T)value.Real, (T)value.Imaginary);
|
||||||
|
$imcall;$excode
|
||||||
|
}
|
||||||
|
%}
|
||||||
|
|
||||||
|
%typemap(csvarout, excode=SWIGEXCODE2) std::complex<T>* %{
|
||||||
|
get {
|
||||||
|
var 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