epoc32/include/stdapis/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_h
williamr@4
    19
#define _STLP_internal_complex_h
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
#include <stl/_cmath.h>
williamr@4
    30
#include <iosfwd>
williamr@4
    31
williamr@4
    32
_STLP_BEGIN_NAMESPACE
williamr@4
    33
williamr@4
    34
#if !defined(_STLP_NO_COMPLEX_SPECIALIZATIONS)		//*TY 02/25/2000 - added for MPW compiler workaround
williamr@4
    35
williamr@4
    36
template <class _Tp> struct complex;
williamr@4
    37
williamr@4
    38
_STLP_TEMPLATE_NULL  struct _STLP_CLASS_DECLSPEC complex<float>;
williamr@4
    39
_STLP_TEMPLATE_NULL  struct _STLP_CLASS_DECLSPEC complex<double>;
williamr@4
    40
# ifndef _STLP_NO_LONG_DOUBLE
williamr@4
    41
_STLP_TEMPLATE_NULL  struct _STLP_CLASS_DECLSPEC complex<long double>;
williamr@4
    42
# endif
williamr@4
    43
# endif
williamr@4
    44
williamr@4
    45
template <class _Tp>
williamr@4
    46
struct complex {
williamr@4
    47
  typedef _Tp value_type;
williamr@4
    48
  typedef complex<_Tp> _Self;
williamr@4
    49
williamr@4
    50
  // Constructors, destructor, assignment operator.
williamr@4
    51
  complex() : _M_re(0), _M_im(0) {}
williamr@4
    52
  complex(const value_type& __x)
williamr@4
    53
    : _M_re(__x), _M_im(0) {}
williamr@4
    54
  complex(const value_type& __x, const value_type& __y)
williamr@4
    55
    : _M_re(__x), _M_im(__y) {}
williamr@4
    56
  complex(const _Self& __z)
williamr@4
    57
    : _M_re(__z._M_re), _M_im(__z._M_im) {}
williamr@4
    58
williamr@4
    59
  _Self& operator=(const _Self& __z) {
williamr@4
    60
    _M_re = __z._M_re;
williamr@4
    61
    _M_im = __z._M_im;
williamr@4
    62
    return *this;
williamr@4
    63
  }
williamr@4
    64
williamr@4
    65
#if defined (_STLP_MEMBER_TEMPLATES) && ( defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER) || defined(_STLP_NO_COMPLEX_SPECIALIZATIONS))
williamr@4
    66
  template <class _Tp2>
williamr@4
    67
  explicit complex(const complex<_Tp2>& __z)
williamr@4
    68
    : _M_re(__z._M_re), _M_im(__z._M_im) {}
williamr@4
    69
williamr@4
    70
  template <class _Tp2>
williamr@4
    71
  _Self& operator=(const complex<_Tp2>& __z) {
williamr@4
    72
    _M_re = __z._M_re;
williamr@4
    73
    _M_im = __z._M_im;
williamr@4
    74
    return *this;
williamr@4
    75
  }
williamr@4
    76
#endif /* _STLP_MEMBER_TEMPLATES */
williamr@4
    77
williamr@4
    78
  // Element access.
williamr@4
    79
  value_type real() const { return _M_re; }
williamr@4
    80
  value_type imag() const { return _M_im; }
williamr@4
    81
williamr@4
    82
  // Arithmetic op= operations involving one real argument.
williamr@4
    83
williamr@4
    84
  _Self& operator= (const value_type& __x) {
williamr@4
    85
    _M_re = __x;
williamr@4
    86
    _M_im = 0;
williamr@4
    87
    return *this;
williamr@4
    88
  }
williamr@4
    89
  _Self& operator+= (const value_type& __x) {
williamr@4
    90
    _M_re += __x;
williamr@4
    91
    return *this;
williamr@4
    92
  }
williamr@4
    93
  _Self& operator-= (const value_type& __x) {
williamr@4
    94
    _M_re -= __x;
williamr@4
    95
    return *this;
williamr@4
    96
  }
williamr@4
    97
  _Self& operator*= (const value_type& __x) {
williamr@4
    98
    _M_re *= __x;
williamr@4
    99
    _M_im *= __x;
williamr@4
   100
    return *this;
williamr@4
   101
  }
williamr@4
   102
  _Self& operator/= (const value_type& __x) {
williamr@4
   103
    _M_re /= __x;
williamr@4
   104
    _M_im /= __x;
williamr@4
   105
    return *this;
williamr@4
   106
  }
williamr@4
   107
williamr@4
   108
  // Arithmetic op= operations involving two complex arguments.
williamr@4
   109
williamr@4
   110
  static void  _STLP_CALL _div(const value_type& __z1_r, const value_type& __z1_i,
williamr@4
   111
                   const value_type& __z2_r, const value_type& __z2_i,
williamr@4
   112
                   value_type& __res_r, value_type& __res_i);
williamr@4
   113
williamr@4
   114
  static void _STLP_CALL _div(const value_type& __z1_r, 
williamr@4
   115
                   const value_type& __z2_r, const value_type& __z2_i,
williamr@4
   116
                   value_type& __res_r, value_type& __res_i);
williamr@4
   117
williamr@4
   118
#if defined ( _STLP_MEMBER_TEMPLATES ) // && defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
williamr@4
   119
williamr@4
   120
  template <class _Tp2> _Self& operator+= (const complex<_Tp2>& __z) {
williamr@4
   121
    _M_re += __z._M_re;
williamr@4
   122
    _M_im += __z._M_im;
williamr@4
   123
    return *this;
williamr@4
   124
  }
williamr@4
   125
williamr@4
   126
  template <class _Tp2> _Self& operator-= (const complex<_Tp2>& __z) {
williamr@4
   127
    _M_re -= __z._M_re;
williamr@4
   128
    _M_im -= __z._M_im;
williamr@4
   129
    return *this;
williamr@4
   130
  }
williamr@4
   131
williamr@4
   132
  template <class _Tp2> _Self& operator*= (const complex<_Tp2>& __z) {
williamr@4
   133
    value_type __r = _M_re * __z._M_re - _M_im * __z._M_im;
williamr@4
   134
    value_type __i = _M_re * __z._M_im + _M_im * __z._M_re;
williamr@4
   135
    _M_re = __r;
williamr@4
   136
    _M_im = __i;
williamr@4
   137
    return *this;
williamr@4
   138
  }
williamr@4
   139
williamr@4
   140
  template <class _Tp2> _Self& operator/= (const complex<_Tp2>& __z) {
williamr@4
   141
    value_type __r;
williamr@4
   142
    value_type __i;
williamr@4
   143
    _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
williamr@4
   144
    _M_re = __r;
williamr@4
   145
    _M_im = __i;
williamr@4
   146
    return *this;
williamr@4
   147
  }
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
williamr@4
   192
_STLP_TEMPLATE_NULL
williamr@4
   193
struct _STLP_CLASS_DECLSPEC complex<float> {
williamr@4
   194
  typedef float value_type;
williamr@4
   195
  typedef complex<float> _Self;
williamr@4
   196
  // Constructors, destructor, assignment operator.
williamr@4
   197
williamr@4
   198
  complex(value_type __x = 0.0, value_type __y = 0.0)
williamr@4
   199
    : _M_re(__x), _M_im(__y) {}
williamr@4
   200
williamr@4
   201
  complex(const complex<float>& __z)    : _M_re(__z._M_re), _M_im(__z._M_im) {} 
williamr@4
   202
williamr@4
   203
  inline explicit complex(const complex<double>& __z);
williamr@4
   204
# ifndef _STLP_NO_LONG_DOUBLE
williamr@4
   205
  inline explicit complex(const complex<long double>& __z);
williamr@4
   206
# endif
williamr@4
   207
  // Element access.
williamr@4
   208
  value_type real() const { return _M_re; }
williamr@4
   209
  value_type imag() const { return _M_im; }
williamr@4
   210
williamr@4
   211
  // Arithmetic op= operations involving one real argument.
williamr@4
   212
williamr@4
   213
  _Self& operator= (value_type __x) {
williamr@4
   214
    _M_re = __x;
williamr@4
   215
    _M_im = 0;
williamr@4
   216
    return *this;
williamr@4
   217
  }
williamr@4
   218
  _Self& operator+= (value_type __x) {
williamr@4
   219
    _M_re += __x;
williamr@4
   220
    return *this;
williamr@4
   221
  }
williamr@4
   222
  _Self& operator-= (value_type __x) {
williamr@4
   223
    _M_re -= __x;
williamr@4
   224
    return *this;
williamr@4
   225
  }
williamr@4
   226
  _Self& operator*= (value_type __x) {
williamr@4
   227
    _M_re *= __x;
williamr@4
   228
    _M_im *= __x;
williamr@4
   229
    return *this;
williamr@4
   230
  }
williamr@4
   231
  _Self& operator/= (value_type __x) {
williamr@4
   232
    _M_re /= __x;
williamr@4
   233
    _M_im /= __x;
williamr@4
   234
    return *this;
williamr@4
   235
  }
williamr@4
   236
williamr@4
   237
  // Arithmetic op= operations involving two complex arguments.
williamr@4
   238
williamr@4
   239
   _STLP_DECLSPEC static void _STLP_CALL _div(const float& __z1_r, const float& __z1_i,
williamr@4
   240
                              const float& __z2_r, const float& __z2_i,
williamr@4
   241
                              float& __res_r, float& __res_i);
williamr@4
   242
    
williamr@4
   243
   _STLP_DECLSPEC static void _STLP_CALL _div(const float& __z1_r, 
williamr@4
   244
                              const float& __z2_r, const float& __z2_i,
williamr@4
   245
                              float& __res_r, float& __res_i);
williamr@4
   246
    
williamr@4
   247
#if defined (_STLP_MEMBER_TEMPLATES)
williamr@4
   248
williamr@4
   249
  template <class _Tp2>
williamr@4
   250
  complex<float>& operator=(const complex<_Tp2>& __z) {
williamr@4
   251
    _M_re = __z._M_re;
williamr@4
   252
    _M_im = __z._M_im;
williamr@4
   253
    return *this;
williamr@4
   254
  }
williamr@4
   255
williamr@4
   256
  template <class _Tp2>
williamr@4
   257
  complex<float>& operator+= (const complex<_Tp2>& __z) {
williamr@4
   258
    _M_re += __z._M_re;
williamr@4
   259
    _M_im += __z._M_im;
williamr@4
   260
    return *this;
williamr@4
   261
  }
williamr@4
   262
williamr@4
   263
  template <class _Tp2>
williamr@4
   264
  complex<float>& operator-= (const complex<_Tp2>& __z) {
williamr@4
   265
    _M_re -= __z._M_re;
williamr@4
   266
    _M_im -= __z._M_im;
williamr@4
   267
    return *this;
williamr@4
   268
  }
williamr@4
   269
williamr@4
   270
  template <class _Tp2>
williamr@4
   271
  complex<float>& operator*= (const complex<_Tp2>& __z) {
williamr@4
   272
    float __r = _M_re * __z._M_re - _M_im * __z._M_im;
williamr@4
   273
    float __i = _M_re * __z._M_im + _M_im * __z._M_re;
williamr@4
   274
    _M_re = __r;
williamr@4
   275
    _M_im = __i;
williamr@4
   276
    return *this;
williamr@4
   277
  }
williamr@4
   278
williamr@4
   279
  template <class _Tp2>
williamr@4
   280
  complex<float>& operator/= (const complex<_Tp2>& __z) {
williamr@4
   281
    float __r;
williamr@4
   282
    float __i;
williamr@4
   283
    _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
williamr@4
   284
    _M_re = __r;
williamr@4
   285
    _M_im = __i;
williamr@4
   286
    return *this;
williamr@4
   287
  }
williamr@4
   288
williamr@4
   289
#endif /* _STLP_MEMBER_TEMPLATES */
williamr@4
   290
williamr@4
   291
  _Self& operator=(const _Self& __z) {
williamr@4
   292
    _M_re = __z._M_re;
williamr@4
   293
    _M_im = __z._M_im;
williamr@4
   294
    return *this;
williamr@4
   295
  }
williamr@4
   296
williamr@4
   297
  _Self& operator+= (const _Self& __z) {
williamr@4
   298
    _M_re += __z._M_re;
williamr@4
   299
    _M_im += __z._M_im;
williamr@4
   300
    return *this;
williamr@4
   301
  }
williamr@4
   302
williamr@4
   303
  _Self& operator-= (const _Self& __z) {
williamr@4
   304
    _M_re -= __z._M_re;
williamr@4
   305
    _M_im -= __z._M_im;
williamr@4
   306
    return *this;
williamr@4
   307
  }
williamr@4
   308
  
williamr@4
   309
  _Self& operator*= (const _Self& __z) {
williamr@4
   310
    value_type __r = _M_re * __z._M_re - _M_im * __z._M_im;
williamr@4
   311
    value_type __i = _M_re * __z._M_im + _M_im * __z._M_re;
williamr@4
   312
    _M_re = __r;
williamr@4
   313
    _M_im = __i;
williamr@4
   314
    return *this;
williamr@4
   315
  }
williamr@4
   316
williamr@4
   317
  _Self& operator/= (const _Self& __z) {
williamr@4
   318
    value_type __r;
williamr@4
   319
    value_type __i;
williamr@4
   320
    _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
williamr@4
   321
    _M_re = __r;
williamr@4
   322
    _M_im = __i;
williamr@4
   323
    return *this;
williamr@4
   324
  }
williamr@4
   325
williamr@4
   326
  // Data members.
williamr@4
   327
  value_type _M_re;
williamr@4
   328
  value_type _M_im;
williamr@4
   329
};
williamr@4
   330
williamr@4
   331
_STLP_TEMPLATE_NULL struct _STLP_CLASS_DECLSPEC complex<double> {
williamr@4
   332
  typedef double value_type;
williamr@4
   333
  typedef complex<double> _Self;
williamr@4
   334
williamr@4
   335
  // Constructors, destructor, assignment operator.
williamr@4
   336
williamr@4
   337
  complex(value_type __x = 0.0, value_type __y = 0.0)
williamr@4
   338
    : _M_re(__x), _M_im(__y) {}
williamr@4
   339
williamr@4
   340
  complex(const complex<double>& __z)
williamr@4
   341
    : _M_re(__z._M_re), _M_im(__z._M_im) {}
williamr@4
   342
  inline complex(const complex<float>& __z);
williamr@4
   343
# ifndef _STLP_NO_LONG_DOUBLE
williamr@4
   344
  explicit inline complex(const complex<long double>& __z);
williamr@4
   345
# endif
williamr@4
   346
  // Element access.
williamr@4
   347
  value_type real() const { return _M_re; }
williamr@4
   348
  value_type imag() const { return _M_im; }
williamr@4
   349
williamr@4
   350
  // Arithmetic op= operations involving one real argument.
williamr@4
   351
williamr@4
   352
  _Self& operator= (value_type __x) {
williamr@4
   353
    _M_re = __x;
williamr@4
   354
    _M_im = 0;
williamr@4
   355
    return *this;
williamr@4
   356
  }
williamr@4
   357
  _Self& operator+= (value_type __x) {
williamr@4
   358
    _M_re += __x;
williamr@4
   359
    return *this;
williamr@4
   360
  }
williamr@4
   361
  _Self& operator-= (value_type __x) {
williamr@4
   362
    _M_re -= __x;
williamr@4
   363
    return *this;
williamr@4
   364
  }
williamr@4
   365
  _Self& operator*= (value_type __x) {
williamr@4
   366
    _M_re *= __x;
williamr@4
   367
    _M_im *= __x;
williamr@4
   368
    return *this;
williamr@4
   369
  }
williamr@4
   370
  _Self& operator/= (value_type __x) {
williamr@4
   371
    _M_re /= __x;
williamr@4
   372
    _M_im /= __x;
williamr@4
   373
    return *this;
williamr@4
   374
  }
williamr@4
   375
williamr@4
   376
  // Arithmetic op= operations involving two complex arguments.
williamr@4
   377
williamr@4
   378
  _STLP_DECLSPEC static void _STLP_CALL _div(const double& __z1_r, const double& __z1_i,
williamr@4
   379
                              const double& __z2_r, const double& __z2_i,
williamr@4
   380
                              double& __res_r, double& __res_i);
williamr@4
   381
  _STLP_DECLSPEC static void _STLP_CALL _div(const double& __z1_r, 
williamr@4
   382
                              const double& __z2_r, const double& __z2_i,
williamr@4
   383
                              double& __res_r, double& __res_i);
williamr@4
   384
    
williamr@4
   385
#if defined (_STLP_MEMBER_TEMPLATES) && defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
williamr@4
   386
williamr@4
   387
  template <class _Tp2>
williamr@4
   388
  complex<double>& operator=(const complex<_Tp2>& __z) {
williamr@4
   389
    _M_re = __z._M_re;
williamr@4
   390
    _M_im = __z._M_im;
williamr@4
   391
    return *this;
williamr@4
   392
  }
williamr@4
   393
williamr@4
   394
  template <class _Tp2>
williamr@4
   395
  complex<double>& operator+= (const complex<_Tp2>& __z) {
williamr@4
   396
    _M_re += __z._M_re;
williamr@4
   397
    _M_im += __z._M_im;
williamr@4
   398
    return *this;
williamr@4
   399
  }
williamr@4
   400
williamr@4
   401
  template <class _Tp2>
williamr@4
   402
  complex<double>& operator-= (const complex<_Tp2>& __z) {
williamr@4
   403
    _M_re -= __z._M_re;
williamr@4
   404
    _M_im -= __z._M_im;
williamr@4
   405
    return *this;
williamr@4
   406
  }
williamr@4
   407
williamr@4
   408
  template <class _Tp2>
williamr@4
   409
  complex<double>& operator*= (const complex<_Tp2>& __z) {
williamr@4
   410
    double __r = _M_re * __z._M_re - _M_im * __z._M_im;
williamr@4
   411
    double __i = _M_re * __z._M_im + _M_im * __z._M_re;
williamr@4
   412
    _M_re = __r;
williamr@4
   413
    _M_im = __i;
williamr@4
   414
    return *this;
williamr@4
   415
  }
williamr@4
   416
williamr@4
   417
  template <class _Tp2>
williamr@4
   418
  complex<double>& operator/= (const complex<_Tp2>& __z) {
williamr@4
   419
    double __r;
williamr@4
   420
    double __i;
williamr@4
   421
    _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
williamr@4
   422
    _M_re = __r;
williamr@4
   423
    _M_im = __i;
williamr@4
   424
    return *this;
williamr@4
   425
  }
williamr@4
   426
williamr@4
   427
#endif /* _STLP_MEMBER_TEMPLATES */
williamr@4
   428
williamr@4
   429
  _Self& operator=(const _Self& __z) {
williamr@4
   430
    _M_re = __z._M_re;
williamr@4
   431
    _M_im = __z._M_im;
williamr@4
   432
    return *this;
williamr@4
   433
  }
williamr@4
   434
williamr@4
   435
  _Self& operator+= (const _Self& __z) {
williamr@4
   436
    _M_re += __z._M_re;
williamr@4
   437
    _M_im += __z._M_im;
williamr@4
   438
    return *this;
williamr@4
   439
  }
williamr@4
   440
williamr@4
   441
  _Self& operator-= (const _Self& __z) {
williamr@4
   442
    _M_re -= __z._M_re;
williamr@4
   443
    _M_im -= __z._M_im;
williamr@4
   444
    return *this;
williamr@4
   445
  }
williamr@4
   446
  
williamr@4
   447
  _Self& operator*= (const _Self& __z) {
williamr@4
   448
    value_type __r = _M_re * __z._M_re - _M_im * __z._M_im;
williamr@4
   449
    value_type __i = _M_re * __z._M_im + _M_im * __z._M_re;
williamr@4
   450
    _M_re = __r;
williamr@4
   451
    _M_im = __i;
williamr@4
   452
    return *this;
williamr@4
   453
  }
williamr@4
   454
williamr@4
   455
  _Self& operator/= (const _Self& __z) {
williamr@4
   456
    value_type __r;
williamr@4
   457
    value_type __i;
williamr@4
   458
    _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
williamr@4
   459
    _M_re = __r;
williamr@4
   460
    _M_im = __i;
williamr@4
   461
    return *this;
williamr@4
   462
  }
williamr@4
   463
williamr@4
   464
  // Data members.
williamr@4
   465
  value_type _M_re;
williamr@4
   466
  value_type _M_im;
williamr@4
   467
};
williamr@4
   468
williamr@4
   469
# ifndef _STLP_NO_LONG_DOUBLE
williamr@4
   470
williamr@4
   471
_STLP_TEMPLATE_NULL struct _STLP_CLASS_DECLSPEC complex<long double> {
williamr@4
   472
  typedef long double value_type;
williamr@4
   473
  typedef complex<long double> _Self;
williamr@4
   474
williamr@4
   475
  // Constructors, destructor, assignment operator.
williamr@4
   476
  complex(value_type __x = 0.0, value_type __y = 0.0)
williamr@4
   477
    : _M_re(__x), _M_im(__y) {}
williamr@4
   478
williamr@4
   479
  complex(const complex<long double>& __z)
williamr@4
   480
    : _M_re(__z._M_re), _M_im(__z._M_im) {}
williamr@4
   481
  inline complex(const complex<float>& __z);
williamr@4
   482
  inline complex(const complex<double>& __z);
williamr@4
   483
williamr@4
   484
  // Element access.
williamr@4
   485
  value_type real() const { return _M_re; }
williamr@4
   486
  value_type imag() const { return _M_im; }
williamr@4
   487
williamr@4
   488
  // Arithmetic op= operations involving one real argument.
williamr@4
   489
williamr@4
   490
  _Self& operator= (value_type __x) {
williamr@4
   491
    _M_re = __x;
williamr@4
   492
    _M_im = 0;
williamr@4
   493
    return *this;
williamr@4
   494
  }
williamr@4
   495
  _Self& operator+= (value_type __x) {
williamr@4
   496
    _M_re += __x;
williamr@4
   497
    return *this;
williamr@4
   498
  }
williamr@4
   499
  _Self& operator-= (value_type __x) {
williamr@4
   500
    _M_re -= __x;
williamr@4
   501
    return *this;
williamr@4
   502
  }
williamr@4
   503
  _Self& operator*= (value_type __x) {
williamr@4
   504
    _M_re *= __x;
williamr@4
   505
    _M_im *= __x;
williamr@4
   506
    return *this;
williamr@4
   507
  }
williamr@4
   508
  _Self& operator/= (value_type __x) {
williamr@4
   509
    _M_re /= __x;
williamr@4
   510
    _M_im /= __x;
williamr@4
   511
    return *this;
williamr@4
   512
  }
williamr@4
   513
williamr@4
   514
  // Arithmetic op= operations involving two complex arguments.
williamr@4
   515
williamr@4
   516
  _STLP_DECLSPEC static void _STLP_CALL _div(const long double& __z1_r, const long double& __z1_i,
williamr@4
   517
                              const long double& __z2_r, const long double& __z2_i,
williamr@4
   518
                              long double& __res_r, long double& __res_i);
williamr@4
   519
williamr@4
   520
  _STLP_DECLSPEC static void _STLP_CALL _div(const long double& __z1_r, 
williamr@4
   521
                              const long double& __z2_r, const long double& __z2_i,
williamr@4
   522
                              long double& __res_r, long double& __res_i);
williamr@4
   523
williamr@4
   524
#if defined (_STLP_MEMBER_TEMPLATES) && defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
williamr@4
   525
williamr@4
   526
  template <class _Tp2>
williamr@4
   527
  complex<long double>& operator=(const complex<_Tp2>& __z) {
williamr@4
   528
    _M_re = __z._M_re;
williamr@4
   529
    _M_im = __z._M_im;
williamr@4
   530
    return *this;
williamr@4
   531
  }
williamr@4
   532
williamr@4
   533
  template <class _Tp2>
williamr@4
   534
  complex<long double>& operator+= (const complex<_Tp2>& __z) {
williamr@4
   535
    _M_re += __z._M_re;
williamr@4
   536
    _M_im += __z._M_im;
williamr@4
   537
    return *this;
williamr@4
   538
  }
williamr@4
   539
williamr@4
   540
  template <class _Tp2>
williamr@4
   541
  complex<long double>& operator-= (const complex<_Tp2>& __z) {
williamr@4
   542
    _M_re -= __z._M_re;
williamr@4
   543
    _M_im -= __z._M_im;
williamr@4
   544
    return *this;
williamr@4
   545
  }
williamr@4
   546
williamr@4
   547
  template <class _Tp2>
williamr@4
   548
  complex<long double>& operator*= (const complex<_Tp2>& __z) {
williamr@4
   549
    long double __r = _M_re * __z._M_re - _M_im * __z._M_im;
williamr@4
   550
    long double __i = _M_re * __z._M_im + _M_im * __z._M_re;
williamr@4
   551
    _M_re = __r;
williamr@4
   552
    _M_im = __i;
williamr@4
   553
    return *this;
williamr@4
   554
  }
williamr@4
   555
williamr@4
   556
  template <class _Tp2>
williamr@4
   557
  complex<long double>& operator/= (const complex<_Tp2>& __z) {
williamr@4
   558
    long double __r;
williamr@4
   559
    long double __i;
williamr@4
   560
    _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
williamr@4
   561
    _M_re = __r;
williamr@4
   562
    _M_im = __i;
williamr@4
   563
    return *this;
williamr@4
   564
  }
williamr@4
   565
williamr@4
   566
#endif /* _STLP_MEMBER_TEMPLATES */
williamr@4
   567
williamr@4
   568
  _Self& operator=(const _Self& __z) {
williamr@4
   569
    _M_re = __z._M_re;
williamr@4
   570
    _M_im = __z._M_im;
williamr@4
   571
    return *this;
williamr@4
   572
  }
williamr@4
   573
williamr@4
   574
  _Self& operator+= (const _Self& __z) {
williamr@4
   575
    _M_re += __z._M_re;
williamr@4
   576
    _M_im += __z._M_im;
williamr@4
   577
    return *this;
williamr@4
   578
  }
williamr@4
   579
williamr@4
   580
  _Self& operator-= (const _Self& __z) {
williamr@4
   581
    _M_re -= __z._M_re;
williamr@4
   582
    _M_im -= __z._M_im;
williamr@4
   583
    return *this;
williamr@4
   584
  }
williamr@4
   585
  
williamr@4
   586
  _Self& operator*= (const _Self& __z) {
williamr@4
   587
    value_type __r = _M_re * __z._M_re - _M_im * __z._M_im;
williamr@4
   588
    value_type __i = _M_re * __z._M_im + _M_im * __z._M_re;
williamr@4
   589
    _M_re = __r;
williamr@4
   590
    _M_im = __i;
williamr@4
   591
    return *this;
williamr@4
   592
  }
williamr@4
   593
williamr@4
   594
  _Self& operator/= (const _Self& __z) {
williamr@4
   595
    value_type __r;
williamr@4
   596
    value_type __i;
williamr@4
   597
    _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
williamr@4
   598
    _M_re = __r;
williamr@4
   599
    _M_im = __i;
williamr@4
   600
    return *this;
williamr@4
   601
  }
williamr@4
   602
williamr@4
   603
  // Data members.
williamr@4
   604
  value_type _M_re;
williamr@4
   605
  value_type _M_im;
williamr@4
   606
};
williamr@4
   607
williamr@4
   608
# endif /* _STLP_NO_LONG_DOUBLE */
williamr@4
   609
williamr@4
   610
// Converting constructors from one of these three specialized types
williamr@4
   611
// to another.
williamr@4
   612
williamr@4
   613
inline complex<float>::complex(const complex<double>& __z)
williamr@4
   614
  : _M_re(__z._M_re), _M_im(__z._M_im) {}
williamr@4
   615
inline complex<double>::complex(const complex<float>& __z)
williamr@4
   616
  : _M_re(__z._M_re), _M_im(__z._M_im) {}
williamr@4
   617
# ifndef _STLP_NO_LONG_DOUBLE
williamr@4
   618
inline complex<float>::complex(const complex<long double>& __z)
williamr@4
   619
  : _M_re(__z._M_re), _M_im(__z._M_im) {}
williamr@4
   620
inline complex<double>::complex(const complex<long double>& __z)
williamr@4
   621
  : _M_re(__z._M_re), _M_im(__z._M_im) {}
williamr@4
   622
inline complex<long double>::complex(const complex<float>& __z)
williamr@4
   623
  : _M_re(__z._M_re), _M_im(__z._M_im) {}
williamr@4
   624
inline complex<long double>::complex(const complex<double>& __z)
williamr@4
   625
  : _M_re(__z._M_re), _M_im(__z._M_im) {}
williamr@4
   626
# endif
williamr@4
   627
williamr@4
   628
# endif /* SPECIALIZATIONS */
williamr@4
   629
williamr@4
   630
// Unary non-member arithmetic operators.
williamr@4
   631
williamr@4
   632
template <class _Tp>
williamr@4
   633
inline complex<_Tp> _STLP_CALL operator+(const complex<_Tp>& __z) {
williamr@4
   634
  return __z;
williamr@4
   635
}
williamr@4
   636
williamr@4
   637
template <class _Tp>
williamr@4
   638
inline complex<_Tp> _STLP_CALL  operator-(const complex<_Tp>& __z) {
williamr@4
   639
  return complex<_Tp>(-__z._M_re, -__z._M_im);
williamr@4
   640
}
williamr@4
   641
williamr@4
   642
// Non-member arithmetic operations involving one real argument.
williamr@4
   643
williamr@4
   644
template <class _Tp> 
williamr@4
   645
inline complex<_Tp> _STLP_CALL operator+(const _Tp& __x, const complex<_Tp>& __z) {
williamr@4
   646
  return complex<_Tp>(__x + __z._M_re, __z._M_im);
williamr@4
   647
}
williamr@4
   648
williamr@4
   649
template <class _Tp> 
williamr@4
   650
inline complex<_Tp> _STLP_CALL operator+(const complex<_Tp>& __z, const _Tp& __x) {
williamr@4
   651
  return complex<_Tp>(__z._M_re + __x, __z._M_im);
williamr@4
   652
}
williamr@4
   653
williamr@4
   654
template <class _Tp> 
williamr@4
   655
inline complex<_Tp> _STLP_CALL operator-(const _Tp& __x, const complex<_Tp>& __z) {
williamr@4
   656
  return complex<_Tp>(__x - __z._M_re, -__z._M_im);
williamr@4
   657
}
williamr@4
   658
williamr@4
   659
template <class _Tp> 
williamr@4
   660
inline complex<_Tp> _STLP_CALL operator-(const complex<_Tp>& __z, const _Tp& __x) {
williamr@4
   661
  return complex<_Tp>(__z._M_re - __x, __z._M_im);
williamr@4
   662
}
williamr@4
   663
williamr@4
   664
template <class _Tp> 
williamr@4
   665
inline complex<_Tp> _STLP_CALL operator*(const _Tp& __x, const complex<_Tp>& __z) {
williamr@4
   666
  return complex<_Tp>(__x * __z._M_re, __x * __z._M_im);
williamr@4
   667
}
williamr@4
   668
williamr@4
   669
template <class _Tp> 
williamr@4
   670
inline complex<_Tp> _STLP_CALL operator*(const complex<_Tp>& __z, const _Tp& __x) {
williamr@4
   671
  return complex<_Tp>(__z._M_re * __x, __z._M_im * __x);
williamr@4
   672
}
williamr@4
   673
williamr@4
   674
template <class _Tp> 
williamr@4
   675
inline complex<_Tp> _STLP_CALL operator/(const _Tp& __x, const complex<_Tp>& __z) {
williamr@4
   676
  complex<_Tp> __result;
williamr@4
   677
  complex<_Tp>::_div(__x,
williamr@4
   678
                     __z._M_re, __z._M_im,
williamr@4
   679
                     __result._M_re, __result._M_im);
williamr@4
   680
  return __result;
williamr@4
   681
}
williamr@4
   682
williamr@4
   683
template <class _Tp> 
williamr@4
   684
inline complex<_Tp> _STLP_CALL operator/(const complex<_Tp>& __z, const _Tp& __x) {
williamr@4
   685
  return complex<_Tp>(__z._M_re / __x, __z._M_im / __x);
williamr@4
   686
}
williamr@4
   687
williamr@4
   688
// Non-member arithmetic operations involving two complex arguments
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
}
williamr@4
   695
