blob: a3e9ebf7740149896942e256f8995e9c6cee4d89 [file] [log] [blame]
Vince Harronb46a6ee2015-06-02 18:58:48 -07001/*
2 Defines the As/From conversors for double/float complex, you need to
3 provide complex Type, the Name you want to use in the conversors,
4 the complex Constructor method, and the Real and Imag complex
5 accesor methods.
6
7 See the std_complex.i and ccomplex.i for concrete examples.
8*/
9
10/* the common from conversor */
11%define %swig_fromcplx_conv(Type, OctConstructor, Real, Imag)
12 %fragment(SWIG_From_frag(Type),"header")
13{
14 SWIGINTERNINLINE octave_value
15 SWIG_From(Type)(const Type& c)
16 {
17 return octave_value(OctConstructor(Real(c), Imag(c)));
18 }
19}
20%enddef
21
22// the double case
23%define %swig_cplxdbl_conv(Type, Constructor, Real, Imag)
24 %fragment(SWIG_AsVal_frag(Type),"header",
25 fragment=SWIG_AsVal_frag(double))
26{
27 SWIGINTERN int
28 SWIG_AsVal(Type) (const octave_value& ov, Type* val)
29 {
30 if (ov.is_complex_scalar()) {
31 if (val) {
32 Complex c(ov.complex_value());
33 *val=Constructor(c.real(),c.imag());
34 }
35 return SWIG_OK;
36 } else {
37 double d;
38 int res = SWIG_AddCast(SWIG_AsVal(double)(ov, &d));
39 if (SWIG_IsOK(res)) {
40 if (val)
41 *val = Constructor(d, 0.0);
42 return res;
43 }
44 }
45 return SWIG_TypeError;
46 }
47}
48%swig_fromcplx_conv(Type, Complex, Real, Imag);
49%enddef
50
51// the float case
52%define %swig_cplxflt_conv(Type, Constructor, Real, Imag)
53 %fragment(SWIG_AsVal_frag(Type),"header",
54 fragment=SWIG_AsVal_frag(float)) {
55 SWIGINTERN int
56 SWIG_AsVal(Type) (const octave_value& ov, Type* val)
57 {
58 if (ov.is_complex_scalar()) {
59 if (val) {
60 Complex c(ov.complex_value());
61 double re = c.real();
62 double im = c.imag();
63 if ((-FLT_MAX <= re && re <= FLT_MAX) && (-FLT_MAX <= im && im <= FLT_MAX)) {
64 if (val)
65 *val = Constructor(%numeric_cast(re, float),
66 %numeric_cast(im, float));
67 return SWIG_OK;
68 } else
69 return SWIG_OverflowError;
70 }
71 } else {
72 float d;
73 int res = SWIG_AddCast(SWIG_AsVal(float)(ov, &d));
74 if (SWIG_IsOK(res)) {
75 if (val)
76 *val = Constructor(d, 0.0);
77 return res;
78 }
79 }
80 return SWIG_TypeError;
81 }
82}
83
84%swig_fromcplx_conv(Type, FloatComplex, Real, Imag);
85%enddef
86
87#define %swig_cplxflt_convn(Type, Constructor, Real, Imag) \
88%swig_cplxflt_conv(Type, Constructor, Real, Imag)
89
90
91#define %swig_cplxdbl_convn(Type, Constructor, Real, Imag) \
92%swig_cplxdbl_conv(Type, Constructor, Real, Imag)