19720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/*
29720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1999
39720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Silicon Graphics Computer Systems, Inc.
49720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
59720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1999
69720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Boris Fomitchev
79720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
89720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * This material is provided "as is", with absolutely no warranty expressed
99720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * or implied. Any use is at your own risk.
109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to use or copy this software for any purpose is hereby granted
129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * without fee, provided the above notices are retained on all copies.
139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to modify the code and to distribute modified code is granted,
149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * provided the above notices are retained, and a notice that the code was
159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * modified is included with the above copyright notice.
169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */
189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_COMPLEX
199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_INTERNAL_COMPLEX
209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// This header declares the template class complex, as described in
229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// in the draft C++ standard.  Single-precision complex numbers
239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// are complex<float>, double-precision are complex<double>, and
249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// quad precision are complex<long double>.
259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Note that the template class complex is declared within namespace
279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// std, as called for by the draft C++ standard.
289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_CMATH
309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_cmath.h>
319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE
349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct complex {
379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _Tp value_type;
389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef complex<_Tp> _Self;
399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Constructors, destructor, assignment operator.
419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  complex() : _M_re(0), _M_im(0) {}
429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  complex(const value_type& __x)
439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _M_re(__x), _M_im(0) {}
449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  complex(const value_type& __x, const value_type& __y)
459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _M_re(__x), _M_im(__y) {}
469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  complex(const _Self& __z)
479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _M_re(__z._M_re), _M_im(__z._M_im) {}
489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator=(const _Self& __z) {
509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re = __z._M_re;
519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im = __z._M_im;
529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
55e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_MEMBER_TEMPLATES) && defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Tp2>
579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  explicit complex(const complex<_Tp2>& __z)
589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _M_re(__z._M_re), _M_im(__z._M_im) {}
599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Tp2>
619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator=(const complex<_Tp2>& __z) {
629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re = __z._M_re;
639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im = __z._M_im;
649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_MEMBER_TEMPLATES */
679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Element access.
699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  value_type real() const { return _M_re; }
709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  value_type imag() const { return _M_im; }
719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Arithmetic op= operations involving one real argument.
739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator= (const value_type& __x) {
759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re = __x;
769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im = 0;
779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator+= (const value_type& __x) {
809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re += __x;
819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator-= (const value_type& __x) {
849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re -= __x;
859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator*= (const value_type& __x) {
889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re *= __x;
899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im *= __x;
909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator/= (const value_type& __x) {
939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re /= __x;
949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im /= __x;
959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Arithmetic op= operations involving two complex arguments.
999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static void  _STLP_CALL _div(const value_type& __z1_r, const value_type& __z1_i,
1019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                               const value_type& __z2_r, const value_type& __z2_i,
1029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                               value_type& __res_r, value_type& __res_i);
1039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static void _STLP_CALL _div(const value_type& __z1_r,
1059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                              const value_type& __z2_r, const value_type& __z2_i,
1069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                              value_type& __res_r, value_type& __res_i);
1079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES) // && defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
1099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Tp2> _Self& operator+= (const complex<_Tp2>& __z) {
1119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re += __z._M_re;
1129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im += __z._M_im;
1139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
1149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Tp2> _Self& operator-= (const complex<_Tp2>& __z) {
1179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re -= __z._M_re;
1189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im -= __z._M_im;
1199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
1209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Tp2> _Self& operator*= (const complex<_Tp2>& __z) {
1239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    value_type __r = _M_re * __z._M_re - _M_im * __z._M_im;
1249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    value_type __i = _M_re * __z._M_im + _M_im * __z._M_re;
1259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re = __r;
1269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im = __i;
1279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
1289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Tp2> _Self& operator/= (const complex<_Tp2>& __z) {
1319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    value_type __r;
1329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    value_type __i;
1339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
1349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re = __r;
1359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im = __i;
1369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
1379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_MEMBER_TEMPLATES */
1399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator+= (const _Self& __z) {
1419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re += __z._M_re;
1429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im += __z._M_im;
1439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
1449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator-= (const _Self& __z) {
1479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re -= __z._M_re;
1489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im -= __z._M_im;
1499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
1509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator*= (const _Self& __z) {
1539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    value_type __r = _M_re * __z._M_re - _M_im * __z._M_im;
1549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    value_type __i = _M_re * __z._M_im + _M_im * __z._M_re;
1559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re = __r;
1569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im = __i;
1579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
1589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator/= (const _Self& __z) {
1619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    value_type __r;
1629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    value_type __i;
1639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
1649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re = __r;
1659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im = __i;
1669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
1679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Data members.
1709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  value_type _M_re;
1719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  value_type _M_im;
1729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
1739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Explicit specializations for float, double, long double.  The only
1759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// reason for these specializations is to enable automatic conversions
1769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// from complex<float> to complex<double>, and complex<double> to
1779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// complex<long double>.
1789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL
1809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct _STLP_CLASS_DECLSPEC complex<float> {
1819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef float value_type;
1829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef complex<float> _Self;
1839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Constructors, destructor, assignment operator.
1849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  complex(value_type __x = 0.0f, value_type __y = 0.0f)
1869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _M_re(__x), _M_im(__y) {}
1879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  complex(const complex<float>& __z)    : _M_re(__z._M_re), _M_im(__z._M_im) {}
1899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  inline explicit complex(const complex<double>& __z);
191e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_LONG_DOUBLE
1929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  inline explicit complex(const complex<long double>& __z);
193e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
1949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Element access.
1959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  value_type real() const { return _M_re; }
1969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  value_type imag() const { return _M_im; }
1979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Arithmetic op= operations involving one real argument.
1999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator= (value_type __x) {
2019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re = __x;
2029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im = 0.0f;
2039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
2049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator+= (value_type __x) {
2069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re += __x;
2079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
2089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator-= (value_type __x) {
2109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re -= __x;
2119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
2129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator*= (value_type __x) {
2149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re *= __x;
2159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im *= __x;
2169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
2179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator/= (value_type __x) {
2199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re /= __x;
2209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im /= __x;
2219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
2229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Arithmetic op= operations involving two complex arguments.
2259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static void _STLP_CALL _div(const float& __z1_r, const float& __z1_i,
2279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                              const float& __z2_r, const float& __z2_i,
2289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                              float& __res_r, float& __res_i);
2299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static void _STLP_CALL _div(const float& __z1_r,
2319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                              const float& __z2_r, const float& __z2_i,
2329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                              float& __res_r, float& __res_i);
2339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
234e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_MEMBER_TEMPLATES)
2359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Tp2>
2369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  complex<float>& operator=(const complex<_Tp2>& __z) {
2379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re = __z._M_re;
2389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im = __z._M_im;
2399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
2409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Tp2>
2439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  complex<float>& operator+= (const complex<_Tp2>& __z) {
2449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re += __z._M_re;
2459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im += __z._M_im;
2469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
2479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Tp2>
2509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  complex<float>& operator-= (const complex<_Tp2>& __z) {
2519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re -= __z._M_re;
2529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im -= __z._M_im;
2539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
2549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Tp2>
2579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  complex<float>& operator*= (const complex<_Tp2>& __z) {
2589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    float __r = _M_re * __z._M_re - _M_im * __z._M_im;
2599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    float __i = _M_re * __z._M_im + _M_im * __z._M_re;
2609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re = __r;
2619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im = __i;
2629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
2639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Tp2>
2669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  complex<float>& operator/= (const complex<_Tp2>& __z) {
2679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    float __r;
2689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    float __i;
2699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
2709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re = __r;
2719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im = __i;
2729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
2739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
275e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif /* _STLP_MEMBER_TEMPLATES */
2769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator=(const _Self& __z) {
2789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re = __z._M_re;
2799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im = __z._M_im;
2809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
2819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator+= (const _Self& __z) {
2849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re += __z._M_re;
2859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im += __z._M_im;
2869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
2879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator-= (const _Self& __z) {
2909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re -= __z._M_re;
2919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im -= __z._M_im;
2929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
2939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator*= (const _Self& __z) {
2969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    value_type __r = _M_re * __z._M_re - _M_im * __z._M_im;
2979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    value_type __i = _M_re * __z._M_im + _M_im * __z._M_re;
2989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re = __r;
2999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im = __i;
3009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
3019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator/= (const _Self& __z) {
3049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    value_type __r;
3059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    value_type __i;
3069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
3079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re = __r;
3089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im = __i;
3099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
3109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Data members.
3139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  value_type _M_re;
3149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  value_type _M_im;
3159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
3169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL
3189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct _STLP_CLASS_DECLSPEC complex<double> {
3199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef double value_type;
3209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef complex<double> _Self;
3219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Constructors, destructor, assignment operator.
3239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  complex(value_type __x = 0.0, value_type __y = 0.0)
3259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _M_re(__x), _M_im(__y) {}
3269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  complex(const complex<double>& __z)
3289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _M_re(__z._M_re), _M_im(__z._M_im) {}
3299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  inline complex(const complex<float>& __z);
330e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_LONG_DOUBLE)
3319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  explicit inline complex(const complex<long double>& __z);
332e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
3339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Element access.
3349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  value_type real() const { return _M_re; }
3359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  value_type imag() const { return _M_im; }
3369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Arithmetic op= operations involving one real argument.
3389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator= (value_type __x) {
3409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re = __x;
3419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im = 0.0;
3429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
3439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator+= (value_type __x) {
3459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re += __x;
3469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
3479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator-= (value_type __x) {
3499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re -= __x;
3509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
3519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator*= (value_type __x) {
3539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re *= __x;
3549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im *= __x;
3559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
3569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator/= (value_type __x) {
3589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re /= __x;
3599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im /= __x;
3609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
3619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Arithmetic op= operations involving two complex arguments.
3649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static void _STLP_CALL _div(const double& __z1_r, const double& __z1_i,
3669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                              const double& __z2_r, const double& __z2_i,
3679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                              double& __res_r, double& __res_i);
3689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static void _STLP_CALL _div(const double& __z1_r,
3699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                              const double& __z2_r, const double& __z2_i,
3709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                              double& __res_r, double& __res_i);
3719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
372e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_MEMBER_TEMPLATES) && defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
3739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Tp2>
3749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  complex<double>& operator=(const complex<_Tp2>& __z) {
3759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re = __z._M_re;
3769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im = __z._M_im;
3779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
3789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Tp2>
3819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  complex<double>& operator+= (const complex<_Tp2>& __z) {
3829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re += __z._M_re;
3839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im += __z._M_im;
3849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
3859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Tp2>
3889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  complex<double>& operator-= (const complex<_Tp2>& __z) {
3899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re -= __z._M_re;
3909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im -= __z._M_im;
3919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
3929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Tp2>
3959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  complex<double>& operator*= (const complex<_Tp2>& __z) {
3969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    double __r = _M_re * __z._M_re - _M_im * __z._M_im;
3979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    double __i = _M_re * __z._M_im + _M_im * __z._M_re;
3989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re = __r;
3999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im = __i;
4009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
4019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Tp2>
4049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  complex<double>& operator/= (const complex<_Tp2>& __z) {
4059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    double __r;
4069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    double __i;
4079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
4089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re = __r;
4099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im = __i;
4109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
4119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
413e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif /* _STLP_MEMBER_TEMPLATES */
4149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator=(const _Self& __z) {
4169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re = __z._M_re;
4179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im = __z._M_im;
4189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
4199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator+= (const _Self& __z) {
4229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re += __z._M_re;
4239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im += __z._M_im;
4249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
4259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator-= (const _Self& __z) {
4289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re -= __z._M_re;
4299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im -= __z._M_im;
4309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
4319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator*= (const _Self& __z) {
4349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    value_type __r = _M_re * __z._M_re - _M_im * __z._M_im;
4359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    value_type __i = _M_re * __z._M_im + _M_im * __z._M_re;
4369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re = __r;
4379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im = __i;
4389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
4399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator/= (const _Self& __z) {
4429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    value_type __r;
4439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    value_type __i;
4449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
4459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re = __r;
4469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im = __i;
4479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
4489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Data members.
4519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  value_type _M_re;
4529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  value_type _M_im;
4539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
4549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
455e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_LONG_DOUBLE)
4569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL
4589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct _STLP_CLASS_DECLSPEC complex<long double> {
4599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef long double value_type;
4609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef complex<long double> _Self;
4619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Constructors, destructor, assignment operator.
4639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  complex(value_type __x = 0.0l, value_type __y = 0.0l)
4649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _M_re(__x), _M_im(__y) {}
4659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  complex(const complex<long double>& __z)
4679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _M_re(__z._M_re), _M_im(__z._M_im) {}
4689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  inline complex(const complex<float>& __z);
4699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  inline complex(const complex<double>& __z);
4709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Element access.
4729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  value_type real() const { return _M_re; }
4739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  value_type imag() const { return _M_im; }
4749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Arithmetic op= operations involving one real argument.
4769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator= (value_type __x) {
4789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re = __x;
4799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im = 0.0l;
4809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
4819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator+= (value_type __x) {
4839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re += __x;
4849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
4859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator-= (value_type __x) {
4879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re -= __x;
4889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
4899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator*= (value_type __x) {
4919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re *= __x;
4929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im *= __x;
4939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
4949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator/= (value_type __x) {
4969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re /= __x;
4979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im /= __x;
4989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
4999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Arithmetic op= operations involving two complex arguments.
5029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static void _STLP_CALL _div(const long double& __z1_r, const long double& __z1_i,
5049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                              const long double& __z2_r, const long double& __z2_i,
5059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                              long double& __res_r, long double& __res_i);
5069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static void _STLP_CALL _div(const long double& __z1_r,
5089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                              const long double& __z2_r, const long double& __z2_i,
5099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                              long double& __res_r, long double& __res_i);
5109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
511e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  if defined (_STLP_MEMBER_TEMPLATES) && defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
5129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Tp2>
5149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  complex<long double>& operator=(const complex<_Tp2>& __z) {
5159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re = __z._M_re;
5169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im = __z._M_im;
5179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
5189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Tp2>
5219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  complex<long double>& operator+= (const complex<_Tp2>& __z) {
5229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re += __z._M_re;
5239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im += __z._M_im;
5249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
5259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Tp2>
5289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  complex<long double>& operator-= (const complex<_Tp2>& __z) {
5299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re -= __z._M_re;
5309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im -= __z._M_im;
5319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
5329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Tp2>
5359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  complex<long double>& operator*= (const complex<_Tp2>& __z) {
5369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    long double __r = _M_re * __z._M_re - _M_im * __z._M_im;
5379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    long double __i = _M_re * __z._M_im + _M_im * __z._M_re;
5389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re = __r;
5399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im = __i;
5409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
5419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Tp2>
5449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  complex<long double>& operator/= (const complex<_Tp2>& __z) {
5459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    long double __r;
5469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    long double __i;
5479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
5489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re = __r;
5499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im = __i;
5509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
5519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
553e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif /* _STLP_MEMBER_TEMPLATES */
5549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator=(const _Self& __z) {
5569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re = __z._M_re;
5579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im = __z._M_im;
5589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
5599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator+= (const _Self& __z) {
5629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re += __z._M_re;
5639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im += __z._M_im;
5649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
5659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator-= (const _Self& __z) {
5689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re -= __z._M_re;
5699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im -= __z._M_im;
5709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
5719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator*= (const _Self& __z) {
5749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    value_type __r = _M_re * __z._M_re - _M_im * __z._M_im;
5759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    value_type __i = _M_re * __z._M_im + _M_im * __z._M_re;
5769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re = __r;
5779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im = __i;
5789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
5799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator/= (const _Self& __z) {
5829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    value_type __r;
5839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    value_type __i;
5849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
5859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_re = __r;
5869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_im = __i;
5879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
5889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Data members.
5919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  value_type _M_re;
5929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  value_type _M_im;
5939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
5949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
595e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif /* _STLP_NO_LONG_DOUBLE */
5969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Converting constructors from one of these three specialized types
5989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// to another.
5999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline complex<float>::complex(const complex<double>& __z)
6019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  : _M_re((float)__z._M_re), _M_im((float)__z._M_im) {}
6029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline complex<double>::complex(const complex<float>& __z)
6039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  : _M_re(__z._M_re), _M_im(__z._M_im) {}
604e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_LONG_DOUBLE
6059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline complex<float>::complex(const complex<long double>& __z)
6069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  : _M_re((float)__z._M_re), _M_im((float)__z._M_im) {}
6079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline complex<double>::complex(const complex<long double>& __z)
6089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  : _M_re((double)__z._M_re), _M_im((double)__z._M_im) {}
6099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline complex<long double>::complex(const complex<float>& __z)
6109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  : _M_re(__z._M_re), _M_im(__z._M_im) {}
6119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline complex<long double>::complex(const complex<double>& __z)
6129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  : _M_re(__z._M_re), _M_im(__z._M_im) {}
613e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
6149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Unary non-member arithmetic operators.
6169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
6189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline complex<_Tp> _STLP_CALL operator+(const complex<_Tp>& __z)
6199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __z; }
6209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
6229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline complex<_Tp> _STLP_CALL  operator-(const complex<_Tp>& __z)
6239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return complex<_Tp>(-__z._M_re, -__z._M_im); }
6249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Non-member arithmetic operations involving one real argument.
6269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
6289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline complex<_Tp> _STLP_CALL operator+(const _Tp& __x, const complex<_Tp>& __z)
6299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return complex<_Tp>(__x + __z._M_re, __z._M_im); }
6309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
6329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline complex<_Tp> _STLP_CALL operator+(const complex<_Tp>& __z, const _Tp& __x)
6339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return complex<_Tp>(__z._M_re + __x, __z._M_im); }
6349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
6369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline complex<_Tp> _STLP_CALL operator-(const _Tp& __x, const complex<_Tp>& __z)
6379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return complex<_Tp>(__x - __z._M_re, -__z._M_im); }
6389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
6409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline complex<_Tp> _STLP_CALL operator-(const complex<_Tp>& __z, const _Tp& __x)
6419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return complex<_Tp>(__z._M_re - __x, __z._M_im); }
6429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
6449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline complex<_Tp> _STLP_CALL operator*(const _Tp& __x, const complex<_Tp>& __z)
6459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return complex<_Tp>(__x * __z._M_re, __x * __z._M_im); }
6469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
6489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline complex<_Tp> _STLP_CALL operator*(const complex<_Tp>& __z, const _Tp& __x)
6499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return complex<_Tp>(__z._M_re * __x, __z._M_im * __x); }
6509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
6529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline complex<_Tp> _STLP_CALL operator/(const _Tp& __x, const complex<_Tp>& __z) {
6539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  complex<_Tp> __result;
6549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  complex<_Tp>::_div(__x,
6559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                     __z._M_re, __z._M_im,
6569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                     __result._M_re, __result._M_im);
6579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __result;
6589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
6599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
6619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline complex<_Tp> _STLP_CALL operator/(const complex<_Tp>& __z, const _Tp& __x)
6629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return complex<_Tp>(__z._M_re / __x, __z._M_im / __x); }
6639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Non-member arithmetic operations involving two complex arguments
6659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
6679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline complex<_Tp> _STLP_CALL
6689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator+(const complex<_Tp>& __z1, const complex<_Tp>& __z2)
6699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return complex<_Tp>(__z1._M_re + __z2._M_re, __z1._M_im + __z2._M_im); }
6709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
6729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline complex<_Tp> _STLP_CALL
6739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator-(const complex<_Tp>& __z1, const complex<_Tp>& __z2)
6749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return complex<_Tp>(__z1._M_re - __z2._M_re, __z1._M_im - __z2._M_im); }
6759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
6779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline complex<_Tp> _STLP_CALL
6789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator*(const complex<_Tp>& __z1, const complex<_Tp>& __z2) {
6799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return complex<_Tp>(__z1._M_re * __z2._M_re - __z1._M_im * __z2._M_im,
6809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                      __z1._M_re * __z2._M_im + __z1._M_im * __z2._M_re);
6819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
6829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
6849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline complex<_Tp> _STLP_CALL
6859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator/(const complex<_Tp>& __z1, const complex<_Tp>& __z2) {
6869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  complex<_Tp> __result;
6879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  complex<_Tp>::_div(__z1._M_re, __z1._M_im,
6889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                     __z2._M_re, __z2._M_im,
6899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                     __result._M_re, __result._M_im);
6909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __result;
6919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
6929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Comparison operators.
6949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
6969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool _STLP_CALL operator==(const complex<_Tp>& __z1, const complex<_Tp>& __z2)
6979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __z1._M_re == __z2._M_re && __z1._M_im == __z2._M_im; }
6989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
7009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool _STLP_CALL operator==(const complex<_Tp>& __z, const _Tp& __x)
7019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __z._M_re == __x && __z._M_im == 0; }
7029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
7049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool _STLP_CALL operator==(const _Tp& __x, const complex<_Tp>& __z)
7059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __x == __z._M_re && 0 == __z._M_im; }
7069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//04/27/04 dums: removal of this check, if it is restablish
7089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//please explain why the other operators are not macro guarded
7099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
7109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
7129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool _STLP_CALL operator!=(const complex<_Tp>& __z1, const complex<_Tp>& __z2)
7139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __z1._M_re != __z2._M_re || __z1._M_im != __z2._M_im; }
7149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//#endif /* _STLP_FUNCTION_TMPL_PARTIAL_ORDER */
7169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
7189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool _STLP_CALL operator!=(const complex<_Tp>& __z, const _Tp& __x)
7199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __z._M_re != __x || __z._M_im != 0; }
7209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
7229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool _STLP_CALL operator!=(const _Tp& __x, const complex<_Tp>& __z)
7239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __x != __z._M_re || 0 != __z._M_im; }
7249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Other basic arithmetic operations
7269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
7279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _Tp _STLP_CALL real(const complex<_Tp>& __z)
7289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __z._M_re; }
7299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
7319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _Tp _STLP_CALL imag(const complex<_Tp>& __z)
7329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __z._M_im; }
7339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
7359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_Tp _STLP_CALL abs(const complex<_Tp>& __z);
7369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
7389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_Tp _STLP_CALL arg(const complex<_Tp>& __z);
7399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
7419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _Tp _STLP_CALL norm(const complex<_Tp>& __z)
7429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __z._M_re * __z._M_re + __z._M_im * __z._M_im; }
7439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
7459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline complex<_Tp> _STLP_CALL conj(const complex<_Tp>& __z)
7469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return complex<_Tp>(__z._M_re, -__z._M_im); }
7479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
7499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockcomplex<_Tp> _STLP_CALL polar(const _Tp& __rho)
7509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return complex<_Tp>(__rho, 0); }
7519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
7539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockcomplex<_Tp> _STLP_CALL polar(const _Tp& __rho, const _Tp& __phi);
7549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL
7569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC float _STLP_CALL abs(const complex<float>&);
7579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL
7589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC double _STLP_CALL abs(const complex<double>&);
7599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL
7609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC float _STLP_CALL arg(const complex<float>&);
7619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL
7629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC double _STLP_CALL arg(const complex<double>&);
7639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL
7649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<float> _STLP_CALL polar(const float& __rho, const float& __phi);
7659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL
7669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<double> _STLP_CALL polar(const double& __rho, const double& __phi);
7679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
7699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_Tp _STLP_CALL abs(const complex<_Tp>& __z)
7709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return _Tp(abs(complex<double>(double(__z.real()), double(__z.imag())))); }
7719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
7739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_Tp _STLP_CALL arg(const complex<_Tp>& __z)
7749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return _Tp(arg(complex<double>(double(__z.real()), double(__z.imag())))); }
7759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
7779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockcomplex<_Tp> _STLP_CALL polar(const _Tp& __rho, const _Tp& __phi) {
7789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  complex<double> __tmp = polar(double(__rho), double(__phi));
7799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return complex<_Tp>(_Tp(__tmp.real()), _Tp(__tmp.imag()));
7809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
7819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_NO_LONG_DOUBLE)
7839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL
7849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC long double _STLP_CALL arg(const complex<long double>&);
7859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL
7869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC long double _STLP_CALL abs(const complex<long double>&);
7879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL
7889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<long double> _STLP_CALL polar(const long double&, const long double&);
7899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
7909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_USE_NO_IOSTREAMS)
7939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE
7959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
796e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  ifndef _STLP_INTERNAL_IOSFWD
797e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    include <stl/_iosfwd.h>
798e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif
7999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE
8019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Complex output, in the form (re,im).  We use a two-step process
8039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// involving stringstream so that we get the padding right.
8049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _CharT, class _Traits>
8059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_ostream<_CharT, _Traits>&  _STLP_CALL
8069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __z);
8079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _CharT, class _Traits>
8099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>& _STLP_CALL
8109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator>>(basic_istream<_CharT, _Traits>& __is, complex<_Tp>& __z);
8119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Specializations for narrow characters; lets us avoid widen.
8139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_OPERATOR_TEMPLATE
8159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC basic_istream<char, char_traits<char> >& _STLP_CALL
8169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator>>(basic_istream<char, char_traits<char> >& __is, complex<float>& __z);
8179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_OPERATOR_TEMPLATE
8199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC basic_istream<char, char_traits<char> >& _STLP_CALL
8209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator>>(basic_istream<char, char_traits<char> >& __is, complex<double>& __z);
8219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_OPERATOR_TEMPLATE
8239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC basic_ostream<char, char_traits<char> >& _STLP_CALL
8249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator<<(basic_ostream<char, char_traits<char> >& __is, const complex<float>& __z);
8259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_OPERATOR_TEMPLATE
8279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC basic_ostream<char, char_traits<char> >& _STLP_CALL
8289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator<<(basic_ostream<char, char_traits<char> >& __is, const complex<double>& __z);
8299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if !defined (_STLP_NO_LONG_DOUBLE)
8319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_OPERATOR_TEMPLATE
8329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC basic_istream<char, char_traits<char> >& _STLP_CALL
8339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator>>(basic_istream<char, char_traits<char> >& __is, complex<long double>& __z);
8349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_OPERATOR_TEMPLATE
8369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC basic_ostream<char, char_traits<char> >& _STLP_CALL
8379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator<<(basic_ostream<char, char_traits<char> >& __is, const complex<long double>& __z);
8389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
8409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if defined (_STLP_USE_TEMPLATE_EXPORT) && ! defined (_STLP_NO_WCHAR_T)
8429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_EXPORT_TEMPLATE basic_istream<wchar_t, char_traits<wchar_t> >& _STLP_CALL
8449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator>>(basic_istream<wchar_t, char_traits<wchar_t> >&, complex<double>&);
8459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_EXPORT_TEMPLATE basic_ostream<wchar_t, char_traits<wchar_t> >& _STLP_CALL
8469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator<<(basic_ostream<wchar_t, char_traits<wchar_t> >&, const complex<double>&);
8479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_EXPORT_TEMPLATE basic_istream<wchar_t, char_traits<wchar_t> >& _STLP_CALL
8489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator>>(basic_istream<wchar_t, char_traits<wchar_t> >&, complex<float>&);
8499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_EXPORT_TEMPLATE basic_ostream<wchar_t, char_traits<wchar_t> >& _STLP_CALL
8509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator<<(basic_ostream<wchar_t, char_traits<wchar_t> >&, const complex<float>&);
8519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#    if !defined (_STLP_NO_LONG_DOUBLE)
8539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_EXPORT_TEMPLATE basic_istream<wchar_t, char_traits<wchar_t> >& _STLP_CALL
8549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator>>(basic_istream<wchar_t, char_traits<wchar_t> >&, complex<long double>&);
8559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_EXPORT_TEMPLATE basic_ostream<wchar_t, char_traits<wchar_t> >& _STLP_CALL
8569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator<<(basic_ostream<wchar_t, char_traits<wchar_t> >&, const complex<long double>&);
8579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#    endif
8589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
8599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
8609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Transcendental functions.  These are defined only for float,
8639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//  double, and long double.  (Sqrt isn't transcendental, of course,
8649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//  but it's included in this section anyway.)
8659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<float> _STLP_CALL sqrt(const complex<float>&);
8679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<float> _STLP_CALL exp(const complex<float>&);
8699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<float> _STLP_CALL  log(const complex<float>&);
8709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<float> _STLP_CALL log10(const complex<float>&);
8719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<float> _STLP_CALL pow(const complex<float>&, int);
8739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<float> _STLP_CALL pow(const complex<float>&, const float&);
8749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<float> _STLP_CALL pow(const float&, const complex<float>&);
8759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<float> _STLP_CALL pow(const complex<float>&, const complex<float>&);
8769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<float> _STLP_CALL sin(const complex<float>&);
8789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<float> _STLP_CALL cos(const complex<float>&);
8799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<float> _STLP_CALL tan(const complex<float>&);
8809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<float> _STLP_CALL sinh(const complex<float>&);
8829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<float> _STLP_CALL cosh(const complex<float>&);
8839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<float> _STLP_CALL tanh(const complex<float>&);
8849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<double> _STLP_CALL sqrt(const complex<double>&);
8869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<double> _STLP_CALL exp(const complex<double>&);
8889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<double> _STLP_CALL log(const complex<double>&);
8899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<double> _STLP_CALL log10(const complex<double>&);
8909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<double> _STLP_CALL pow(const complex<double>&, int);
8929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<double> _STLP_CALL pow(const complex<double>&, const double&);
8939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<double> _STLP_CALL pow(const double&, const complex<double>&);
8949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<double> _STLP_CALL pow(const complex<double>&, const complex<double>&);
8959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<double> _STLP_CALL sin(const complex<double>&);
8979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<double> _STLP_CALL cos(const complex<double>&);
8989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<double> _STLP_CALL tan(const complex<double>&);
8999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<double> _STLP_CALL sinh(const complex<double>&);
9019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<double> _STLP_CALL cosh(const complex<double>&);
9029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<double> _STLP_CALL tanh(const complex<double>&);
9039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_NO_LONG_DOUBLE)
9059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<long double> _STLP_CALL sqrt(const complex<long double>&);
9069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<long double> _STLP_CALL exp(const complex<long double>&);
9079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<long double> _STLP_CALL log(const complex<long double>&);
9089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<long double> _STLP_CALL log10(const complex<long double>&);
9099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<long double> _STLP_CALL pow(const complex<long double>&, int);
9119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<long double> _STLP_CALL pow(const complex<long double>&, const long double&);
9129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<long double> _STLP_CALL pow(const long double&, const complex<long double>&);
9139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<long double> _STLP_CALL pow(const complex<long double>&,
9149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                                   const complex<long double>&);
9159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<long double> _STLP_CALL sin(const complex<long double>&);
9179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<long double> _STLP_CALL cos(const complex<long double>&);
9189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<long double> _STLP_CALL tan(const complex<long double>&);
9199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<long double> _STLP_CALL sinh(const complex<long double>&);
9219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<long double> _STLP_CALL cosh(const complex<long double>&);
9229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC complex<long double> _STLP_CALL tanh(const complex<long double>&);
9239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
9249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE
9269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_LINK_TIME_INSTANTIATION
9289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_complex.c>
9299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
9309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
9329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Local Variables:
9349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// mode:C++
9359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// End:
936