• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 1999
3  * Silicon Graphics Computer Systems, Inc.
4  *
5  * Copyright (c) 1999
6  * Boris Fomitchev
7  *
8  * This material is provided "as is", with absolutely no warranty expressed
9  * or implied. Any use is at your own risk.
10  *
11  * Permission to use or copy this software for any purpose is hereby granted
12  * without fee, provided the above notices are retained on all copies.
13  * Permission to modify the code and to distribute modified code is granted,
14  * provided the above notices are retained, and a notice that the code was
15  * modified is included with the above copyright notice.
16  *
17  */
18 #ifndef _STLP_INTERNAL_COMPLEX
19 #define _STLP_INTERNAL_COMPLEX
20 
21 // This header declares the template class complex, as described in
22 // in the draft C++ standard.  Single-precision complex numbers
23 // are complex<float>, double-precision are complex<double>, and
24 // quad precision are complex<long double>.
25 
26 // Note that the template class complex is declared within namespace
27 // std, as called for by the draft C++ standard.
28 
29 #ifndef _STLP_INTERNAL_CMATH
30 #  include <stl/_cmath.h>
31 #endif
32 
33 _STLP_BEGIN_NAMESPACE
34 
35 template <class _Tp>
36 struct complex {
37   typedef _Tp value_type;
38   typedef complex<_Tp> _Self;
39 
40   // Constructors, destructor, assignment operator.
complexcomplex41   complex() : _M_re(0), _M_im(0) {}
complexcomplex42   complex(const value_type& __x)
43     : _M_re(__x), _M_im(0) {}
complexcomplex44   complex(const value_type& __x, const value_type& __y)
45     : _M_re(__x), _M_im(__y) {}
complexcomplex46   complex(const _Self& __z)
47     : _M_re(__z._M_re), _M_im(__z._M_im) {}
48 
49   _Self& operator=(const _Self& __z) {
50     _M_re = __z._M_re;
51     _M_im = __z._M_im;
52     return *this;
53   }
54 
55 #if defined (_STLP_MEMBER_TEMPLATES) && defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
56   template <class _Tp2>
complexcomplex57   explicit complex(const complex<_Tp2>& __z)
58     : _M_re(__z._M_re), _M_im(__z._M_im) {}
59 
60   template <class _Tp2>
61   _Self& operator=(const complex<_Tp2>& __z) {
62     _M_re = __z._M_re;
63     _M_im = __z._M_im;
64     return *this;
65   }
66 #endif /* _STLP_MEMBER_TEMPLATES */
67 
68   // Element access.
realcomplex69   value_type real() const { return _M_re; }
imagcomplex70   value_type imag() const { return _M_im; }
71 
72   // Arithmetic op= operations involving one real argument.
73 
74   _Self& operator= (const value_type& __x) {
75     _M_re = __x;
76     _M_im = 0;
77     return *this;
78   }
79   _Self& operator+= (const value_type& __x) {
80     _M_re += __x;
81     return *this;
82   }
83   _Self& operator-= (const value_type& __x) {
84     _M_re -= __x;
85     return *this;
86   }
87   _Self& operator*= (const value_type& __x) {
88     _M_re *= __x;
89     _M_im *= __x;
90     return *this;
91   }
92   _Self& operator/= (const value_type& __x) {
93     _M_re /= __x;
94     _M_im /= __x;
95     return *this;
96   }
97 
98   // Arithmetic op= operations involving two complex arguments.
99 
100   static void  _STLP_CALL _div(const value_type& __z1_r, const value_type& __z1_i,
101                                const value_type& __z2_r, const value_type& __z2_i,
102                                value_type& __res_r, value_type& __res_i);
103 
104   static void _STLP_CALL _div(const value_type& __z1_r,
105                               const value_type& __z2_r, const value_type& __z2_i,
106                               value_type& __res_r, value_type& __res_i);
107 
108 #if defined (_STLP_MEMBER_TEMPLATES) // && defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
109 
110   template <class _Tp2> _Self& operator+= (const complex<_Tp2>& __z) {
111     _M_re += __z._M_re;
112     _M_im += __z._M_im;
113     return *this;
114   }
115 
116   template <class _Tp2> _Self& operator-= (const complex<_Tp2>& __z) {
117     _M_re -= __z._M_re;
118     _M_im -= __z._M_im;
119     return *this;
120   }
121 
122   template <class _Tp2> _Self& operator*= (const complex<_Tp2>& __z) {
123     value_type __r = _M_re * __z._M_re - _M_im * __z._M_im;
124     value_type __i = _M_re * __z._M_im + _M_im * __z._M_re;
125     _M_re = __r;
126     _M_im = __i;
127     return *this;
128   }
129 
130   template <class _Tp2> _Self& operator/= (const complex<_Tp2>& __z) {
131     value_type __r;
132     value_type __i;
133     _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
134     _M_re = __r;
135     _M_im = __i;
136     return *this;
137   }
138 #endif /* _STLP_MEMBER_TEMPLATES */
139 
140   _Self& operator+= (const _Self& __z) {
141     _M_re += __z._M_re;
142     _M_im += __z._M_im;
143     return *this;
144   }
145 
146   _Self& operator-= (const _Self& __z) {
147     _M_re -= __z._M_re;
148     _M_im -= __z._M_im;
149     return *this;
150   }
151 
152   _Self& operator*= (const _Self& __z) {
153     value_type __r = _M_re * __z._M_re - _M_im * __z._M_im;
154     value_type __i = _M_re * __z._M_im + _M_im * __z._M_re;
155     _M_re = __r;
156     _M_im = __i;
157     return *this;
158   }
159 
160   _Self& operator/= (const _Self& __z) {
161     value_type __r;
162     value_type __i;
163     _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
164     _M_re = __r;
165     _M_im = __i;
166     return *this;
167   }
168 
169   // Data members.
170   value_type _M_re;
171   value_type _M_im;
172 };
173 
174 // Explicit specializations for float, double, long double.  The only
175 // reason for these specializations is to enable automatic conversions
176 // from complex<float> to complex<double>, and complex<double> to
177 // complex<long double>.
178 
179 _STLP_TEMPLATE_NULL
180 struct _STLP_CLASS_DECLSPEC complex<float> {
181   typedef float value_type;
182   typedef complex<float> _Self;
183   // Constructors, destructor, assignment operator.
184 
185   complex(value_type __x = 0.0f, value_type __y = 0.0f)
186     : _M_re(__x), _M_im(__y) {}
187 
188   complex(const complex<float>& __z)    : _M_re(__z._M_re), _M_im(__z._M_im) {}
189 
190   inline explicit complex(const complex<double>& __z);
191 #ifndef _STLP_NO_LONG_DOUBLE
192   inline explicit complex(const complex<long double>& __z);
193 #endif
194   // Element access.
195   value_type real() const { return _M_re; }
196   value_type imag() const { return _M_im; }
197 
198   // Arithmetic op= operations involving one real argument.
199 
200   _Self& operator= (value_type __x) {
201     _M_re = __x;
202     _M_im = 0.0f;
203     return *this;
204   }
205   _Self& operator+= (value_type __x) {
206     _M_re += __x;
207     return *this;
208   }
209   _Self& operator-= (value_type __x) {
210     _M_re -= __x;
211     return *this;
212   }
213   _Self& operator*= (value_type __x) {
214     _M_re *= __x;
215     _M_im *= __x;
216     return *this;
217   }
218   _Self& operator/= (value_type __x) {
219     _M_re /= __x;
220     _M_im /= __x;
221     return *this;
222   }
223 
224   // Arithmetic op= operations involving two complex arguments.
225 
226   static void _STLP_CALL _div(const float& __z1_r, const float& __z1_i,
227                               const float& __z2_r, const float& __z2_i,
228                               float& __res_r, float& __res_i);
229 
230   static void _STLP_CALL _div(const float& __z1_r,
231                               const float& __z2_r, const float& __z2_i,
232                               float& __res_r, float& __res_i);
233 
234 #if defined (_STLP_MEMBER_TEMPLATES)
235   template <class _Tp2>
236   complex<float>& operator=(const complex<_Tp2>& __z) {
237     _M_re = __z._M_re;
238     _M_im = __z._M_im;
239     return *this;
240   }
241 
242   template <class _Tp2>
243   complex<float>& operator+= (const complex<_Tp2>& __z) {
244     _M_re += __z._M_re;
245     _M_im += __z._M_im;
246     return *this;
247   }
248 
249   template <class _Tp2>
250   complex<float>& operator-= (const complex<_Tp2>& __z) {
251     _M_re -= __z._M_re;
252     _M_im -= __z._M_im;
253     return *this;
254   }
255 
256   template <class _Tp2>
257   complex<float>& operator*= (const complex<_Tp2>& __z) {
258     float __r = _M_re * __z._M_re - _M_im * __z._M_im;
259     float __i = _M_re * __z._M_im + _M_im * __z._M_re;
260     _M_re = __r;
261     _M_im = __i;
262     return *this;
263   }
264 
265   template <class _Tp2>
266   complex<float>& operator/= (const complex<_Tp2>& __z) {
267     float __r;
268     float __i;
269     _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
270     _M_re = __r;
271     _M_im = __i;
272     return *this;
273   }
274 
275 #endif /* _STLP_MEMBER_TEMPLATES */
276 
277   _Self& operator=(const _Self& __z) {
278     _M_re = __z._M_re;
279     _M_im = __z._M_im;
280     return *this;
281   }
282 
283   _Self& operator+= (const _Self& __z) {
284     _M_re += __z._M_re;
285     _M_im += __z._M_im;
286     return *this;
287   }
288 
289   _Self& operator-= (const _Self& __z) {
290     _M_re -= __z._M_re;
291     _M_im -= __z._M_im;
292     return *this;
293   }
294 
295   _Self& operator*= (const _Self& __z) {
296     value_type __r = _M_re * __z._M_re - _M_im * __z._M_im;
297     value_type __i = _M_re * __z._M_im + _M_im * __z._M_re;
298     _M_re = __r;
299     _M_im = __i;
300     return *this;
301   }
302 
303   _Self& operator/= (const _Self& __z) {
304     value_type __r;
305     value_type __i;
306     _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
307     _M_re = __r;
308     _M_im = __i;
309     return *this;
310   }
311 
312   // Data members.
313   value_type _M_re;
314   value_type _M_im;
315 };
316 
317 _STLP_TEMPLATE_NULL
318 struct _STLP_CLASS_DECLSPEC complex<double> {
319   typedef double value_type;
320   typedef complex<double> _Self;
321 
322   // Constructors, destructor, assignment operator.
323 
324   complex(value_type __x = 0.0, value_type __y = 0.0)
325     : _M_re(__x), _M_im(__y) {}
326 
327   complex(const complex<double>& __z)
328     : _M_re(__z._M_re), _M_im(__z._M_im) {}
329   inline complex(const complex<float>& __z);
330 #if !defined (_STLP_NO_LONG_DOUBLE)
331   explicit inline complex(const complex<long double>& __z);
332 #endif
333   // Element access.
334   value_type real() const { return _M_re; }
335   value_type imag() const { return _M_im; }
336 
337   // Arithmetic op= operations involving one real argument.
338 
339   _Self& operator= (value_type __x) {
340     _M_re = __x;
341     _M_im = 0.0;
342     return *this;
343   }
344   _Self& operator+= (value_type __x) {
345     _M_re += __x;
346     return *this;
347   }
348   _Self& operator-= (value_type __x) {
349     _M_re -= __x;
350     return *this;
351   }
352   _Self& operator*= (value_type __x) {
353     _M_re *= __x;
354     _M_im *= __x;
355     return *this;
356   }
357   _Self& operator/= (value_type __x) {
358     _M_re /= __x;
359     _M_im /= __x;
360     return *this;
361   }
362 
363   // Arithmetic op= operations involving two complex arguments.
364 
365   static void _STLP_CALL _div(const double& __z1_r, const double& __z1_i,
366                               const double& __z2_r, const double& __z2_i,
367                               double& __res_r, double& __res_i);
368   static void _STLP_CALL _div(const double& __z1_r,
369                               const double& __z2_r, const double& __z2_i,
370                               double& __res_r, double& __res_i);
371 
372 #if defined (_STLP_MEMBER_TEMPLATES) && defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
373   template <class _Tp2>
374   complex<double>& operator=(const complex<_Tp2>& __z) {
375     _M_re = __z._M_re;
376     _M_im = __z._M_im;
377     return *this;
378   }
379 
380   template <class _Tp2>
381   complex<double>& operator+= (const complex<_Tp2>& __z) {
382     _M_re += __z._M_re;
383     _M_im += __z._M_im;
384     return *this;
385   }
386 
387   template <class _Tp2>
388   complex<double>& operator-= (const complex<_Tp2>& __z) {
389     _M_re -= __z._M_re;
390     _M_im -= __z._M_im;
391     return *this;
392   }
393 
394   template <class _Tp2>
395   complex<double>& operator*= (const complex<_Tp2>& __z) {
396     double __r = _M_re * __z._M_re - _M_im * __z._M_im;
397     double __i = _M_re * __z._M_im + _M_im * __z._M_re;
398     _M_re = __r;
399     _M_im = __i;
400     return *this;
401   }
402 
403   template <class _Tp2>
404   complex<double>& operator/= (const complex<_Tp2>& __z) {
405     double __r;
406     double __i;
407     _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
408     _M_re = __r;
409     _M_im = __i;
410     return *this;
411   }
412 
413 #endif /* _STLP_MEMBER_TEMPLATES */
414 
415   _Self& operator=(const _Self& __z) {
416     _M_re = __z._M_re;
417     _M_im = __z._M_im;
418     return *this;
419   }
420 
421   _Self& operator+= (const _Self& __z) {
422     _M_re += __z._M_re;
423     _M_im += __z._M_im;
424     return *this;
425   }
426 
427   _Self& operator-= (const _Self& __z) {
428     _M_re -= __z._M_re;
429     _M_im -= __z._M_im;
430     return *this;
431   }
432 
433   _Self& operator*= (const _Self& __z) {
434     value_type __r = _M_re * __z._M_re - _M_im * __z._M_im;
435     value_type __i = _M_re * __z._M_im + _M_im * __z._M_re;
436     _M_re = __r;
437     _M_im = __i;
438     return *this;
439   }
440 
441   _Self& operator/= (const _Self& __z) {
442     value_type __r;
443     value_type __i;
444     _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
445     _M_re = __r;
446     _M_im = __i;
447     return *this;
448   }
449 
450   // Data members.
451   value_type _M_re;
452   value_type _M_im;
453 };
454 
455 #if !defined (_STLP_NO_LONG_DOUBLE)
456 
457 _STLP_TEMPLATE_NULL
458 struct _STLP_CLASS_DECLSPEC complex<long double> {
459   typedef long double value_type;
460   typedef complex<long double> _Self;
461 
462   // Constructors, destructor, assignment operator.
463   complex(value_type __x = 0.0l, value_type __y = 0.0l)
464     : _M_re(__x), _M_im(__y) {}
465 
466   complex(const complex<long double>& __z)
467     : _M_re(__z._M_re), _M_im(__z._M_im) {}
468   inline complex(const complex<float>& __z);
469   inline complex(const complex<double>& __z);
470 
471   // Element access.
472   value_type real() const { return _M_re; }
473   value_type imag() const { return _M_im; }
474 
475   // Arithmetic op= operations involving one real argument.
476 
477   _Self& operator= (value_type __x) {
478     _M_re = __x;
479     _M_im = 0.0l;
480     return *this;
481   }
482   _Self& operator+= (value_type __x) {
483     _M_re += __x;
484     return *this;
485   }
486   _Self& operator-= (value_type __x) {
487     _M_re -= __x;
488     return *this;
489   }
490   _Self& operator*= (value_type __x) {
491     _M_re *= __x;
492     _M_im *= __x;
493     return *this;
494   }
495   _Self& operator/= (value_type __x) {
496     _M_re /= __x;
497     _M_im /= __x;
498     return *this;
499   }
500 
501   // Arithmetic op= operations involving two complex arguments.
502 
503   static void _STLP_CALL _div(const long double& __z1_r, const long double& __z1_i,
504                               const long double& __z2_r, const long double& __z2_i,
505                               long double& __res_r, long double& __res_i);
506 
507   static void _STLP_CALL _div(const long double& __z1_r,
508                               const long double& __z2_r, const long double& __z2_i,
509                               long double& __res_r, long double& __res_i);
510 
511 #  if defined (_STLP_MEMBER_TEMPLATES) && defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
512 
513   template <class _Tp2>
514   complex<long double>& operator=(const complex<_Tp2>& __z) {
515     _M_re = __z._M_re;
516     _M_im = __z._M_im;
517     return *this;
518   }
519 
520   template <class _Tp2>
521   complex<long double>& operator+= (const complex<_Tp2>& __z) {
522     _M_re += __z._M_re;
523     _M_im += __z._M_im;
524     return *this;
525   }
526 
527   template <class _Tp2>
528   complex<long double>& operator-= (const complex<_Tp2>& __z) {
529     _M_re -= __z._M_re;
530     _M_im -= __z._M_im;
531     return *this;
532   }
533 
534   template <class _Tp2>
535   complex<long double>& operator*= (const complex<_Tp2>& __z) {
536     long double __r = _M_re * __z._M_re - _M_im * __z._M_im;
537     long double __i = _M_re * __z._M_im + _M_im * __z._M_re;
538     _M_re = __r;
539     _M_im = __i;
540     return *this;
541   }
542 
543   template <class _Tp2>
544   complex<long double>& operator/= (const complex<_Tp2>& __z) {
545     long double __r;
546     long double __i;
547     _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
548     _M_re = __r;
549     _M_im = __i;
550     return *this;
551   }
552 
553 #  endif /* _STLP_MEMBER_TEMPLATES */
554 
555   _Self& operator=(const _Self& __z) {
556     _M_re = __z._M_re;
557     _M_im = __z._M_im;
558     return *this;
559   }
560 
561   _Self& operator+= (const _Self& __z) {
562     _M_re += __z._M_re;
563     _M_im += __z._M_im;
564     return *this;
565   }
566 
567   _Self& operator-= (const _Self& __z) {
568     _M_re -= __z._M_re;
569     _M_im -= __z._M_im;
570     return *this;
571   }
572 
573   _Self& operator*= (const _Self& __z) {
574     value_type __r = _M_re * __z._M_re - _M_im * __z._M_im;
575     value_type __i = _M_re * __z._M_im + _M_im * __z._M_re;
576     _M_re = __r;
577     _M_im = __i;
578     return *this;
579   }
580 
581   _Self& operator/= (const _Self& __z) {
582     value_type __r;
583     value_type __i;
584     _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
585     _M_re = __r;
586     _M_im = __i;
587     return *this;
588   }
589 
590   // Data members.
591   value_type _M_re;
592   value_type _M_im;
593 };
594 
595 #endif /* _STLP_NO_LONG_DOUBLE */
596 
597 // Converting constructors from one of these three specialized types
598 // to another.
599 
600 inline complex<float>::complex(const complex<double>& __z)
601   : _M_re((float)__z._M_re), _M_im((float)__z._M_im) {}
602 inline complex<double>::complex(const complex<float>& __z)
603   : _M_re(__z._M_re), _M_im(__z._M_im) {}
604 #ifndef _STLP_NO_LONG_DOUBLE
605 inline complex<float>::complex(const complex<long double>& __z)
606   : _M_re((float)__z._M_re), _M_im((float)__z._M_im) {}
607 inline complex<double>::complex(const complex<long double>& __z)
608   : _M_re((double)__z._M_re), _M_im((double)__z._M_im) {}
609 inline complex<long double>::complex(const complex<float>& __z)
610   : _M_re(__z._M_re), _M_im(__z._M_im) {}
611 inline complex<long double>::complex(const complex<double>& __z)
612   : _M_re(__z._M_re), _M_im(__z._M_im) {}
613 #endif
614 
615 // Unary non-member arithmetic operators.
616 
617 template <class _Tp>
618 inline complex<_Tp> _STLP_CALL operator+(const complex<_Tp>& __z)
619 { return __z; }
620 
621 template <class _Tp>
622 inline complex<_Tp> _STLP_CALL  operator-(const complex<_Tp>& __z)
623 { return complex<_Tp>(-__z._M_re, -__z._M_im); }
624 
625 // Non-member arithmetic operations involving one real argument.
626 
627 template <class _Tp>
628 inline complex<_Tp> _STLP_CALL operator+(const _Tp& __x, const complex<_Tp>& __z)
629 { return complex<_Tp>(__x + __z._M_re, __z._M_im); }
630 
631 template <class _Tp>
632 inline complex<_Tp> _STLP_CALL operator+(const complex<_Tp>& __z, const _Tp& __x)
633 { return complex<_Tp>(__z._M_re + __x, __z._M_im); }
634 
635 template <class _Tp>
636 inline complex<_Tp> _STLP_CALL operator-(const _Tp& __x, const complex<_Tp>& __z)
637 { return complex<_Tp>(__x - __z._M_re, -__z._M_im); }
638 
639 template <class _Tp>
640 inline complex<_Tp> _STLP_CALL operator-(const complex<_Tp>& __z, const _Tp& __x)
641 { return complex<_Tp>(__z._M_re - __x, __z._M_im); }
642 
643 template <class _Tp>
644 inline complex<_Tp> _STLP_CALL operator*(const _Tp& __x, const complex<_Tp>& __z)
645 { return complex<_Tp>(__x * __z._M_re, __x * __z._M_im); }
646 
647 template <class _Tp>
648 inline complex<_Tp> _STLP_CALL operator*(const complex<_Tp>& __z, const _Tp& __x)
649 { return complex<_Tp>(__z._M_re * __x, __z._M_im * __x); }
650 
651 template <class _Tp>
652 inline complex<_Tp> _STLP_CALL operator/(const _Tp& __x, const complex<_Tp>& __z) {
653   complex<_Tp> __result;
654   complex<_Tp>::_div(__x,
655                      __z._M_re, __z._M_im,
656                      __result._M_re, __result._M_im);
657   return __result;
658 }
659 
660 template <class _Tp>
661 inline complex<_Tp> _STLP_CALL operator/(const complex<_Tp>& __z, const _Tp& __x)
662 { return complex<_Tp>(__z._M_re / __x, __z._M_im / __x); }
663 
664 // Non-member arithmetic operations involving two complex arguments
665 
666 template <class _Tp>
667 inline complex<_Tp> _STLP_CALL
668 operator+(const complex<_Tp>& __z1, const complex<_Tp>& __z2)
669 { return complex<_Tp>(__z1._M_re + __z2._M_re, __z1._M_im + __z2._M_im); }
670 
671 template <class _Tp>
672 inline complex<_Tp> _STLP_CALL
673 operator-(const complex<_Tp>& __z1, const complex<_Tp>& __z2)
674 { return complex<_Tp>(__z1._M_re - __z2._M_re, __z1._M_im - __z2._M_im); }
675 
676 template <class _Tp>
677 inline complex<_Tp> _STLP_CALL
678 operator*(const complex<_Tp>& __z1, const complex<_Tp>& __z2) {
679   return complex<_Tp>(__z1._M_re * __z2._M_re - __z1._M_im * __z2._M_im,
680                       __z1._M_re * __z2._M_im + __z1._M_im * __z2._M_re);
681 }
682 
683 template <class _Tp>
684 inline complex<_Tp> _STLP_CALL
685 operator/(const complex<_Tp>& __z1, const complex<_Tp>& __z2) {
686   complex<_Tp> __result;
687   complex<_Tp>::_div(__z1._M_re, __z1._M_im,
688                      __z2._M_re, __z2._M_im,
689                      __result._M_re, __result._M_im);
690   return __result;
691 }
692 
693 // Comparison operators.
694 
695 template <class _Tp>
696 inline bool _STLP_CALL operator==(const complex<_Tp>& __z1, const complex<_Tp>& __z2)
697 { return __z1._M_re == __z2._M_re && __z1._M_im == __z2._M_im; }
698 
699 template <class _Tp>
700 inline bool _STLP_CALL operator==(const complex<_Tp>& __z, const _Tp& __x)
701 { return __z._M_re == __x && __z._M_im == 0; }
702 
703 template <class _Tp>
704 inline bool _STLP_CALL operator==(const _Tp& __x, const complex<_Tp>& __z)
705 { return __x == __z._M_re && 0 == __z._M_im; }
706 
707 //04/27/04 dums: removal of this check, if it is restablish
708 //please explain why the other operators are not macro guarded
709 //#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
710 
711 template <class _Tp>
712 inline bool _STLP_CALL operator!=(const complex<_Tp>& __z1, const complex<_Tp>& __z2)
713 { return __z1._M_re != __z2._M_re || __z1._M_im != __z2._M_im; }
714 
715 //#endif /* _STLP_FUNCTION_TMPL_PARTIAL_ORDER */
716 
717 template <class _Tp>
718 inline bool _STLP_CALL operator!=(const complex<_Tp>& __z, const _Tp& __x)
719 { return __z._M_re != __x || __z._M_im != 0; }
720 
721 template <class _Tp>
722 inline bool _STLP_CALL operator!=(const _Tp& __x, const complex<_Tp>& __z)
723 { return __x != __z._M_re || 0 != __z._M_im; }
724 
725 // Other basic arithmetic operations
726 template <class _Tp>
727 inline _Tp _STLP_CALL real(const complex<_Tp>& __z)
728 { return __z._M_re; }
729 
730 template <class _Tp>
731 inline _Tp _STLP_CALL imag(const complex<_Tp>& __z)
732 { return __z._M_im; }
733 
734 template <class _Tp>
735 _Tp _STLP_CALL abs(const complex<_Tp>& __z);
736 
737 template <class _Tp>
738 _Tp _STLP_CALL arg(const complex<_Tp>& __z);
739 
740 template <class _Tp>
741 inline _Tp _STLP_CALL norm(const complex<_Tp>& __z)
742 { return __z._M_re * __z._M_re + __z._M_im * __z._M_im; }
743 
744 template <class _Tp>
745 inline complex<_Tp> _STLP_CALL conj(const complex<_Tp>& __z)
746 { return complex<_Tp>(__z._M_re, -__z._M_im); }
747 
748 template <class _Tp>
749 complex<_Tp> _STLP_CALL polar(const _Tp& __rho)
750 { return complex<_Tp>(__rho, 0); }
751 
752 template <class _Tp>
753 complex<_Tp> _STLP_CALL polar(const _Tp& __rho, const _Tp& __phi);
754 
755 _STLP_TEMPLATE_NULL
756 _STLP_DECLSPEC float _STLP_CALL abs(const complex<float>&);
757 _STLP_TEMPLATE_NULL
758 _STLP_DECLSPEC double _STLP_CALL abs(const complex<double>&);
759 _STLP_TEMPLATE_NULL
760 _STLP_DECLSPEC float _STLP_CALL arg(const complex<float>&);
761 _STLP_TEMPLATE_NULL
762 _STLP_DECLSPEC double _STLP_CALL arg(const complex<double>&);
763 _STLP_TEMPLATE_NULL
764 _STLP_DECLSPEC complex<float> _STLP_CALL polar(const float& __rho, const float& __phi);
765 _STLP_TEMPLATE_NULL
766 _STLP_DECLSPEC complex<double> _STLP_CALL polar(const double& __rho, const double& __phi);
767 
768 template <class _Tp>
769 _Tp _STLP_CALL abs(const complex<_Tp>& __z)
770 { return _Tp(abs(complex<double>(double(__z.real()), double(__z.imag())))); }
771 
772 template <class _Tp>
773 _Tp _STLP_CALL arg(const complex<_Tp>& __z)
774 { return _Tp(arg(complex<double>(double(__z.real()), double(__z.imag())))); }
775 
776 template <class _Tp>
777 complex<_Tp> _STLP_CALL polar(const _Tp& __rho, const _Tp& __phi) {
778   complex<double> __tmp = polar(double(__rho), double(__phi));
779   return complex<_Tp>(_Tp(__tmp.real()), _Tp(__tmp.imag()));
780 }
781 
782 #if !defined (_STLP_NO_LONG_DOUBLE)
783 _STLP_TEMPLATE_NULL
784 _STLP_DECLSPEC long double _STLP_CALL arg(const complex<long double>&);
785 _STLP_TEMPLATE_NULL
786 _STLP_DECLSPEC long double _STLP_CALL abs(const complex<long double>&);
787 _STLP_TEMPLATE_NULL
788 _STLP_DECLSPEC complex<long double> _STLP_CALL polar(const long double&, const long double&);
789 #endif
790 
791 
792 #if !defined (_STLP_USE_NO_IOSTREAMS)
793 
794 _STLP_END_NAMESPACE
795 
796 #  ifndef _STLP_INTERNAL_IOSFWD
797 #    include <stl/_iosfwd.h>
798 #  endif
799 
800 _STLP_BEGIN_NAMESPACE
801 
802 // Complex output, in the form (re,im).  We use a two-step process
803 // involving stringstream so that we get the padding right.
804 template <class _Tp, class _CharT, class _Traits>
805 basic_ostream<_CharT, _Traits>&  _STLP_CALL
806 operator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __z);
807 
808 template <class _Tp, class _CharT, class _Traits>
809 basic_istream<_CharT, _Traits>& _STLP_CALL
810 operator>>(basic_istream<_CharT, _Traits>& __is, complex<_Tp>& __z);
811 
812 // Specializations for narrow characters; lets us avoid widen.
813 
814 _STLP_OPERATOR_TEMPLATE
815 _STLP_DECLSPEC basic_istream<char, char_traits<char> >& _STLP_CALL
816 operator>>(basic_istream<char, char_traits<char> >& __is, complex<float>& __z);
817 
818 _STLP_OPERATOR_TEMPLATE
819 _STLP_DECLSPEC basic_istream<char, char_traits<char> >& _STLP_CALL
820 operator>>(basic_istream<char, char_traits<char> >& __is, complex<double>& __z);
821 
822 _STLP_OPERATOR_TEMPLATE
823 _STLP_DECLSPEC basic_ostream<char, char_traits<char> >& _STLP_CALL
824 operator<<(basic_ostream<char, char_traits<char> >& __is, const complex<float>& __z);
825 
826 _STLP_OPERATOR_TEMPLATE
827 _STLP_DECLSPEC basic_ostream<char, char_traits<char> >& _STLP_CALL
828 operator<<(basic_ostream<char, char_traits<char> >& __is, const complex<double>& __z);
829 
830 #  if !defined (_STLP_NO_LONG_DOUBLE)
831 _STLP_OPERATOR_TEMPLATE
832 _STLP_DECLSPEC basic_istream<char, char_traits<char> >& _STLP_CALL
833 operator>>(basic_istream<char, char_traits<char> >& __is, complex<long double>& __z);
834 
835 _STLP_OPERATOR_TEMPLATE
836 _STLP_DECLSPEC basic_ostream<char, char_traits<char> >& _STLP_CALL
837 operator<<(basic_ostream<char, char_traits<char> >& __is, const complex<long double>& __z);
838 
839 #  endif
840 
841 #  if defined (_STLP_USE_TEMPLATE_EXPORT) && ! defined (_STLP_NO_WCHAR_T)
842 
843 _STLP_EXPORT_TEMPLATE basic_istream<wchar_t, char_traits<wchar_t> >& _STLP_CALL
844 operator>>(basic_istream<wchar_t, char_traits<wchar_t> >&, complex<double>&);
845 _STLP_EXPORT_TEMPLATE basic_ostream<wchar_t, char_traits<wchar_t> >& _STLP_CALL
846 operator<<(basic_ostream<wchar_t, char_traits<wchar_t> >&, const complex<double>&);
847 _STLP_EXPORT_TEMPLATE basic_istream<wchar_t, char_traits<wchar_t> >& _STLP_CALL
848 operator>>(basic_istream<wchar_t, char_traits<wchar_t> >&, complex<float>&);
849 _STLP_EXPORT_TEMPLATE basic_ostream<wchar_t, char_traits<wchar_t> >& _STLP_CALL
850 operator<<(basic_ostream<wchar_t, char_traits<wchar_t> >&, const complex<float>&);
851 
852 #    if !defined (_STLP_NO_LONG_DOUBLE)
853 _STLP_EXPORT_TEMPLATE basic_istream<wchar_t, char_traits<wchar_t> >& _STLP_CALL
854 operator>>(basic_istream<wchar_t, char_traits<wchar_t> >&, complex<long double>&);
855 _STLP_EXPORT_TEMPLATE basic_ostream<wchar_t, char_traits<wchar_t> >& _STLP_CALL
856 operator<<(basic_ostream<wchar_t, char_traits<wchar_t> >&, const complex<long double>&);
857 #    endif
858 #  endif
859 #endif
860 
861 
862 // Transcendental functions.  These are defined only for float,
863 //  double, and long double.  (Sqrt isn't transcendental, of course,
864 //  but it's included in this section anyway.)
865 
866 _STLP_DECLSPEC complex<float> _STLP_CALL sqrt(const complex<float>&);
867 
868 _STLP_DECLSPEC complex<float> _STLP_CALL exp(const complex<float>&);
869 _STLP_DECLSPEC complex<float> _STLP_CALL  log(const complex<float>&);
870 _STLP_DECLSPEC complex<float> _STLP_CALL log10(const complex<float>&);
871 
872 _STLP_DECLSPEC complex<float> _STLP_CALL pow(const complex<float>&, int);
873 _STLP_DECLSPEC complex<float> _STLP_CALL pow(const complex<float>&, const float&);
874 _STLP_DECLSPEC complex<float> _STLP_CALL pow(const float&, const complex<float>&);
875 _STLP_DECLSPEC complex<float> _STLP_CALL pow(const complex<float>&, const complex<float>&);
876 
877 _STLP_DECLSPEC complex<float> _STLP_CALL sin(const complex<float>&);
878 _STLP_DECLSPEC complex<float> _STLP_CALL cos(const complex<float>&);
879 _STLP_DECLSPEC complex<float> _STLP_CALL tan(const complex<float>&);
880 
881 _STLP_DECLSPEC complex<float> _STLP_CALL sinh(const complex<float>&);
882 _STLP_DECLSPEC complex<float> _STLP_CALL cosh(const complex<float>&);
883 _STLP_DECLSPEC complex<float> _STLP_CALL tanh(const complex<float>&);
884 
885 _STLP_DECLSPEC complex<double> _STLP_CALL sqrt(const complex<double>&);
886 
887 _STLP_DECLSPEC complex<double> _STLP_CALL exp(const complex<double>&);
888 _STLP_DECLSPEC complex<double> _STLP_CALL log(const complex<double>&);
889 _STLP_DECLSPEC complex<double> _STLP_CALL log10(const complex<double>&);
890 
891 _STLP_DECLSPEC complex<double> _STLP_CALL pow(const complex<double>&, int);
892 _STLP_DECLSPEC complex<double> _STLP_CALL pow(const complex<double>&, const double&);
893 _STLP_DECLSPEC complex<double> _STLP_CALL pow(const double&, const complex<double>&);
894 _STLP_DECLSPEC complex<double> _STLP_CALL pow(const complex<double>&, const complex<double>&);
895 
896 _STLP_DECLSPEC complex<double> _STLP_CALL sin(const complex<double>&);
897 _STLP_DECLSPEC complex<double> _STLP_CALL cos(const complex<double>&);
898 _STLP_DECLSPEC complex<double> _STLP_CALL tan(const complex<double>&);
899 
900 _STLP_DECLSPEC complex<double> _STLP_CALL sinh(const complex<double>&);
901 _STLP_DECLSPEC complex<double> _STLP_CALL cosh(const complex<double>&);
902 _STLP_DECLSPEC complex<double> _STLP_CALL tanh(const complex<double>&);
903 
904 #if !defined (_STLP_NO_LONG_DOUBLE)
905 _STLP_DECLSPEC complex<long double> _STLP_CALL sqrt(const complex<long double>&);
906 _STLP_DECLSPEC complex<long double> _STLP_CALL exp(const complex<long double>&);
907 _STLP_DECLSPEC complex<long double> _STLP_CALL log(const complex<long double>&);
908 _STLP_DECLSPEC complex<long double> _STLP_CALL log10(const complex<long double>&);
909 
910 _STLP_DECLSPEC complex<long double> _STLP_CALL pow(const complex<long double>&, int);
911 _STLP_DECLSPEC complex<long double> _STLP_CALL pow(const complex<long double>&, const long double&);
912 _STLP_DECLSPEC complex<long double> _STLP_CALL pow(const long double&, const complex<long double>&);
913 _STLP_DECLSPEC complex<long double> _STLP_CALL pow(const complex<long double>&,
914                                                    const complex<long double>&);
915 
916 _STLP_DECLSPEC complex<long double> _STLP_CALL sin(const complex<long double>&);
917 _STLP_DECLSPEC complex<long double> _STLP_CALL cos(const complex<long double>&);
918 _STLP_DECLSPEC complex<long double> _STLP_CALL tan(const complex<long double>&);
919 
920 _STLP_DECLSPEC complex<long double> _STLP_CALL sinh(const complex<long double>&);
921 _STLP_DECLSPEC complex<long double> _STLP_CALL cosh(const complex<long double>&);
922 _STLP_DECLSPEC complex<long double> _STLP_CALL tanh(const complex<long double>&);
923 #endif
924 
925 _STLP_END_NAMESPACE
926 
927 #ifndef _STLP_LINK_TIME_INSTANTIATION
928 #  include <stl/_complex.c>
929 #endif
930 
931 #endif
932 
933 // Local Variables:
934 // mode:C++
935 // End:
936