/elec/propeller-clock

To get this branch, use:
bzr branch http://bzr.ed.am/elec/propeller-clock

« back to all changes in this revision

Viewing changes to src/utility/complex

  • Committer: Dan
  • Date: 2011-11-02 22:15:18 UTC
  • Revision ID: dan@waxworlds.org-20111102221518-b5j2m5l2pd71f4t1
Added Test whilst testing

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*      Copyright (C) 2004 Garrett A. Kajmowicz
2
 
 
3
 
        This file is part of the uClibc++ Library.
4
 
 
5
 
        This library is free software; you can redistribute it and/or
6
 
        modify it under the terms of the GNU Lesser General Public
7
 
        License as published by the Free Software Foundation; either
8
 
        version 2.1 of the License, or (at your option) any later version.
9
 
 
10
 
        This library is distributed in the hope that it will be useful,
11
 
        but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13
 
        Lesser General Public License for more details.
14
 
 
15
 
        You should have received a copy of the GNU Lesser General Public
16
 
        License along with this library; if not, write to the Free Software
17
 
        Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18
 
*/
19
 
 
20
 
#include <istream>
21
 
#include <ostream>
22
 
 
23
 
#ifndef __STD_HEADER_COMPLEX
24
 
#define __STD_HEADER_COMPLEX 1
25
 
 
26
 
 
27
 
namespace std {
28
 
//      class complex<float>;
29
 
//      class complex<double>;
30
 
//      class complex<long double>;
31
 
 
32
 
        template<class T> class _UCXXEXPORT complex{
33
 
        public:
34
 
                typedef T value_type;
35
 
 
36
 
                complex(const T& re = T(), const T& im = T()) : r(re), i(im) {  }
37
 
                complex(const complex& c): r(c.r), i(c.i){  }
38
 
                template<class X> complex(const complex<X>& c): r(c.r), i(c.i){  }
39
 
 
40
 
                inline T real() const{
41
 
                        return r;
42
 
                }
43
 
                inline T imag() const{
44
 
                        return i;
45
 
                }
46
 
 
47
 
                complex<T>& operator= (const T& v){
48
 
                        r = v;
49
 
                        i = 0;
50
 
                        return *this;
51
 
                }
52
 
                complex<T>& operator+=(const T& v){
53
 
                        r +=v;
54
 
                        return *this;
55
 
                }
56
 
                complex<T>& operator-=(const T& v){
57
 
                        r -=v;
58
 
                        return *this;
59
 
                }
60
 
                complex<T>& operator*=(const T& v){
61
 
                        r*=v;
62
 
                        i*=v;
63
 
                        return *this;
64
 
                }
65
 
                complex<T>& operator/=(const T& v){
66
 
                        r/=v;
67
 
                        i/=v;
68
 
                        return *this;
69
 
                }
70
 
                complex& operator=(const complex& v){
71
 
                        if(&v != this){
72
 
                                r = v.r;
73
 
                                i = v.i;
74
 
                        }
75
 
                        return *this;
76
 
                }
77
 
                template<class X> complex<T>& operator= (const complex<X>& v){
78
 
                        r = v.r;
79
 
                        i = v.i;
80
 
                        return *this;
81
 
                }
82
 
                template<class X> complex<T>& operator+=(const complex<X>& v){
83
 
                        r+=v.r;
84
 
                        i+=v.i;
85
 
                        return *this;
86
 
                }
87
 
                template<class X> complex<T>& operator-=(const complex<X>& v){
88
 
                        r-=v.r;
89
 
                        i-=v.i;
90
 
                        return *this;
91
 
                }
92
 
                template<class X> complex<T>& operator*=(const complex<X>& v){
93
 
                        T tempr = r*v.r - i*v.i;
94
 
                        T tempi = r*v.i + i*v.r;
95
 
                        r = tempr;
96
 
                        i = tempi;
97
 
                        return *this;
98
 
                }
99
 
                template<class X> complex<T>& operator/=(const complex<X>& v){
100
 
                        T tempr = (r*v.r + i*v.i) / (v.r*v.r + v.i*v.i);
101
 
                        T tempi = (i*v.r - r*v.i) / (v.r*v.r + v.i*v.i);
102
 
                        r = tempr;
103
 
                        i = tempi;
104
 
                        return *this;
105
 
                }
106
 
        private:
107
 
                T r;
108
 
                T i;
109
 
        };
110
 
 
111
 
        template<class T> _UCXXEXPORT complex<T> operator+(const complex<T>& ls, const complex<T>& rs){
112
 
                complex<T> retval(ls);
113
 
                retval += rs;
114
 
                return retval;
115
 
        }
116
 
        template<class T> _UCXXEXPORT complex<T> operator+(const complex<T>& ls, const T& rs){
117
 
                complex<T> retval(ls);
118
 
                ls += rs;
119
 
                return retval;
120
 
        }
121
 
