111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1999
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Silicon Graphics Computer Systems, Inc.
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1999
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Boris Fomitchev
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This material is provided "as is", with absolutely no warranty expressed
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * or implied. Any use is at your own risk.
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Permission to use or copy this software for any purpose is hereby granted
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * without fee, provided the above notices are retained on all copies.
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Permission to modify the code and to distribute modified code is granted,
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * provided the above notices are retained, and a notice that the code was
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * modified is included with the above copyright notice.
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _STLP_INTERNAL_COMPLEX
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _STLP_INTERNAL_COMPLEX
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This header declares the template class complex, as described in
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// in the draft C++ standard.  Single-precision complex numbers
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// are complex<float>, double-precision are complex<double>, and
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// quad precision are complex<long double>.
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Note that the template class complex is declared within namespace
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// std, as called for by the draft C++ standard.
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _STLP_INTERNAL_CMATH
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  include <stl/_cmath.h>
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_BEGIN_NAMESPACE
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct complex {
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _Tp value_type;
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef complex<_Tp> _Self;
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Constructors, destructor, assignment operator.
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  complex() : _M_re(0), _M_im(0) {}
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  complex(const value_type& __x)
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : _M_re(__x), _M_im(0) {}
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  complex(const value_type& __x, const value_type& __y)
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : _M_re(__x), _M_im(__y) {}
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  complex(const _Self& __z)
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : _M_re(__z._M_re), _M_im(__z._M_im) {}
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator=(const _Self& __z) {
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re = __z._M_re;
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im = __z._M_im;
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (_STLP_MEMBER_TEMPLATES) && defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template <class _Tp2>
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  explicit complex(const complex<_Tp2>& __z)
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : _M_re(__z._M_re), _M_im(__z._M_im) {}
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template <class _Tp2>
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator=(const complex<_Tp2>& __z) {
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re = __z._M_re;
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im = __z._M_im;
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* _STLP_MEMBER_TEMPLATES */
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Element access.
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  value_type real() const { return _M_re; }
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  value_type imag() const { return _M_im; }
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Arithmetic op= operations involving one real argument.
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator= (const value_type& __x) {
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re = __x;
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im = 0;
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator+= (const value_type& __x) {
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re += __x;
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator-= (const value_type& __x) {
8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re -= __x;
8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator*= (const value_type& __x) {
8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re *= __x;
8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im *= __x;
9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator/= (const value_type& __x) {
9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re /= __x;
9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im /= __x;
9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Arithmetic op= operations involving two complex arguments.
9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  static void  _STLP_CALL _div(const value_type& __z1_r, const value_type& __z1_i,
10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                               const value_type& __z2_r, const value_type& __z2_i,
10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                               value_type& __res_r, value_type& __res_i);
10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  static void _STLP_CALL _div(const value_type& __z1_r,
10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                              const value_type& __z2_r, const value_type& __z2_i,
10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                              value_type& __res_r, value_type& __res_i);
10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (_STLP_MEMBER_TEMPLATES) // && defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template <class _Tp2> _Self& operator+= (const complex<_Tp2>& __z) {
11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re += __z._M_re;
11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im += __z._M_im;
11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template <class _Tp2> _Self& operator-= (const complex<_Tp2>& __z) {
11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re -= __z._M_re;
11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im -= __z._M_im;
11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template <class _Tp2> _Self& operator*= (const complex<_Tp2>& __z) {
12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    value_type __r = _M_re * __z._M_re - _M_im * __z._M_im;
12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    value_type __i = _M_re * __z._M_im + _M_im * __z._M_re;
12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re = __r;
12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im = __i;
12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template <class _Tp2> _Self& operator/= (const complex<_Tp2>& __z) {
13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    value_type __r;
13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    value_type __i;
13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re = __r;
13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im = __i;
13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* _STLP_MEMBER_TEMPLATES */
13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator+= (const _Self& __z) {
14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re += __z._M_re;
14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im += __z._M_im;
14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator-= (const _Self& __z) {
14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re -= __z._M_re;
14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im -= __z._M_im;
14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator*= (const _Self& __z) {
15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    value_type __r = _M_re * __z._M_re - _M_im * __z._M_im;
15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    value_type __i = _M_re * __z._M_im + _M_im * __z._M_re;
15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re = __r;
15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im = __i;
15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator/= (const _Self& __z) {
16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    value_type __r;
16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    value_type __i;
16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re = __r;
16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im = __i;
16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Data members.
17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  value_type _M_re;
17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  value_type _M_im;
17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Explicit specializations for float, double, long double.  The only
17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// reason for these specializations is to enable automatic conversions
17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// from complex<float> to complex<double>, and complex<double> to
17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// complex<long double>.
17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL
18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _STLP_CLASS_DECLSPEC complex<float> {
18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef float value_type;
18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef complex<float> _Self;
18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Constructors, destructor, assignment operator.
18411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  complex(value_type __x = 0.0f, value_type __y = 0.0f)
18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : _M_re(__x), _M_im(__y) {}
18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
18811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  complex(const complex<float>& __z)    : _M_re(__z._M_re), _M_im(__z._M_im) {}
18911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
19011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  inline explicit complex(const complex<double>& __z);
19111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _STLP_NO_LONG_DOUBLE
19211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  inline explicit complex(const complex<long double>& __z);
19311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
19411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Element access.
19511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  value_type real() const { return _M_re; }
19611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  value_type imag() const { return _M_im; }
19711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
19811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Arithmetic op= operations involving one real argument.
19911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
20011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator= (value_type __x) {
20111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re = __x;
20211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im = 0.0f;
20311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
20411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
20511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator+= (value_type __x) {
20611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re += __x;
20711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
20811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
20911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator-= (value_type __x) {
21011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re -= __x;
21111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
21211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
21311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator*= (value_type __x) {
21411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re *= __x;
21511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im *= __x;
21611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
21711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
21811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator/= (value_type __x) {
21911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re /= __x;
22011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im /= __x;
22111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
22211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
22311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
22411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Arithmetic op= operations involving two complex arguments.
22511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
22611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  static void _STLP_CALL _div(const float& __z1_r, const float& __z1_i,
22711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                              const float& __z2_r, const float& __z2_i,
22811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                              float& __res_r, float& __res_i);
22911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
23011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  static void _STLP_CALL _div(const float& __z1_r,
23111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                              const float& __z2_r, const float& __z2_i,
23211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                              float& __res_r, float& __res_i);
23311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
23411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (_STLP_MEMBER_TEMPLATES)
23511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template <class _Tp2>
23611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  complex<float>& operator=(const complex<_Tp2>& __z) {
23711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re = __z._M_re;
23811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im = __z._M_im;
23911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
24011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
24111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
24211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template <class _Tp2>
24311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  complex<float>& operator+= (const complex<_Tp2>& __z) {
24411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re += __z._M_re;
24511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im += __z._M_im;
24611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
24711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
24811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
24911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template <class _Tp2>
25011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  complex<float>& operator-= (const complex<_Tp2>& __z) {
25111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re -= __z._M_re;
25211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im -= __z._M_im;
25311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
25411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
25511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
25611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template <class _Tp2>
25711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  complex<float>& operator*= (const complex<_Tp2>& __z) {
25811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    float __r = _M_re * __z._M_re - _M_im * __z._M_im;
25911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    float __i = _M_re * __z._M_im + _M_im * __z._M_re;
26011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re = __r;
26111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im = __i;
26211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
26311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
26411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
26511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template <class _Tp2>
26611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  complex<float>& operator/= (const complex<_Tp2>& __z) {
26711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    float __r;
26811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    float __i;
26911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
27011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re = __r;
27111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im = __i;
27211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
27311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
27411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
27511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* _STLP_MEMBER_TEMPLATES */
27611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
27711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator=(const _Self& __z) {
27811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re = __z._M_re;
27911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im = __z._M_im;
28011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
28111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
28211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
28311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator+= (const _Self& __z) {
28411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re += __z._M_re;
28511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im += __z._M_im;
28611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
28711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
28811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
28911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator-= (const _Self& __z) {
29011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re -= __z._M_re;
29111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im -= __z._M_im;
29211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
29311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
29411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
29511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator*= (const _Self& __z) {
29611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    value_type __r = _M_re * __z._M_re - _M_im * __z._M_im;
29711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    value_type __i = _M_re * __z._M_im + _M_im * __z._M_re;
29811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re = __r;
29911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im = __i;
30011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
30111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
30211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
30311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator/= (const _Self& __z) {
30411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    value_type __r;
30511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    value_type __i;
30611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
30711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re = __r;
30811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im = __i;
30911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
31011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
31111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
31211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Data members.
31311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  value_type _M_re;
31411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  value_type _M_im;
31511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
31611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
31711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL
31811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _STLP_CLASS_DECLSPEC complex<double> {
31911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef double value_type;
32011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef complex<double> _Self;
32111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
32211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Constructors, destructor, assignment operator.
32311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
32411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  complex(value_type __x = 0.0, value_type __y = 0.0)
32511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : _M_re(__x), _M_im(__y) {}
32611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
32711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  complex(const complex<double>& __z)
32811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : _M_re(__z._M_re), _M_im(__z._M_im) {}
32911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  inline complex(const complex<float>& __z);
33011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined (_STLP_NO_LONG_DOUBLE)
33111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  explicit inline complex(const complex<long double>& __z);
33211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
33311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Element access.
33411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  value_type real() const { return _M_re; }
33511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  value_type imag() const { return _M_im; }
33611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
33711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Arithmetic op= operations involving one real argument.
33811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
33911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator= (value_type __x) {
34011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re = __x;
34111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im = 0.0;
34211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
34311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
34411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator+= (value_type __x) {
34511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re += __x;
34611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
34711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
34811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator-= (value_type __x) {
34911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re -= __x;
35011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
35111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
35211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator*= (value_type __x) {
35311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re *= __x;
35411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im *= __x;
35511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
35611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
35711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator/= (value_type __x) {
35811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re /= __x;
35911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im /= __x;
36011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
36111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
36211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
36311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Arithmetic op= operations involving two complex arguments.
36411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
36511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  static void _STLP_CALL _div(const double& __z1_r, const double& __z1_i,
36611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                              const double& __z2_r, const double& __z2_i,
36711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                              double& __res_r, double& __res_i);
36811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  static void _STLP_CALL _div(const double& __z1_r,
36911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                              const double& __z2_r, const double& __z2_i,
37011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                              double& __res_r, double& __res_i);
37111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
37211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (_STLP_MEMBER_TEMPLATES) && defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
37311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template <class _Tp2>
37411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  complex<double>& operator=(const complex<_Tp2>& __z) {
37511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re = __z._M_re;
37611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im = __z._M_im;
37711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
37811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
37911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
38011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template <class _Tp2>
38111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  complex<double>& operator+= (const complex<_Tp2>& __z) {
38211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re += __z._M_re;
38311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im += __z._M_im;
38411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
38511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
38611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
38711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template <class _Tp2>
38811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  complex<double>& operator-= (const complex<_Tp2>& __z) {
38911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re -= __z._M_re;
39011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im -= __z._M_im;
39111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
39211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
39311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
39411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template <class _Tp2>
39511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  complex<double>& operator*= (const complex<_Tp2>& __z) {
39611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    double __r = _M_re * __z._M_re - _M_im * __z._M_im;
39711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    double __i = _M_re * __z._M_im + _M_im * __z._M_re;
39811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re = __r;
39911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im = __i;
40011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
40111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
40211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
40311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template <class _Tp2>
40411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  complex<double>& operator/= (const complex<_Tp2>& __z) {
40511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    double __r;
40611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    double __i;
40711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
40811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re = __r;
40911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im = __i;
41011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
41111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
41211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
41311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* _STLP_MEMBER_TEMPLATES */
41411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
41511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator=(const _Self& __z) {
41611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re = __z._M_re;
41711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im = __z._M_im;
41811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
41911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
42011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
42111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator+= (const _Self& __z) {
42211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re += __z._M_re;
42311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im += __z._M_im;
42411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
42511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
42611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
42711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator-= (const _Self& __z) {
42811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re -= __z._M_re;
42911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im -= __z._M_im;
43011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
43111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
43211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
43311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator*= (const _Self& __z) {
43411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    value_type __r = _M_re * __z._M_re - _M_im * __z._M_im;
43511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    value_type __i = _M_re * __z._M_im + _M_im * __z._M_re;
43611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re = __r;
43711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im = __i;
43811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
43911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
44011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
44111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator/= (const _Self& __z) {
44211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    value_type __r;
44311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    value_type __i;
44411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
44511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re = __r;
44611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im = __i;
44711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
44811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
44911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
45011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Data members.
45111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  value_type _M_re;
45211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  value_type _M_im;
45311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
45411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
45511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined (_STLP_NO_LONG_DOUBLE)
45611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
45711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL
45811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _STLP_CLASS_DECLSPEC complex<long double> {
45911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef long double value_type;
46011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef complex<long double> _Self;
46111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
46211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Constructors, destructor, assignment operator.
46311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  complex(value_type __x = 0.0l, value_type __y = 0.0l)
46411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : _M_re(__x), _M_im(__y) {}
46511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
46611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  complex(const complex<long double>& __z)
46711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : _M_re(__z._M_re), _M_im(__z._M_im) {}
46811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  inline complex(const complex<float>& __z);
46911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  inline complex(const complex<double>& __z);
47011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
47111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Element access.
47211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  value_type real() const { return _M_re; }
47311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  value_type imag() const { return _M_im; }
47411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
47511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Arithmetic op= operations involving one real argument.
47611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
47711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator= (value_type __x) {
47811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re = __x;
47911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im = 0.0l;
48011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
48111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
48211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator+= (value_type __x) {
48311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re += __x;
48411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
48511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
48611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator-= (value_type __x) {
48711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re -= __x;
48811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
48911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
49011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator*= (value_type __x) {
49111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re *= __x;
49211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im *= __x;
49311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
49411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
49511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator/= (value_type __x) {
49611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re /= __x;
49711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im /= __x;
49811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
49911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
50011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
50111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Arithmetic op= operations involving two complex arguments.
50211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
50311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  static void _STLP_CALL _div(const long double& __z1_r, const long double& __z1_i,
50411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                              const long double& __z2_r, const long double& __z2_i,
50511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                              long double& __res_r, long double& __res_i);
50611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
50711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  static void _STLP_CALL _div(const long double& __z1_r,
50811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                              const long double& __z2_r, const long double& __z2_i,
50911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                              long double& __res_r, long double& __res_i);
51011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
51111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  if defined (_STLP_MEMBER_TEMPLATES) && defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
51211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
51311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template <class _Tp2>
51411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  complex<long double>& operator=(const complex<_Tp2>& __z) {
51511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re = __z._M_re;
51611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im = __z._M_im;
51711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
51811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
51911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
52011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template <class _Tp2>
52111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  complex<long double>& operator+= (const complex<_Tp2>& __z) {
52211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re += __z._M_re;
52311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im += __z._M_im;
52411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
52511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
52611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
52711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template <class _Tp2>
52811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  complex<long double>& operator-= (const complex<_Tp2>& __z) {
52911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re -= __z._M_re;
53011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im -= __z._M_im;
53111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
53211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
53311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
53411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template <class _Tp2>
53511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  complex<long double>& operator*= (const complex<_Tp2>& __z) {
53611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    long double __r = _M_re * __z._M_re - _M_im * __z._M_im;
53711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    long double __i = _M_re * __z._M_im + _M_im * __z._M_re;
53811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re = __r;
53911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im = __i;
54011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
54111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
54211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
54311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template <class _Tp2>
54411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  complex<long double>& operator/= (const complex<_Tp2>& __z) {
54511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    long double __r;
54611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    long double __i;
54711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
54811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re = __r;
54911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im = __i;
55011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
55111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
55211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
55311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  endif /* _STLP_MEMBER_TEMPLATES */
55411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
55511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator=(const _Self& __z) {
55611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re = __z._M_re;
55711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im = __z._M_im;
55811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
55911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
56011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
56111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator+= (const _Self& __z) {
56211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re += __z._M_re;
56311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im += __z._M_im;
56411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
56511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
56611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
56711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator-= (const _Self& __z) {
56811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re -= __z._M_re;
56911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im -= __z._M_im;
57011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
57111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
57211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
57311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator*= (const _Self& __z) {
57411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    value_type __r = _M_re * __z._M_re - _M_im * __z._M_im;
57511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    value_type __i = _M_re * __z._M_im + _M_im * __z._M_re;
57611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re = __r;
57711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im = __i;
57811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
57911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
58011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
58111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator/= (const _Self& __z) {
58211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    value_type __r;
58311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    value_type __i;
58411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
58511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_re = __r;
58611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_im = __i;
58711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
58811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
58911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
59011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Data members.
59111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  value_type _M_re;
59211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  value_type _M_im;
59311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
59411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
59511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* _STLP_NO_LONG_DOUBLE */
59611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
59711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Converting constructors from one of these three specialized types
59811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// to another.
59911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
60011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline complex<float>::complex(const complex<double>& __z)
60111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  : _M_re((float)__z._M_re), _M_im((float)__z._M_im) {}
60211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline complex<double>::complex(const complex<float>& __z)
60311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  : _M_re(__z._M_re), _M_im(__z._M_im) {}
60411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _STLP_NO_LONG_DOUBLE
60511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline complex<float>::complex(const complex<long double>& __z)
60611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  : _M_re((float)__z._M_re), _M_im((float)__z._M_im) {}
60711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline complex<double>::complex(const complex<long double>& __z)
60811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  : _M_re((double)__z._M_re), _M_im((double)__z._M_im) {}
60911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline complex<long double>::complex(const complex<float>& __z)
61011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  : _M_re(__z._M_re), _M_im(__z._M_im) {}
61111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline complex<long double>::complex(const complex<double>& __z)
61211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  : _M_re(__z._M_re), _M_im(__z._M_im) {}
61311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
61411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
61511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Unary non-member arithmetic operators.
61611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
61711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
61811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline complex<_Tp> _STLP_CALL operator+(const complex<_Tp>& __z)
61911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return __z; }
62011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
62111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
62211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline complex<_Tp> _STLP_CALL  operator-(const complex<_Tp>& __z)
62311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return complex<_Tp>(-__z._M_re, -__z._M_im); }
62411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
62511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Non-member arithmetic operations involving one real argument.
62611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
62711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
62811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline complex<_Tp> _STLP_CALL operator+(const _Tp& __x, const complex<_Tp>& __z)
62911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return complex<_Tp>(__x + __z._M_re, __z._M_im); }
63011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
63111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
63211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline complex<_Tp> _STLP_CALL operator+(const complex<_Tp>& __z, const _Tp& __x)
63311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return complex<_Tp>(__z._M_re + __x, __z._M_im); }
63411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
63511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
63611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline complex<_Tp> _STLP_CALL operator-(const _Tp& __x, const complex<_Tp>& __z)
63711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return complex<_Tp>(__x - __z._M_re, -__z._M_im); }
63811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
63911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
64011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline complex<_Tp> _STLP_CALL operator-(const complex<_Tp>& __z, const _Tp& __x)
64111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return complex<_Tp>(__z._M_re - __x, __z._M_im); }
64211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
64311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
64411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline complex<_Tp> _STLP_CALL operator*(const _Tp& __x, const complex<_Tp>& __z)
64511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return complex<_Tp>(__x * __z._M_re, __x * __z._M_im); }
64611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
64711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
64811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline complex<_Tp> _STLP_CALL operator*(const complex<_Tp>& __z, const _Tp& __x)
64911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return complex<_Tp>(__z._M_re * __x, __z._M_im * __x); }
65011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
65111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
65211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline complex<_Tp> _STLP_CALL operator/(const _Tp& __x, const complex<_Tp>& __z) {
65311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  complex<_Tp> __result;
65411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  complex<_Tp>::_div(__x,
65511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                     __z._M_re, __z._M_im,
65611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                     __result._M_re, __result._M_im);
65711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  return __result;
65811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
65911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
66011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
66111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline complex<_Tp> _STLP_CALL operator/(const complex<_Tp>& __z, const _Tp& __x)
66211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return complex<_Tp>(__z._M_re / __x, __z._M_im / __x); }
66311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
66411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Non-member arithmetic operations involving two complex arguments
66511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
66611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
66711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline complex<_Tp> _STLP_CALL
66811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertoperator+(const complex<_Tp>& __z1, const complex<_Tp>& __z2)
66911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return complex<_Tp>(__z1._M_re + __z2._M_re, __z1._M_im + __z2._M_im); }
67011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
67111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
67211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline complex<_Tp> _STLP_CALL
67311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertoperator-(const complex<_Tp>& __z1, const complex<_Tp>& __z2)
67411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return complex<_Tp>(__z1._M_re - __z2._M_re, __z1._M_im - __z2._M_im); }
67511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
67611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
67711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline complex<_Tp> _STLP_CALL
67811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertoperator*(const complex<_Tp>& __z1, const complex<_Tp>& __z2) {
67911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  return complex<_Tp>(__z1._M_re * __z2._M_re - __z1._M_im * __z2._M_im,
68011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                      __z1._M_re * __z2._M_im + __z1._M_im * __z2._M_re);
68111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
68211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
68311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
68411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline complex<_Tp> _STLP_CALL
68511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertoperator/(const complex<_Tp>& __z1, const complex<_Tp>& __z2) {
68611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  complex<_Tp> __result;
68711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  complex<_Tp>::_div(__z1._M_re, __z1._M_im,
68811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                     __z2._M_re, __z2._M_im,
68911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                     __result._M_re, __result._M_im);
69011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  return __result;
69111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
69211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
69311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Comparison operators.
69411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
69511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
69611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline bool _STLP_CALL operator==(const complex<_Tp>& __z1, const complex<_Tp>& __z2)
69711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return __z1._M_re == __z2._M_re && __z1._M_im == __z2._M_im; }
69811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
69911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
70011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline bool _STLP_CALL operator==(const complex<_Tp>& __z, const _Tp& __x)
70111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return __z._M_re == __x && __z._M_im == 0; }
70211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
70311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
70411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline bool _STLP_CALL operator==(const _Tp& __x, const complex<_Tp>& __z)
70511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return __x == __z._M_re && 0 == __z._M_im; }
70611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
70711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//04/27/04 dums: removal of this check, if it is restablish
70811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//please explain why the other operators are not macro guarded
70911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
71011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
71111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
71211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline bool _STLP_CALL operator!=(const complex<_Tp>& __z1, const complex<_Tp>& __z2)
71311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return __z1._M_re != __z2._M_re || __z1._M_im != __z2._M_im; }
71411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
71511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//#endif /* _STLP_FUNCTION_TMPL_PARTIAL_ORDER */
71611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
71711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
71811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline bool _STLP_CALL operator!=(const complex<_Tp>& __z, const _Tp& __x)
71911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return __z._M_re != __x || __z._M_im != 0; }
72011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
72111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
72211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline bool _STLP_CALL operator!=(const _Tp& __x, const complex<_Tp>& __z)
72311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return __x != __z._M_re || 0 != __z._M_im; }
72411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
72511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Other basic arithmetic operations
72611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
72711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _Tp _STLP_CALL real(const complex<_Tp>& __z)
72811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return __z._M_re; }
72911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
73011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
73111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _Tp _STLP_CALL imag(const complex<_Tp>& __z)
73211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return __z._M_im; }
73311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
73411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
73511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_Tp _STLP_CALL abs(const complex<_Tp>& __z);
73611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
73711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
73811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_Tp _STLP_CALL arg(const complex<_Tp>& __z);
73911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
74011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
74111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _Tp _STLP_CALL norm(const complex<_Tp>& __z)
74211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return __z._M_re * __z._M_re + __z._M_im * __z._M_im; }
74311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
74411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
74511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline complex<_Tp> _STLP_CALL conj(const complex<_Tp>& __z)
74611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return complex<_Tp>(__z._M_re, -__z._M_im); }
74711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
74811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
74911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertcomplex<_Tp> _STLP_CALL polar(const _Tp& __rho)
75011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return complex<_Tp>(__rho, 0); }
75111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
75211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
75311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertcomplex<_Tp> _STLP_CALL polar(const _Tp& __rho, const _Tp& __phi);
75411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
75511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL
75611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC float _STLP_CALL abs(const complex<float>&);
75711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL
75811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC double _STLP_CALL abs(const complex<double>&);
75911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL
76011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC float _STLP_CALL arg(const complex<float>&);
76111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL
76211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC double _STLP_CALL arg(const complex<double>&);
76311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL
76411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<float> _STLP_CALL polar(const float& __rho, const float& __phi);
76511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL
76611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<double> _STLP_CALL polar(const double& __rho, const double& __phi);
76711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
76811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
76911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_Tp _STLP_CALL abs(const complex<_Tp>& __z)
77011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return _Tp(abs(complex<double>(double(__z.real()), double(__z.imag())))); }
77111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
77211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
77311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_Tp _STLP_CALL arg(const complex<_Tp>& __z)
77411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return _Tp(arg(complex<double>(double(__z.real()), double(__z.imag())))); }
77511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
77611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
77711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertcomplex<_Tp> _STLP_CALL polar(const _Tp& __rho, const _Tp& __phi) {
77811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  complex<double> __tmp = polar(double(__rho), double(__phi));
77911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  return complex<_Tp>(_Tp(__tmp.real()), _Tp(__tmp.imag()));
78011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
78111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
78211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined (_STLP_NO_LONG_DOUBLE)
78311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL
78411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC long double _STLP_CALL arg(const complex<long double>&);
78511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL
78611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC long double _STLP_CALL abs(const complex<long double>&);
78711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL
78811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<long double> _STLP_CALL polar(const long double&, const long double&);
78911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
79011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
79111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
79211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined (_STLP_USE_NO_IOSTREAMS)
79311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
79411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_END_NAMESPACE
79511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
79611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  ifndef _STLP_INTERNAL_IOSFWD
79711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#    include <stl/_iosfwd.h>
79811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  endif
79911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
80011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_BEGIN_NAMESPACE
80111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
80211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Complex output, in the form (re,im).  We use a two-step process
80311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// involving stringstream so that we get the padding right.
80411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _CharT, class _Traits>
80511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbasic_ostream<_CharT, _Traits>&  _STLP_CALL
80611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertoperator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __z);
80711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
80811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _CharT, class _Traits>
80911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbasic_istream<_CharT, _Traits>& _STLP_CALL
81011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertoperator>>(basic_istream<_CharT, _Traits>& __is, complex<_Tp>& __z);
81111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
81211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Specializations for narrow characters; lets us avoid widen.
81311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
81411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_OPERATOR_TEMPLATE
81511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC basic_istream<char, char_traits<char> >& _STLP_CALL
81611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertoperator>>(basic_istream<char, char_traits<char> >& __is, complex<float>& __z);
81711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
81811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_OPERATOR_TEMPLATE
81911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC basic_istream<char, char_traits<char> >& _STLP_CALL
82011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertoperator>>(basic_istream<char, char_traits<char> >& __is, complex<double>& __z);
82111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
82211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_OPERATOR_TEMPLATE
82311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC basic_ostream<char, char_traits<char> >& _STLP_CALL
82411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertoperator<<(basic_ostream<char, char_traits<char> >& __is, const complex<float>& __z);
82511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
82611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_OPERATOR_TEMPLATE
82711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC basic_ostream<char, char_traits<char> >& _STLP_CALL
82811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertoperator<<(basic_ostream<char, char_traits<char> >& __is, const complex<double>& __z);
82911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
83011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  if !defined (_STLP_NO_LONG_DOUBLE)
83111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_OPERATOR_TEMPLATE
83211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC basic_istream<char, char_traits<char> >& _STLP_CALL
83311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertoperator>>(basic_istream<char, char_traits<char> >& __is, complex<long double>& __z);
83411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
83511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_OPERATOR_TEMPLATE
83611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC basic_ostream<char, char_traits<char> >& _STLP_CALL
83711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertoperator<<(basic_ostream<char, char_traits<char> >& __is, const complex<long double>& __z);
83811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
83911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  endif
84011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
84111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  if defined (_STLP_USE_TEMPLATE_EXPORT) && ! defined (_STLP_NO_WCHAR_T)
84211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
84311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_EXPORT_TEMPLATE basic_istream<wchar_t, char_traits<wchar_t> >& _STLP_CALL
84411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertoperator>>(basic_istream<wchar_t, char_traits<wchar_t> >&, complex<double>&);
84511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_EXPORT_TEMPLATE basic_ostream<wchar_t, char_traits<wchar_t> >& _STLP_CALL
84611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertoperator<<(basic_ostream<wchar_t, char_traits<wchar_t> >&, const complex<double>&);
84711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_EXPORT_TEMPLATE basic_istream<wchar_t, char_traits<wchar_t> >& _STLP_CALL
84811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertoperator>>(basic_istream<wchar_t, char_traits<wchar_t> >&, complex<float>&);
84911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_EXPORT_TEMPLATE basic_ostream<wchar_t, char_traits<wchar_t> >& _STLP_CALL
85011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertoperator<<(basic_ostream<wchar_t, char_traits<wchar_t> >&, const complex<float>&);
85111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
85211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#    if !defined (_STLP_NO_LONG_DOUBLE)
85311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_EXPORT_TEMPLATE basic_istream<wchar_t, char_traits<wchar_t> >& _STLP_CALL
85411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertoperator>>(basic_istream<wchar_t, char_traits<wchar_t> >&, complex<long double>&);
85511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_EXPORT_TEMPLATE basic_ostream<wchar_t, char_traits<wchar_t> >& _STLP_CALL
85611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertoperator<<(basic_ostream<wchar_t, char_traits<wchar_t> >&, const complex<long double>&);
85711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#    endif
85811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  endif
85911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
86011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
86111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
86211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Transcendental functions.  These are defined only for float,
86311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//  double, and long double.  (Sqrt isn't transcendental, of course,
86411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//  but it's included in this section anyway.)
86511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
86611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<float> _STLP_CALL sqrt(const complex<float>&);
86711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
86811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<float> _STLP_CALL exp(const complex<float>&);
86911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<float> _STLP_CALL  log(const complex<float>&);
87011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<float> _STLP_CALL log10(const complex<float>&);
87111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
87211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<float> _STLP_CALL pow(const complex<float>&, int);
87311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<float> _STLP_CALL pow(const complex<float>&, const float&);
87411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<float> _STLP_CALL pow(const float&, const complex<float>&);
87511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<float> _STLP_CALL pow(const complex<float>&, const complex<float>&);
87611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
87711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<float> _STLP_CALL sin(const complex<float>&);
87811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<float> _STLP_CALL cos(const complex<float>&);
87911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<float> _STLP_CALL tan(const complex<float>&);
88011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
88111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<float> _STLP_CALL sinh(const complex<float>&);
88211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<float> _STLP_CALL cosh(const complex<float>&);
88311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<float> _STLP_CALL tanh(const complex<float>&);
88411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
88511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<double> _STLP_CALL sqrt(const complex<double>&);
88611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
88711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<double> _STLP_CALL exp(const complex<double>&);
88811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<double> _STLP_CALL log(const complex<double>&);
88911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<double> _STLP_CALL log10(const complex<double>&);
89011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
89111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<double> _STLP_CALL pow(const complex<double>&, int);
89211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<double> _STLP_CALL pow(const complex<double>&, const double&);
89311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<double> _STLP_CALL pow(const double&, const complex<double>&);
89411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<double> _STLP_CALL pow(const complex<double>&, const complex<double>&);
89511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
89611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<double> _STLP_CALL sin(const complex<double>&);
89711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<double> _STLP_CALL cos(const complex<double>&);
89811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<double> _STLP_CALL tan(const complex<double>&);
89911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
90011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<double> _STLP_CALL sinh(const complex<double>&);
90111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<double> _STLP_CALL cosh(const complex<double>&);
90211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<double> _STLP_CALL tanh(const complex<double>&);
90311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
90411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined (_STLP_NO_LONG_DOUBLE)
90511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<long double> _STLP_CALL sqrt(const complex<long double>&);
90611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<long double> _STLP_CALL exp(const complex<long double>&);
90711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<long double> _STLP_CALL log(const complex<long double>&);
90811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<long double> _STLP_CALL log10(const complex<long double>&);
90911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
91011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<long double> _STLP_CALL pow(const complex<long double>&, int);
91111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<long double> _STLP_CALL pow(const complex<long double>&, const long double&);
91211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<long double> _STLP_CALL pow(const long double&, const complex<long double>&);
91311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<long double> _STLP_CALL pow(const complex<long double>&,
91411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                                   const complex<long double>&);
91511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
91611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<long double> _STLP_CALL sin(const complex<long double>&);
91711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<long double> _STLP_CALL cos(const complex<long double>&);
91811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<long double> _STLP_CALL tan(const complex<long double>&);
91911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
92011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<long double> _STLP_CALL sinh(const complex<long double>&);
92111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<long double> _STLP_CALL cosh(const complex<long double>&);
92211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DECLSPEC complex<long double> _STLP_CALL tanh(const complex<long double>&);
92311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
92411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
92511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_END_NAMESPACE
92611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
92711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _STLP_LINK_TIME_INSTANTIATION
92811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  include <stl/_complex.c>
92911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
93011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
93111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
93211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
93311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Local Variables:
93411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// mode:C++
93511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// End:
936