williamr@4
   696
template <class _Tp> 
williamr@4
   697
inline complex<_Tp> _STLP_CALL 
williamr@4
   698
operator-(const complex<_Tp>& __z1, const complex<_Tp>& __z2) {
williamr@4
   699
  return complex<_Tp>(__z1._M_re - __z2._M_re, __z1._M_im - __z2._M_im);
williamr@4
   700
}
williamr@4
   701
williamr@4
   702
template <class _Tp> 
williamr@4
   703
inline complex<_Tp> _STLP_CALL 
williamr@4
   704
operator*(const complex<_Tp>& __z1, const complex<_Tp>& __z2) {
williamr@4
   705
  return complex<_Tp>(__z1._M_re * __z2._M_re - __z1._M_im * __z2._M_im,
williamr@4
   706
                      __z1._M_re * __z2._M_im + __z1._M_im * __z2._M_re);
williamr@4
   707
}
williamr@4
   708
williamr@4
   709
template <class _Tp> 
williamr@4
   710
inline complex<_Tp> _STLP_CALL 
williamr@4
   711
operator/(const complex<_Tp>& __z1, const complex<_Tp>& __z2) {
williamr@4
   712
  complex<_Tp> __result;
williamr@4
   713
  complex<_Tp>::_div(__z1._M_re, __z1._M_im,
williamr@4
   714
                     __z2._M_re, __z2._M_im,
williamr@4
   715
                     __result._M_re, __result._M_im);
williamr@4
   716
  return __result;
williamr@4
   717
}
williamr@4
   718