        template<class T> _UCXXEXPORT inline complex<T> operator+(const T& ls, const complex<T>& rs){
122
 
                return rs + ls;
123
 
        }
124
 
        template<class T> _UCXXEXPORT complex<T> operator-(const complex<T>& ls, const complex<T>& rs){
125
 
                complex<T> retval(ls);
126
 
                retval -= rs;
127
 
                return retval;
128
 
        }
129
 
        template<class T> _UCXXEXPORT complex<T> operator-(const complex<T>& ls, const T& rs){
130
 
                complex<T> retval(ls);
131
 
                retval -= rs;
132
 
                return retval;
133
 
        }
134
 
        template<class T> _UCXXEXPORT complex<T> operator-(const T& ls, const complex<T>& rs){
135
 
                complex<T> retval(ls);
136
 
                retval -= rs;
137
 
                return retval;
138
 
        }
139
 
        template<class T> _UCXXEXPORT complex<T> operator*(const complex<T>& ls, const complex<T>& rs){
140
 
                complex<T> retval(ls);
141
 
                retval *= rs;
142
 
                return retval;
143
 
        }
144
 
        template<class T> _UCXXEXPORT complex<T> operator*(const complex<T>& ls, const T& rs){
145
 
                complex<T> retval(ls);
146
 
                retval *= rs;
147
 
                return retval;
148
 
        }
149
 
        template<class T> _UCXXEXPORT complex<T> operator*(const T& ls, const complex<T>& rs){
150
 
                complex<T> retval(ls);
151
 
                retval *=rs;
152
 
                return retval;
153
 
        }
154
 
        template<class T> _UCXXEXPORT complex<T> operator/(const complex<T>& ls, const complex<T>& rs){
155
 
                complex<T> retval(ls);
156
 
                retval/=rs;
157
 
                return retval;
158
 
        }
159
 
        template<class T> _UCXXEXPORT complex<T> operator/(const complex<T>& ls, const T& rs){
160
 
                complex<T> retval(ls);
161
 
                retval/=rs;
162
 
                return retval;
163
 
        }
164
 
        template<class T> _UCXXEXPORT complex<T> operator/(const T& ls, const complex<T>& rs){
165
 
                complex<T> retval(ls);
166
 
                retval/=rs;
167
 
                return retval;
168
 
        }
169
 
        template<class T> _UCXXEXPORT complex<T> operator+(const complex<T>& v){
170
 
                return v;
171
 
        }
172
 
        template<class T> _UCXXEXPORT complex<T> operator-(const complex<T>& v){
173
 
                return complex<T> (-v.real(), -v.imag());
174
 
        }
175
 
        template<class T> _UCXXEXPORT bool operator==(const complex<T>& ls, const complex<T>& rs){
176
 
                if( ls.real() == rs.real() && ls.imag() == rs.image()){
177
 
                        return true;
178
 
                }
179
 
                return false;
180
 
        }
181
 
        template<class T> _UCXXEXPORT bool operator==(const complex<T>& ls, const T& rs){
182
 
                if(ls.real() == rs && ls.imag() == T()){
183
 
                        return true;
184
 
                }
185
 
                return false;
186
 
        }
187
 
        template<class T> _UCXXEXPORT bool operator==(const T& ls, const complex<T>& rs){
188
 
                if(ls == rs.real() && rs.imag() == T()){
189
 
                        return true;
190
 
                }
191
 
                return false;
192
 
        }
193
 
        template<class T> _UCXXEXPORT bool operator!=(const complex<T>& ls, const complex<T>& rs){
194
 
                if(ls == rs){
195
 
                        return false;
196
 
                }
197
 
                return true;
198
 
        }
199
 
        template<class T> _UCXXEXPORT bool operator!=(const complex<T>& ls, const T& rs){
200
 
                if(ls == rs){
201
 
                        return false;
202
 
                }
203
 
                return true;
204
 
        }
205
 
        template<class T> _UCXXEXPORT bool operator!=(const T& ls, const complex<T>& rs){
206
 
                if(ls == rs){
207
 
                        return false;
208
 
                }
209
 
                return true;
210
 
        }
211
 
        template<class T, class charT, class traits> _UCXXEXPORT basic_istream<charT, traits>&
212
 
                 operator>>(basic_istream<charT, traits>& is, complex<T>& v)
213
 
        {
214
 
                T tempr;
215
 
                T tempi;
216
 
                is >> tempr;
217
 
                is.get();
218
 
                is >> tempi;
219
 
                v = complex<T>(tempr, tempi);
220
 
                return is;
221
 
        }
222
 
 
223
 
        template<class T, class charT, class traits> _UCXXEXPORT basic_ostream<charT, traits>&
224
 
                 operator<<(basic_ostream<charT, traits>& os, const complex<T>&v)
225
 
