epoc32/include/stdapis/stlport/stl/_complex.c
author William Roberts <williamr@symbian.org>
Tue, 16 Mar 2010 16:12:26 +0000
branchSymbian2
changeset 2 2fe1408b6811
parent 0 061f57f2323e
permissions -rw-r--r--
Final list of Symbian^2 public API header files
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_COMPLEX_C
williamr@2
    19
#define _STLP_COMPLEX_C
williamr@2
    20
williamr@2
    21
# ifndef _STLP_internal_complex_h
williamr@2
    22
#  include <stl/_complex.h>
williamr@2
    23
# endif
williamr@2
    24
williamr@2
    25
#include <istream>
williamr@2
    26
williamr@2
    27
#ifdef _STLP_USE_NEW_IOSTREAMS
williamr@2
    28
# include <sstream>
williamr@2
    29
#endif
williamr@2
    30
williamr@2
    31
_STLP_BEGIN_NAMESPACE
williamr@2
    32
williamr@2
    33
// Non-inline member functions.
williamr@2
    34
williamr@2
    35
template <class _Tp>
williamr@2
    36
void complex<_Tp>::_div(const _Tp& __z1_r, const _Tp& __z1_i,
williamr@2
    37
                        const _Tp& __z2_r, const _Tp& __z2_i,
williamr@2
    38
                        _Tp& __res_r, _Tp& __res_i) {
williamr@2
    39
  _Tp __ar = __z2_r >= 0 ? __z2_r : -__z2_r;
williamr@2
    40
  _Tp __ai = __z2_i >= 0 ? __z2_i : -__z2_i;
williamr@2
    41
williamr@2
    42
  if (__ar <= __ai) {
williamr@2
    43
    _Tp __ratio = __z2_r / __z2_i;
williamr@2
    44
    _Tp __denom = __z2_i * (1 + __ratio * __ratio);
williamr@2
    45
    __res_r = (__z1_r * __ratio + __z1_i) / __denom;
williamr@2
    46
    __res_i = (__z1_i * __ratio - __z1_r) / __denom;
williamr@2
    47
  }
williamr@2
    48
  else {
williamr@2
    49
    _Tp __ratio = __z2_i / __z2_r;
williamr@2
    50
    _Tp __denom = __z2_r * (1 + __ratio * __ratio);
williamr@2
    51
    __res_r = (__z1_r + __z1_i * __ratio) / __denom;
williamr@2
    52
    __res_i = (__z1_i - __z1_r * __ratio) / __denom;
williamr@2
    53
  }
williamr@2
    54
}
williamr@2
    55
williamr@2
    56
template <class _Tp>
williamr@2
    57
void complex<_Tp>::_div(const _Tp& __z1_r,
williamr@2
    58
                        const _Tp& __z2_r, const _Tp& __z2_i,
williamr@2
    59
                        _Tp& __res_r, _Tp& __res_i) {
williamr@2
    60
  _Tp __ar = __z2_r >= 0 ? __z2_r : -__z2_r;
williamr@2
    61
  _Tp __ai = __z2_i >= 0 ? __z2_i : -__z2_i;
williamr@2
    62
williamr@2
    63
  if (__ar <= __ai) {
williamr@2
    64
    _Tp __ratio = __z2_r / __z2_i;
williamr@2
    65
    _Tp __denom = __z2_i * (1 + __ratio * __ratio);
williamr@2
    66
    __res_r = (__z1_r * __ratio) / __denom;
williamr@2
    67
    __res_i = - __z1_r / __denom;
williamr@2
    68
  }
williamr@2
    69
  else {
williamr@2
    70
    _Tp __ratio = __z2_i / __z2_r;
williamr@2
    71
    _Tp __denom = __z2_r * (1 + __ratio * __ratio);
williamr@2
    72
    __res_r = __z1_r / __denom;
williamr@2
    73
    __res_i = - (__z1_r * __ratio) / __denom;
williamr@2
    74
  }
williamr@2
    75
}
williamr@2
    76
williamr@2
    77
// I/O.
williamr@2
    78
williamr@2
    79
#ifdef _STLP_USE_NEW_IOSTREAMS
williamr@2
    80
williamr@2
    81
// Complex output, in the form (re,im).  We use a two-step process 
williamr@2
    82
// involving stringstream so that we get the padding right.  
williamr@2
    83
template <class _Tp, class _CharT, class _Traits>
williamr@2
    84
basic_ostream<_CharT, _Traits>& _STLP_CALL
williamr@2
    85
