import source from 1.3.40
[external/swig.git] / Lib / ocaml / std_complex.i
1 // -*- C++ -*- 
2 #ifndef SWIG_STD_COMPLEX_I_
3 #define SWIG_STD_COMPLEX_I_
4
5 #ifdef SWIG
6
7 %{
8 #include <complex>
9 %} 
10
11 namespace std 
12 {
13   template <class T> class complex;  
14   
15   %define specialize_std_complex(T)
16   
17   %typemap(in) complex<T> {
18     if (PyComplex_Check($input)) {
19       $1 = std::complex<T>(PyComplex_RealAsDouble($input),
20                            PyComplex_ImagAsDouble($input));
21     } else if (PyFloat_Check($input)) {
22       $1 = std::complex<T>(PyFloat_AsDouble($input), 0);
23     } else if (PyInt_Check($input)) {
24       $1 = std::complex<T>(PyInt_AsLong($input), 0);
25     }
26     else {
27       PyErr_SetString(PyExc_TypeError,"Expected a complex");
28       SWIG_fail;
29     }
30   }  
31   
32   %typemap(in) const complex<T>& (std::complex<T> temp) {
33     if (PyComplex_Check($input)) {
34       temp = std::complex<T>(PyComplex_RealAsDouble($input),
35                              PyComplex_ImagAsDouble($input));
36       $1 = &temp;
37     } else if (PyFloat_Check($input)) {
38       temp = std::complex<T>(PyFloat_AsDouble($input), 0);
39       $1 = &temp;
40     } else if (PyInt_Check($input)) {
41       temp = std::complex<T>(PyInt_AsLong($input), 0);
42       $1 = &temp;
43     } else {    
44       PyErr_SetString(PyExc_TypeError,"Expected a complex");
45       SWIG_fail;
46     }
47   }
48   
49   %typemap(out) complex<T> {
50     $result = PyComplex_FromDoubles($1.real(), $1.imag());
51   }
52   
53   %typemap(out) const complex<T> & {
54     $result = PyComplex_FromDoubles($1->real(), $1->imag());
55   }
56
57   %enddef  
58      
59   specialize_std_complex(double);
60   specialize_std_complex(float);
61 }
62   
63 #endif // SWIG
64
65 #endif //SWIG_STD_COMPLEX_I_