williamr@4
   719
// Comparison operators.
williamr@4
   720
williamr@4
   721
template <class _Tp> 
williamr@4
   722
inline bool _STLP_CALL operator==(const complex<_Tp>& __z1, const complex<_Tp>& __z2) {
williamr@4
   723
  return __z1._M_re == __z2._M_re && __z1._M_im == __z2._M_im;
williamr@4
   724
}
williamr@4
   725
williamr@4
   726
template <class _Tp> 
williamr@4
   727
inline bool _STLP_CALL operator==(const complex<_Tp>& __z, const _Tp& __x) {
williamr@4
   728
  return __z._M_re == __x && __z._M_im == 0;
williamr@4
   729
}
williamr@4
   730
williamr@4
   731
template <class _Tp> 
williamr@4
   732
inline bool _STLP_CALL operator==(const _Tp& __x, const complex<_Tp>& __z) {
williamr@4
   733
  return __x == __z._M_re && 0 == __z._M_im;
williamr@4
   734
}
williamr@4
   735
williamr@4
   736
#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
williamr@4
   737
williamr@4
   738
template <class _Tp> 
williamr@4
   739
inline bool _STLP_CALL operator!=(const complex<_Tp>& __z1, const complex<_Tp>& __z2) {
williamr@4
   740
  return __z1._M_re != __z2._M_re || __z1._M_im != __z2._M_im;
williamr@4
   741
}
williamr@4
   742
