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