1/*
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 concret examples.
8*/
9
10/* the common from conversor */
11%define %swig_fromcplx_conv(Type, Real, Imag)
12     %fragment(SWIG_From_frag(Type),"header")
13{
14  SWIGINTERNINLINE octave_value
15    SWIG_From(Type)(%ifcplusplus(const Type&, Type) c)
16    {
17      return octave_value(Complex(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, 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)(PyObject *o, 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, 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)
93
94
95
96