williamr@4
   743
#endif /* _STLP_FUNCTION_TMPL_PARTIAL_ORDER */
williamr@4
   744
williamr@4
   745
template <class _Tp> 
williamr@4
   746
inline bool _STLP_CALL operator!=(const complex<_Tp>& __z, const _Tp& __x) {
williamr@4
   747
  return __z._M_re != __x || __z._M_im != 0;
williamr@4
   748
}
williamr@4
   749
williamr@4
   750
template <class _Tp> 
williamr@4
   751
inline bool _STLP_CALL operator!=(const _Tp& __x, const complex<_Tp>& __z) {
williamr@4
   752
  return __x != __z._M_re || 0 != __z._M_im;
williamr@4
   753
}
williamr@4
   754
williamr@4
   755
// Other basic arithmetic operations
williamr@4
   756
williamr@4
   757
template <class _Tp> 
williamr@4
   758
inline _Tp _STLP_CALL real(const complex<_Tp>& __z) {
williamr@4
   759
  return __z._M_re;
williamr@4
   760
}
williamr@4
   761
williamr@4
   762
template <class _Tp> 
williamr@4
   763
inline _Tp _STLP_CALL imag(const complex<_Tp>& __z) {
williamr@4
   764
  return __z._M_im;
williamr@4
   765
}
williamr@4
   766
