Extend C# complex support to member variables of this type
Define csvar{in,out} typemaps needed to support properties of complex type and
apply the existing cstype and csin ones to them as well.
Add unit test verifying that this works as expected in C# and, also, in
Python, even though no changes were needed there.
This commit is contained in:
parent
aa047c43f7
commit
ec565f74cf
4 changed files with 33 additions and 2 deletions
|
|
@ -34,6 +34,11 @@
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
struct ComplexPair
|
||||||
|
{
|
||||||
|
std::complex<double> z1, z2;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,5 +24,11 @@ public class complextest_runme {
|
||||||
|
|
||||||
if ( complextest.Copy_h(vec).Count != 2 )
|
if ( complextest.Copy_h(vec).Count != 2 )
|
||||||
throw new Exception("vector<complex> test failed");
|
throw new Exception("vector<complex> test failed");
|
||||||
|
|
||||||
|
var p = new ComplexPair();
|
||||||
|
p.z1 = new Complex(0, 1);
|
||||||
|
p.z2 = new Complex(0, -1);
|
||||||
|
if ( Complex.Conjugate(p.z2) != p.z1 )
|
||||||
|
throw new Exception("vector<complex> test failed");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,3 +15,9 @@ try:
|
||||||
complextest.Copy_h(v)
|
complextest.Copy_h(v)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
p = complextest.ComplexPair()
|
||||||
|
p.z1 = complex(0, 1)
|
||||||
|
p.z2 = complex(0, -1)
|
||||||
|
if complextest.Conj(p.z2) != p.z1:
|
||||||
|
raise RuntimeError, "bad complex mapping"
|
||||||
|
|
|
||||||
|
|
@ -23,20 +23,34 @@ public:
|
||||||
} // namespace std
|
} // namespace std
|
||||||
|
|
||||||
%define swig_complex_typemaps(T)
|
%define swig_complex_typemaps(T)
|
||||||
%typemap(cstype) std::complex<T>, const std::complex<T>& "System.Numerics.Complex"
|
%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>
|
// 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
|
// 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.
|
// fact that the name of the C++ and C# float/double types are the same.
|
||||||
%typemap(csin,
|
%typemap(csin,
|
||||||
pre=" var cpp$csinput = new Complex_" #T "((" #T ")$csinput.Real, (" #T ")$csinput.Imaginary);"
|
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)"
|
) 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>& {
|
%typemap(csout, excode=SWIGEXCODE) std::complex<T>, const std::complex<T>& {
|
||||||
Complex_##T cppret = new Complex_##T($imcall, $owner);$excode
|
Complex_##T cppret = new Complex_##T($imcall, $owner);$excode
|
||||||
return new System.Numerics.Complex(cppret.real(), cppret.imag());
|
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>;
|
%template(Complex_##T) std::complex<T>;
|
||||||
%enddef
|
%enddef
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue