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