williamr@4
   767
#ifdef __SYMBIAN32__
williamr@4
   768
template <class _Tp>
williamr@4
   769
#ifdef __WINSCW__
williamr@4
   770
_STLP_DECLSPEC 
williamr@4
   771
#endif
williamr@4
   772
_Tp  _STLP_CALL abs_tp(const complex<_Tp>&);
williamr@4
   773
williamr@4
   774
template <class _Tp>
williamr@4
   775
#ifdef __WINSCW__
williamr@4
   776
_STLP_DECLSPEC 
williamr@4
   777
#endif
williamr@4
   778
_Tp  _STLP_CALL arg_tp(const complex<_Tp>&);
williamr@4
   779
williamr@4
   780
template <class _Tp>
williamr@4
   781
#ifdef __WINSCW__
williamr@4
   782
_STLP_DECLSPEC 
williamr@4
   783
#endif
williamr@4
   784
complex<_Tp> _STLP_CALL polar_tp(const _Tp& __rho, const _Tp& __phi);
williamr@4
   785
williamr@4
   786
template <class _Tp>
williamr@4
   787
_Tp _STLP_CALL abs(const complex<_Tp>& __z)
williamr@4
   788
 {
williamr@4
   789
 return abs_tp(__z);
williamr@4
   790
 }
