diff --git a/Examples/test-suite/complextest.i b/Examples/test-suite/complextest.i index 64c751a82..6e82e8915 100644 --- a/Examples/test-suite/complextest.i +++ b/Examples/test-suite/complextest.i @@ -34,6 +34,11 @@ return b; } #endif + + struct ComplexPair + { + std::complex z1, z2; + }; } diff --git a/Examples/test-suite/csharp/complextest_runme.cs b/Examples/test-suite/csharp/complextest_runme.cs index 781909f25..2b7e4cc84 100644 --- a/Examples/test-suite/csharp/complextest_runme.cs +++ b/Examples/test-suite/csharp/complextest_runme.cs @@ -24,5 +24,11 @@ public class complextest_runme { if ( complextest.Copy_h(vec).Count != 2 ) throw new Exception("vector 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 test failed"); } } diff --git a/Examples/test-suite/python/complextest_runme.py b/Examples/test-suite/python/complextest_runme.py index 7dd7f5a3b..a55e6098b 100644 --- a/Examples/test-suite/python/complextest_runme.py +++ b/Examples/test-suite/python/complextest_runme.py @@ -15,3 +15,9 @@ try: complextest.Copy_h(v) except: 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" diff --git a/Lib/csharp/complex.i b/Lib/csharp/complex.i index 045b65d43..21c84adbb 100644 --- a/Lib/csharp/complex.i +++ b/Lib/csharp/complex.i @@ -23,20 +23,34 @@ public: } // namespace std %define swig_complex_typemaps(T) -%typemap(cstype) std::complex, const std::complex& "System.Numerics.Complex" +%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, const std::complex& "Complex_" #T ".getCPtr(cpp$csinput)" + ) 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