1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
//
// octcomplex.swg - Octave complex number support
//
// 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 accessor
// methods. See the std_complex.i and ccomplex.i for concrete examples.
// 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
// Double-precision 'as' conversor
%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
// Single-precision 'as' conversor
%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)
|