williamr@4
   791
williamr@4
   792
template <class _Tp>
williamr@4
   793
_Tp _STLP_CALL arg(const complex<_Tp>& __z)
williamr@4
   794
 {
williamr@4
   795
 return arg_tp(__z);
williamr@4
   796
 }
williamr@4
   797
williamr@4
   798
template <class _Tp>
williamr@4
   799
complex<_Tp> _STLP_CALL polar(const _Tp& __rho, const _Tp& __phi) {
williamr@4
   800
 return polar_tp(__rho, __phi);
williamr@4
   801
}
williamr@4
   802
williamr@4
   803
#else
williamr@4
   804
template <class _Tp>
williamr@4
   805
_Tp _STLP_CALL abs(const complex<_Tp>& __z) {
williamr@4
   806
  return _Tp(abs(complex<double>(double(__z.real()), double(__z.imag()))));
williamr@4
   807
}
williamr@4
   808
williamr@4
   809
template <class _Tp>
williamr@4
   810
_Tp _STLP_CALL arg(const complex<_Tp>& __z) {
williamr@4
   811
  return _Tp(arg(complex<double>(double(__z.real()), double(__z.imag()))));
williamr@4
   812
}
williamr@4
   813
williamr@4
   814
#endif
williamr@4
   815
williamr@4
   816
williamr@4
   817
template <class _Tp>
williamr@4
   818
inline _Tp _STLP_CALL norm(const complex<_Tp>& __z) {
williamr@4
   819
  return __z._M_re * __z._M_re + __z._M_im * __z._M_im;
williamr@4
   820
}
williamr@4
   821
williamr@4
   822
template <class _Tp>
williamr@4
   823
inline complex<_Tp> _STLP_CALL conj(const complex<_Tp>& __z) {
williamr@4
   824
  return complex<_Tp>(__z._M_re, -__z._M_im);
williamr@4
   825
}
williamr@4
   826
williamr@4
   827
template <class _Tp>
williamr@4
   828
complex<_Tp> _STLP_CALL polar(const _Tp& __rho) {
williamr@4
   829
  return complex<_Tp>(__rho, 0);
williamr@4
   830
}
williamr@4
   831
williamr@4
   832
#ifndef __SYMBIAN32__
williamr@4
   833
template <class _Tp>
williamr@4
   834
complex<_Tp> _STLP_CALL polar(const _Tp& __rho, const _Tp& __phi) {
williamr@4
   835
  complex<double> __tmp = polar(double(__rho), double(__phi));
williamr@4
   836
  return complex<_Tp>(_Tp(__tmp.real()), _Tp(__tmp.imag()));
williamr@4
   837
}
williamr@4
   838
williamr@4
   839
williamr@4
   840
_STLP_TEMPLATE_NULL
williamr@4
   841
_STLP_DECLSPEC float  _STLP_CALL abs(const complex<float>&);
williamr@4
   842