        {
226
 
                os << v.real() << ", " << v.imag();
227
 
                return os;
228
 
        }
229
 
 
230
 
        template<class T> _UCXXEXPORT T real(const complex<T>& v){
231
 
                return v.real();
232
 
        }
233
 
 
234
 
        template<class T> _UCXXEXPORT T imag(const complex<T>& v){
235
 
                return v.imag();
236
 
        }
237
 
 
238
 
        template<class T> _UCXXEXPORT T norm(const complex<T>& v){
239
 
                return (v.real() * v.real() + v.imag() * v.imag());
240
 
        }
241
 
 
242
 
        template<class T> _UCXXEXPORT complex<T> conj(const complex<T>& v){
243
 
                return complex<T>(v.real(), -v.imag());
244
 
        }
245
 
 
246
 
#ifdef __UCLIBCXX_SUPPORT_MATH__        //Can we link with libm?
247
 
 
248
 
        template<class T> _UCXXEXPORT T abs(const complex<T>& v){
249
 
                return sqrt(v.real() * v.real() + v.imag() * v.imag());
250
 
        }
251
 
 
252
 
        template<class T> _UCXXEXPORT T arg(const complex<T>& v){
253
 
                return atan2(v.imag(), v.real());
254
 
        }
255
 
 
256
 
        template<class T> _UCXXEXPORT complex<T> polar(const T& rho, const T& theta){
257
 
                return complex<T>(rho * cos(theta), rho * sin(theta));
258
 
        }
259
 
 
260
 
        template<class T> _UCXXEXPORT complex<T> cos  (const complex<T>& v){
261
 
                return complex<T>(cos(v.real()) * cosh(v.imag()), -sin(v.real()) * sinh(v.imag()));
262
 
        }
263
 
 
264
 
        template<class T> _UCXXEXPORT complex<T> cosh (const complex<T>& v){
265
 
                return complex<T>(cosh(v.real()) * cos(v.imag()), sinh(v.real()) * sin(v.imag()));
266
 
        }
267
 
 
268
 
        template<class T> _UCXXEXPORT complex<T> exp  (const complex<T>& v){
269
 
                return polar(exp(v.real()), v.imag());
270
 
        }
271
 
 
272
 
        template<class T> _UCXXEXPORT complex<T> log  (const complex<T>& v){
273
 
                return complex<T>(log(abs(v)), arg(v));
274
 
        }
275
 
 
276
 
        template<class T> _UCXXEXPORT complex<T> log10(const complex<T>& v){
277
 
                return (log(v) / log(T(10.0)));
278
 
        }
279
 
 
280
 
        template<class T> _UCXXEXPORT complex<T> pow(const complex<T>& v, int p){
281
 
                T rho = pow(abs(v), p);
282
 
                T theta = arg(v);
283
 
                return complex<T>(rho * cos(p * theta), rho * sin(p * theta) );
284
 
        }
285
 
 
286
 
        template<class T> _UCXXEXPORT complex<T> pow(const complex<T>& v, const T& p){
287
 
                return polar( pow(abs(v),p), arg(v)*p );
288
 
        }
289
 
 
290
 
        template<class T> _UCXXEXPORT complex<T> pow(const complex<T>& v, const complex<T>& p){
291
 
                if(v == T()){
292
 
                        //We are using "0" as the value
293
 
                        return T();
294
 
                }
295
 
                return exp(p * log(v));
296
 
        }
297
 
 
298
 
        template<class T> _UCXXEXPORT complex<T> pow(const T& v, const complex<T>& p){
299
 
                if(v == T()){
300
 
                        return T();
301
 
                }
302
 
                return polar(pow(v,p.real()), y.imag() * log(x) );
303
 
        }
304
 
 
305
 
        template<class T> _UCXXEXPORT complex<T> sin  (const complex<T>& v){
306
 
                return complex<T>(sin(v.real()) * cosh(v.imag()), cosh(v.real()) * sin(v.imag()));
307
 
        }
308
 
 
309
 
        template<class T> _UCXXEXPORT complex<T> sinh (const complex<T>& v){
310
 
                return complext<T>(sinh(v.real()) * cos(v.imag()), cosh(v.real()) * sin(v.imag()) );
311
 
        }
312
 
 
313
 
        template<class T> _UCXXEXPORT complex<T> sqrt (const complex<T>&);
314
 
        template<class T> _UCXXEXPORT complex<T> tan  (const complex<T>& v){
315
 
                return sin(v) / cos(v);
316
 
        }
317
 
 
318
 
        template<class T> _UCXXEXPORT complex<T> tanh (const complex<T>& v){
319
 
                return sinh(v) / cosh(v);
320
 
        }
321
 
 
322
 
#endif
323
 
 
324
 
}
325
 
 
326
 
#endif
327