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