diff options
Diffstat (limited to 'share/swig/2.0.11/octave/octcomplex.swg')
-rw-r--r-- | share/swig/2.0.11/octave/octcomplex.swg | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/share/swig/2.0.11/octave/octcomplex.swg b/share/swig/2.0.11/octave/octcomplex.swg new file mode 100644 index 0000000..a3e9ebf --- /dev/null +++ b/share/swig/2.0.11/octave/octcomplex.swg @@ -0,0 +1,92 @@ +/* + Defines the As/From conversors for double/float complex, you need to + provide complex Type, the Name you want to use in the conversors, + the complex Constructor method, and the Real and Imag complex + accesor methods. + + See the std_complex.i and ccomplex.i for concrete examples. +*/ + +/* the common from conversor */ +%define %swig_fromcplx_conv(Type, OctConstructor, Real, Imag) + %fragment(SWIG_From_frag(Type),"header") +{ + SWIGINTERNINLINE octave_value + SWIG_From(Type)(const Type& c) + { + return octave_value(OctConstructor(Real(c), Imag(c))); + } +} +%enddef + +// the double case +%define %swig_cplxdbl_conv(Type, Constructor, Real, Imag) + %fragment(SWIG_AsVal_frag(Type),"header", + fragment=SWIG_AsVal_frag(double)) +{ + SWIGINTERN int + SWIG_AsVal(Type) (const octave_value& ov, Type* val) + { + if (ov.is_complex_scalar()) { + if (val) { + Complex c(ov.complex_value()); + *val=Constructor(c.real(),c.imag()); + } + return SWIG_OK; + } else { + double d; + int res = SWIG_AddCast(SWIG_AsVal(double)(ov, &d)); + if (SWIG_IsOK(res)) { + if (val) + *val = Constructor(d, 0.0); + return res; + } + } + return SWIG_TypeError; + } +} +%swig_fromcplx_conv(Type, Complex, Real, Imag); +%enddef + +// the float case +%define %swig_cplxflt_conv(Type, Constructor, Real, Imag) + %fragment(SWIG_AsVal_frag(Type),"header", + fragment=SWIG_AsVal_frag(float)) { + SWIGINTERN int + SWIG_AsVal(Type) (const octave_value& ov, Type* val) + { + if (ov.is_complex_scalar()) { + if (val) { + Complex c(ov.complex_value()); + double re = c.real(); + double im = c.imag(); + if ((-FLT_MAX <= re && re <= FLT_MAX) && (-FLT_MAX <= im && im <= FLT_MAX)) { + if (val) + *val = Constructor(%numeric_cast(re, float), + %numeric_cast(im, float)); + return SWIG_OK; + } else + return SWIG_OverflowError; + } + } else { + float d; + int res = SWIG_AddCast(SWIG_AsVal(float)(ov, &d)); + if (SWIG_IsOK(res)) { + if (val) + *val = Constructor(d, 0.0); + return res; + } + } + return SWIG_TypeError; + } +} + +%swig_fromcplx_conv(Type, FloatComplex, Real, Imag); +%enddef + +#define %swig_cplxflt_convn(Type, Constructor, Real, Imag) \ +%swig_cplxflt_conv(Type, Constructor, Real, Imag) + + +#define %swig_cplxdbl_convn(Type, Constructor, Real, Imag) \ +%swig_cplxdbl_conv(Type, Constructor, Real, Imag) |