summaryrefslogtreecommitdiff
path: root/Lib/octave/octcomplex.swg
blob: 320dba127f8fe71cff45be2f45971c21cc3c16de (plain)
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)