#ifndef _STLP_COMPLEX_SPECIALIZATION_BUG
williamr@4
   843
_STLP_TEMPLATE_NULL
williamr@4
   844
_STLP_DECLSPEC double  _STLP_CALL abs(const complex<double>&);
williamr@4
   845
_STLP_TEMPLATE_NULL
williamr@4
   846
_STLP_DECLSPEC double  _STLP_CALL arg(const complex<double>&);
williamr@4
   847
_STLP_TEMPLATE_NULL
williamr@4
   848
_STLP_DECLSPEC complex<double> _STLP_CALL polar(const double& __rho, const double& __phi);
williamr@4
   849
#endif
williamr@4
   850
_STLP_TEMPLATE_NULL
williamr@4
   851
_STLP_DECLSPEC float  _STLP_CALL arg(const complex<float>&);
williamr@4
   852
_STLP_TEMPLATE_NULL
williamr@4
   853
_STLP_DECLSPEC complex<float> _STLP_CALL polar(const float& __rho, const float& __phi);
williamr@4
   854
williamr@4
   855
williamr@4
   856
# ifndef _STLP_NO_LONG_DOUBLE
williamr@4
   857
_STLP_TEMPLATE_NULL
williamr@4
   858
_STLP_DECLSPEC long double  _STLP_CALL arg(const complex<long double>&);
williamr@4
   859
_STLP_TEMPLATE_NULL
williamr@4
   860
_STLP_DECLSPEC long double  _STLP_CALL abs(const complex<long double>&);
williamr@4
   861
_STLP_TEMPLATE_NULL
williamr@4
   862
_STLP_DECLSPEC complex<long double> _STLP_CALL polar(const long double&, const long double&);
williamr@4
   863
# endif
williamr@4
   864
#endif
williamr@4
   865
williamr@4
   866
williamr@4
   867
#ifdef _STLP_USE_NEW_IOSTREAMS
williamr@4
   868
williamr@4
   869
// Complex output, in the form (re,im).  We use a two-step process 
williamr@4
   870
// involving stringstream so that we get the padding right.  
williamr@4
   871
template <class _Tp, class _CharT, class _Traits>
williamr@4
   872
basic_ostream<_CharT, _Traits>&  _STLP_CALL 
williamr@4
   873
operator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __z);
williamr@4
   874
williamr@4
   875
template <class _Tp, class _CharT, class _Traits>
williamr@4
   876
basic_istream<_CharT, _Traits>& _STLP_CALL 
williamr@4
   877
operator>>(basic_istream<_CharT, _Traits>& __is, complex<_Tp>& __z);
williamr@4
   878
williamr@4
   879
// Specializations for narrow characters; lets us avoid widen.
williamr@4
   880
williamr@4
   881
_STLP_OPERATOR_TEMPLATE
williamr@4
   882
_STLP_DECLSPEC basic_istream<char, char_traits<char> >& _STLP_CALL 
williamr@4
   883
operator>>(basic_istream<char, char_traits<char> >& __is, complex<float>& __z);
williamr@4
   884
williamr@4
   885
_STLP_OPERATOR_TEMPLATE
williamr@4
   886
_STLP_DECLSPEC basic_istream<char, char_traits<char> >& _STLP_CALL 
williamr@4
   887
operator>>(basic_istream<char, char_traits<char> >& __is, complex<double>& __z);
williamr@4
   888
williamr@4
   889
williamr@4
   890
_STLP_OPERATOR_TEMPLATE
williamr@4
   891
_STLP_DECLSPEC basic_ostream<char, char_traits<char> >& _STLP_CALL 
williamr@4
   892
operator<<(basic_ostream<char, char_traits<char> >& __is, const complex<float>& __z);
williamr@4
   893
williamr@4
   894
_STLP_OPERATOR_TEMPLATE
williamr@4
   895
_STLP_DECLSPEC basic_ostream<char, char_traits<char> >& _STLP_CALL 
williamr@4
   896
operator<<(basic_ostream<char, char_traits<char> >& __is, const complex<double>& __z);
williamr@4
   897
williamr@4
   898
#  if ! defined (_STLP_NO_LONG_DOUBLE)
williamr@4
   899
_STLP_OPERATOR_TEMPLATE
williamr@4
   900
_STLP_DECLSPEC basic_istream<char, char_traits<char> >& _STLP_CALL 
williamr@4
   901
operator>>(basic_istream<char, char_traits<char> >& __is, complex<long double>& __z);
williamr@4
   902
williamr@4
   903
_STLP_OPERATOR_TEMPLATE
williamr@4
   904
_STLP_DECLSPEC basic_ostream<char, char_traits<char> >& _STLP_CALL 
williamr@4
   905
operator<<(basic_ostream<char, char_traits<char> >& __is, const complex<long double>& __z);
williamr@4
   906
williamr@4
   907
# endif
williamr@4
   908
williamr@4
   909
# if defined (_STLP_USE_TEMPLATE_EXPORT) && ! defined (_STLP_NO_WCHAR_T)
williamr@4
   910
williamr@4
   911
_STLP_EXPORT_TEMPLATE basic_istream<wchar_t, char_traits<wchar_t> >& _STLP_CALL operator>>(
williamr@4
   912
        basic_istream<wchar_t, char_traits<wchar_t> >&, complex<double>&);
williamr@4
   913
_STLP_EXPORT_TEMPLATE basic_ostream<wchar_t, char_traits<wchar_t> >& _STLP_CALL operator<<(
williamr@4
   914
        basic_ostream<wchar_t, char_traits<wchar_t> >&, const complex<double>&);
williamr@4
   915
_STLP_EXPORT_TEMPLATE basic_istream<wchar_t, char_traits<wchar_t> >& _STLP_CALL operator>>(
williamr@4
   916
        basic_istream<wchar_t, char_traits<wchar_t> >&, complex<float>&);
williamr@4
   917
_STLP_EXPORT_TEMPLATE basic_ostream<wchar_t, char_traits<wchar_t> >& _STLP_CALL operator<<(
williamr@4
   918
        basic_ostream<wchar_t, char_traits<wchar_t> >&, const complex<float>&);
williamr@4
   919
williamr@4
   920
#  ifndef _STLP_NO_LONG_DOUBLE
williamr@4
   921
_STLP_EXPORT_TEMPLATE basic_istream<wchar_t, char_traits<wchar_t> >& _STLP_CALL operator>>(
williamr@4
   922
        basic_istream<wchar_t, char_traits<wchar_t> >&, complex<long double>&);
williamr@4
   923
_STLP_EXPORT_TEMPLATE basic_ostream<wchar_t, char_traits<wchar_t> >& _STLP_CALL operator<<(
williamr@4
   924
        basic_ostream<wchar_t, char_traits<wchar_t> >&, const complex<long double>&);
williamr@4
   925
#  endif
williamr@4
   926
williamr@4
   927
# endif /* USE_TEMPLATE_EXPORT */
williamr@4
   928