operator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __z)
williamr@2
    86
{
williamr@2
    87
  basic_ostringstream<_CharT, _Traits, allocator<_CharT> > __tmp;
williamr@2
    88
  __tmp.flags(__os.flags());
williamr@2
    89
  __tmp.imbue(__os.getloc());
williamr@2
    90
  __tmp.precision(__os.precision());
williamr@2
    91
  __tmp << '(' << __z.real() << ',' << __z.imag() << ')';
williamr@2
    92
  return __os << __tmp.str();
williamr@2
    93
}
williamr@2
    94
williamr@2
    95
// Complex input from arbitrary streams.  Note that results in some
williamr@2
    96
// locales may be confusing, since the decimal character varies with
williamr@2
    97
// locale and the separator between real and imaginary parts does not.
williamr@2
    98
williamr@2
    99
template <class _Tp, class _CharT, class _Traits>
williamr@2
   100
basic_istream<_CharT, _Traits>& _STLP_CALL
williamr@2
   101
operator>>(basic_istream<_CharT, _Traits>& __is, complex<_Tp>& __z)
williamr@2
   102
{
williamr@2
   103
  _Tp  __re = 0;
williamr@2
   104
  _Tp  __im = 0;
williamr@2
   105
williamr@2
   106
  // typedef ctype<_CharT> _Ctype;
williamr@2
   107
  //  locale __loc = __is.getloc();
williamr@2
   108
  //const _Ctype&  __c_type  = use_facet<_Ctype>(__loc);
williamr@2
   109
  const ctype<_CharT>& __c_type = *(const ctype<_CharT>*)__is._M_ctype_facet();
williamr@2
   110
williamr@2
   111
  char   __punct[4] = "(,)";
williamr@2
   112
  _CharT __wpunct[3];
williamr@2
   113
  __c_type.widen(__punct, __punct + 3, __wpunct);
williamr@2
   114
williamr@2
   115
  _CharT __c;
williamr@2
   116
williamr@2
   117
  __is >> __c;
williamr@2
   118
  if (_Traits::eq(__c, __wpunct[0])) {  // Left paren
williamr@2
   119
    __is >> __re >> __c;
williamr@2
   120
    if (_Traits::eq(__c, __wpunct[1]))  // Comma
williamr@2
   121
      __is >> __im >> __c;
williamr@2
   122
    if (!_Traits::eq(__c, __wpunct[2])) // Right paren
williamr@2
   123
      __is.setstate(ios_base::failbit);
williamr@2
   124
  }
williamr@2
   125
  else {
williamr@2
   126
    __is.putback(__c);
williamr@2
   127
    __is >> __re;
williamr@2
   128
  }
williamr@2
   129
williamr@2
   130
  if (__is)
williamr@2
   131
    __z = complex<_Tp>(__re, __im);
williamr@2
   132
  return __is;
williamr@2
   133
}
williamr@2
   134
williamr@2
   135
williamr@2
   136
#else /* _STLP_USE_NEW_IOSTREAMS */
williamr@2
   137
williamr@2
   138
template <class _Tp>
williamr@2
   139
ostream& _STLP_CALL operator<<(ostream& s, const complex<_Tp>& __z)
williamr@2
   140
{
williamr@2
   141
  return s << "( " << __z._M_re <<", " << __z._M_im <<")";
williamr@2
   142
}
williamr@2
   143
williamr@2
   144
template <class _Tp>
williamr@2
   145
istream& _STLP_CALL operator>>(istream& s, complex<_Tp>& a)
williamr@2
   146
{
williamr@2
   147
  _Tp re = 0, im = 0;
williamr@2
   148
  char 	c = 0;
williamr@2
   149
williamr@2
   150
  s >> c;
williamr@2
   151
  if (c == '(') {
williamr@2
   152
    s >> re >> c;
williamr@2
   153
    if (c == ',') s >> im >> c;
williamr@2
   154
    if (c != ')') s.clear(ios::badbit);
williamr@2
   155
  }
williamr@2
   156
  else {
williamr@2
   157
    s.putback(c);
williamr@2
   158
    s >> re;
williamr@2
   159
  }
williamr@2
   160
williamr@2
   161
  if (s) a = complex<_Tp>(re, im);
williamr@2
   162
  return s;
williamr@2
   163
}
williamr@2
   164
williamr@2
   165
#endif /* _STLP_USE_NEW_IOSTREAMS */
williamr@2
   166
williamr@2
   167
_STLP_END_NAMESPACE
williamr@2
   168
williamr@2
   169
#endif /* _STLP_COMPLEX_C */