1# Note: add integer versions of the functions?
2
3cdef extern from "<complex>" namespace "std" nogil:
4    cdef cppclass complex[T]:
5        complex() except +
6        complex(T, T) except +
7        complex(complex[T]&) except +
8        # How to make the converting constructor, i.e. convert complex[double]
9        # to complex[float]?
10
11        complex[T] operator+(complex[T]&)
12        complex[T] operator-(complex[T]&)
13        complex[T] operator+(complex[T]&, complex[T]&)
14        complex[T] operator+(complex[T]&, T&)
15        complex[T] operator+(T&, complex[T]&)
16        complex[T] operator-(complex[T]&, complex[T]&)
17        complex[T] operator-(complex[T]&, T&)
18        complex[T] operator-(T&, complex[T]&)
19        complex[T] operator*(complex[T]&, complex[T]&)
20        complex[T] operator*(complex[T]&, T&)
21        complex[T] operator*(T&, complex[T]&)
22        complex[T] operator/(complex[T]&, complex[T]&)
23        complex[T] operator/(complex[T]&, T&)
24        complex[T] operator/(T&, complex[T]&)
25
26        bint operator==(complex[T]&, complex[T]&)
27        bint operator==(complex[T]&, T&)
28        bint operator==(T&, complex[T]&)
29        bint operator!=(complex[T]&, complex[T]&)
30        bint operator!=(complex[T]&, T&)
31        bint operator!=(T&, complex[T]&)
32
33        # Access real part
34        T real()
35        void real(T)
36
37        # Access imaginary part
38        T imag()
39        void imag(T)
40
41    # Return real part
42    T real[T](complex[T]&)
43    long double real(long double)
44    double real(double)
45    float real(float)
46
47    # Return imaginary part
48    T imag[T](complex[T]&)
49    long double imag(long double)
50    double imag(double)
51    float imag(float)
52
53    T abs[T](complex[T]&)
54    T arg[T](complex[T]&)
55    long double arg(long double)
56    double arg(double)
57    float arg(float)
58
59    T norm[T](complex[T])
60    long double norm(long double)
61    double norm(double)
62    float norm(float)
63
64    complex[T] conj[T](complex[T]&)
65    complex[long double] conj(long double)
66    complex[double] conj(double)
67    complex[float] conj(float)
68
69    complex[T] proj[T](complex[T])
70    complex[long double] proj(long double)
71    complex[double] proj(double)
72    complex[float] proj(float)
73
74    complex[T] polar[T](T&, T&)
75    complex[T] ploar[T](T&)
76
77    complex[T] exp[T](complex[T]&)
78    complex[T] log[T](complex[T]&)
79    complex[T] log10[T](complex[T]&)
80
81    complex[T] pow[T](complex[T]&, complex[T]&)
82    complex[T] pow[T](complex[T]&, T&)
83    complex[T] pow[T](T&, complex[T]&)
84    # There are some promotion versions too
85
86    complex[T] sqrt[T](complex[T]&)
87
88    complex[T] sin[T](complex[T]&)
89    complex[T] cos[T](complex[T]&)
90    complex[T] tan[T](complex[T]&)
91    complex[T] asin[T](complex[T]&)
92    complex[T] acos[T](complex[T]&)
93    complex[T] atan[T](complex[T]&)
94
95    complex[T] sinh[T](complex[T]&)
96    complex[T] cosh[T](complex[T]&)
97    complex[T] tanh[T](complex[T]&)
98
99    complex[T] asinh[T](complex[T]&)
100    complex[T] acosh[T](complex[T]&)
101    complex[T] atanh[T](complex[T]&)
102