williamr@4
   929
#else /* _STLP_USE_NEW_IOSTREAMS */
williamr@4
   930
williamr@4
   931
template <class _Tp>
williamr@4
   932
ostream& _STLP_CALL operator<<(ostream& s, const complex<_Tp>& __z);
williamr@4
   933
williamr@4
   934
template <class _Tp>
williamr@4
   935
istream& _STLP_CALL  operator>>(istream& s, complex<_Tp>& a);
williamr@4
   936
williamr@4
   937
#endif /* _STLP_USE_NEW_IOSTREAMS */
williamr@4
   938
williamr@4
   939
williamr@4
   940
// Transcendental functions.  These are defined only for float, 
williamr@4
   941
//  double, and long double.  (Sqrt isn't transcendental, of course,
williamr@4
   942
//  but it's included in this section anyway.)
williamr@4
   943
williamr@4
   944
_STLP_DECLSPEC complex<float> _STLP_CALL sqrt(const complex<float>&);
williamr@4
   945
williamr@4
   946
_STLP_DECLSPEC complex<float> _STLP_CALL exp(const complex<float>&);
williamr@4
   947
_STLP_DECLSPEC complex<float> _STLP_CALL  log(const complex<float>&);
williamr@4
   948
_STLP_DECLSPEC complex<float> _STLP_CALL log10(const complex<float>&);
williamr@4
   949
williamr@4
   950
_STLP_DECLSPEC complex<float> _STLP_CALL pow(const complex<float>&, int);
williamr@4
   951
_STLP_DECLSPEC complex<float> _STLP_CALL pow(const complex<float>&, const float&);
williamr@4
   952
_STLP_DECLSPEC complex<float> _STLP_CALL pow(const float&, const complex<float>&);
williamr@4
   953
_STLP_DECLSPEC complex<float> _STLP_CALL pow(const complex<float>&, const complex<float>&);
williamr@4
   954
williamr@4
   955
_STLP_DECLSPEC complex<float> _STLP_CALL sin(const complex<float>&);
williamr@4
   956
_STLP_DECLSPEC complex<float> _STLP_CALL cos(const complex<float>&);
williamr@4
   957
_STLP_DECLSPEC complex<float> _STLP_CALL tan(const complex<float>&);
williamr@4
   958
williamr@4
   959
_STLP_DECLSPEC complex<float> _STLP_CALL sinh(const complex<float>&);
williamr@4
   960
_STLP_DECLSPEC complex<float> _STLP_CALL cosh(const complex<float>&);
williamr@4
   961
_STLP_DECLSPEC complex<float> _STLP_CALL tanh(const complex<float>&);
williamr@4
   962
williamr@4
   963
_STLP_DECLSPEC complex<double> _STLP_CALL sqrt(const complex<double>&);
williamr@4
   964
williamr@4
   965
_STLP_DECLSPEC complex<double> _STLP_CALL exp(const complex<double>&);
williamr@4
   966
_STLP_DECLSPEC complex<double> _STLP_CALL log(const complex<double>&);
williamr@4
   967
_STLP_DECLSPEC complex<double> _STLP_CALL log10(const complex<double>&);
williamr@4
   968
williamr@4
   969
_STLP_DECLSPEC complex<double> _STLP_CALL pow(const complex<double>&, int);
williamr@4
   970
_STLP_DECLSPEC complex<double> _STLP_CALL pow(const complex<double>&, const double&);
williamr@4
   971
_STLP_DECLSPEC complex<double> _STLP_CALL pow(const double&, const complex<double>&);
williamr@4
   972
_STLP_DECLSPEC complex<double> _STLP_CALL pow(const complex<double>&, const complex<double>&);
williamr@4
   973
williamr@4
   974
_STLP_DECLSPEC complex<double> _STLP_CALL sin(const complex<double>&);
williamr@4
   975
_STLP_DECLSPEC complex<double> _STLP_CALL cos(const complex<double>&);
williamr@4
   976
_STLP_DECLSPEC complex<double> _STLP_CALL tan(const complex<double>&);
williamr@4
   977
williamr@4
   978
_STLP_DECLSPEC complex<double> _STLP_CALL sinh(const complex<double>&);
williamr@4
   979
_STLP_DECLSPEC complex<double> _STLP_CALL cosh(const complex<double>&);
williamr@4
   980
_STLP_DECLSPEC complex<double> _STLP_CALL tanh(const complex<double>&);
williamr@4
   981
williamr@4
   982
# ifndef _STLP_NO_LONG_DOUBLE
williamr@4
   983
_STLP_DECLSPEC complex<long double> _STLP_CALL sqrt(const complex<long double>&);
williamr@4
   984
_STLP_DECLSPEC complex<long double> _STLP_CALL exp(const complex<long double>&);
williamr@4
   985
_STLP_DECLSPEC complex<long double> _STLP_CALL log(const complex<long double>&);
williamr@4
   986
_STLP_DECLSPEC complex<long double> _STLP_CALL log10(const complex<long double>&);
williamr@4
   987
williamr@4
   988
_STLP_DECLSPEC complex<long double> _STLP_CALL pow(const complex<long double>&, int);
williamr@4
   989
_STLP_DECLSPEC complex<long double> _STLP_CALL pow(const complex<long double>&, const long double&);
williamr@4
   990
_STLP_DECLSPEC complex<long double> _STLP_CALL pow(const long double&, const complex<long double>&);
williamr@4
   991
_STLP_DECLSPEC complex<long double> _STLP_CALL pow(const complex<long double>&,
williamr@4
   992
                                                   const complex<long double>&);
williamr@4
   993
williamr@4
   994
_STLP_DECLSPEC complex<long double> _STLP_CALL sin(const complex<long double>&);
williamr@4
   995
_STLP_DECLSPEC complex<long double> _STLP_CALL cos(const complex<long double>&);
williamr@4
   996
_STLP_DECLSPEC complex<long double> _STLP_CALL tan(const complex<long double>&);
williamr@4
   997
williamr@4
   998
_STLP_DECLSPEC complex<long double> _STLP_CALL sinh(const complex<long double>&);
williamr@4
   999
_STLP_DECLSPEC complex<long double> _STLP_CALL cosh(const complex<long double>&);
williamr@4
  1000
_STLP_DECLSPEC complex<long double> _STLP_CALL tanh(const complex<long double>&);
williamr@4
  1001
# endif
williamr@4
  1002
williamr@4
  1003
_STLP_END_NAMESPACE
williamr@4
  1004
williamr@4
  1005
# ifndef _STLP_LINK_TIME_INSTANTIATION
williamr@4
  1006
#  include <stl/_complex.c>
williamr@4
  1007
# endif
williamr@4
  1008
williamr@4
  1009
#endif /* _STLP_template_complex */
williamr@4
  1010
williamr@4
  1011
// Local Variables:
williamr@4
  1012
// mode:C++
williamr@4
  1013
// End: