ReactOS  0.4.13-dev-92-gf251225
_complex.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 1999
3  * Silicon Graphics Computer Systems, Inc.
4  *
5  * Copyright (c) 1999
6  * Boris Fomitchev
7  *
8  * This material is provided "as is", with absolutely no warranty expressed
9  * or implied. Any use is at your own risk.
10  *
11  * Permission to use or copy this software for any purpose is hereby granted
12  * without fee, provided the above notices are retained on all copies.
13  * Permission to modify the code and to distribute modified code is granted,
14  * provided the above notices are retained, and a notice that the code was
15  * modified is included with the above copyright notice.
16  *
17  */
18 #ifndef _STLP_COMPLEX_C
19 #define _STLP_COMPLEX_C
20 
21 #ifndef _STLP_INTERNAL_COMPLEX
22 # include <stl/_complex.h>
23 #endif
24 
25 #if !defined (_STLP_USE_NO_IOSTREAMS)
26 # ifndef _STLP_INTERNAL_ISTREAM
27 # include <stl/_istream.h>
28 # endif
29 
30 # ifndef _STLP_INTERNAL_SSTREAM
31 # include <stl/_sstream.h>
32 # endif
33 
34 # ifndef _STLP_STRING_IO_H
35 # include <stl/_string_io.h>
36 # endif
37 #endif
38 
40 
41 // Non-inline member functions.
42 
43 template <class _Tp>
44 void complex<_Tp>::_div(const _Tp& __z1_r, const _Tp& __z1_i,
45  const _Tp& __z2_r, const _Tp& __z2_i,
46  _Tp& __res_r, _Tp& __res_i) {
47  _Tp __ar = __z2_r >= 0 ? __z2_r : -__z2_r;
48  _Tp __ai = __z2_i >= 0 ? __z2_i : -__z2_i;
49 
50  if (__ar <= __ai) {
51  _Tp __ratio = __z2_r / __z2_i;
52  _Tp __denom = __z2_i * (1 + __ratio * __ratio);
53  __res_r = (__z1_r * __ratio + __z1_i) / __denom;
54  __res_i = (__z1_i * __ratio - __z1_r) / __denom;
55  }
56  else {
57  _Tp __ratio = __z2_i / __z2_r;
58  _Tp __denom = __z2_r * (1 + __ratio * __ratio);
59  __res_r = (__z1_r + __z1_i * __ratio) / __denom;
60  __res_i = (__z1_i - __z1_r * __ratio) / __denom;
61  }
62 }
63 
64 template <class _Tp>
65 void complex<_Tp>::_div(const _Tp& __z1_r,
66  const _Tp& __z2_r, const _Tp& __z2_i,
67  _Tp& __res_r, _Tp& __res_i) {
68  _Tp __ar = __z2_r >= 0 ? __z2_r : -__z2_r;
69  _Tp __ai = __z2_i >= 0 ? __z2_i : -__z2_i;
70 
71  if (__ar <= __ai) {
72  _Tp __ratio = __z2_r / __z2_i;
73  _Tp __denom = __z2_i * (1 + __ratio * __ratio);
74  __res_r = (__z1_r * __ratio) / __denom;
75  __res_i = - __z1_r / __denom;
76  }
77  else {
78  _Tp __ratio = __z2_i / __z2_r;
79  _Tp __denom = __z2_r * (1 + __ratio * __ratio);
80  __res_r = __z1_r / __denom;
81  __res_i = - (__z1_r * __ratio) / __denom;
82  }
83 }
84 
85 // I/O.
86 #if !defined (_STLP_USE_NO_IOSTREAMS)
87 
88 // Complex output, in the form (re,im). We use a two-step process
89 // involving stringstream so that we get the padding right.
90 template <class _Tp, class _CharT, class _Traits>
94  __tmp.flags(__os.flags());
95  __tmp.imbue(__os.getloc());
96  __tmp.precision(__os.precision());
97  __tmp << '(' << __z.real() << ',' << __z.imag() << ')';
98  return __os << __tmp.str();
99 }
100 
101 // Complex input from arbitrary streams. Note that results in some
102 // locales may be confusing, since the decimal character varies with
103 // locale and the separator between real and imaginary parts does not.
104 
105 template <class _Tp, class _CharT, class _Traits>
108  _Tp __re = 0;
109  _Tp __im = 0;
110 
111  const ctype<_CharT>& __c_type = *__is._M_ctype_facet();
112 
113  const char __punct[4] = "(,)";
114  _CharT __wpunct[3];
115  __c_type.widen(__punct, __punct + 3, __wpunct);
116 
117  _CharT __c;
118 
119  __is >> __c;
120  if (_Traits::eq(__c, __wpunct[0])) { // Left paren
121  __is >> __re >> __c;
122  if (_Traits::eq(__c, __wpunct[1])) // Comma
123  __is >> __im >> __c;
124  if (!_Traits::eq(__c, __wpunct[2])) // Right paren
125  __is.setstate(ios_base::failbit);
126  }
127  else {
128  __is.putback(__c);
129  __is >> __re;
130  }
131 
132  if (__is)
133  __z = complex<_Tp>(__re, __im);
134  return __is;
135 }
136 
137 #endif /* _STLP_USE_NO_IOSTREAMS */
138 
140 
141 #endif /* _STLP_COMPLEX_C */
142 
143 // Local Variables:
144 // mode:C++
145 // End:
static void _STLP_CALL _div(const value_type &__z1_r, const value_type &__z1_i, const value_type &__z2_r, const value_type &__z2_i, value_type &__res_r, value_type &__res_i)
Definition: _complex.c:44
streamsize precision() const
Definition: _ios_base.h:127
basic_istream< _CharT, _Traits > &_STLP_CALL operator>>(basic_istream< _CharT, _Traits > &__is, complex< _Tp > &__z)
Definition: _complex.c:107
locale getloc() const
Definition: _ios_base.h:143
#define eq(received, expected, label, type)
Definition: locale.c:144
#define __c
Definition: schilyio.h:209
locale imbue(const locale &)
Definition: _ios.c:69
value_type real() const
Definition: _complex.h:69
_String str() const
Definition: _sstream.h:184
value_type imag() const
Definition: _complex.h:70
fmtflags flags() const
Definition: _ios_base.h:107
Definition: _ctype.h:58
_Self & putback(char_type __c)
Definition: _istream.c:422
void setstate(iostate __state)
Definition: _ios.h:95
#define _STLP_END_NAMESPACE
Definition: features.h:503
const ctype< char_type > * _M_ctype_facet() const
Definition: _ios.h:121
#define _STLP_BEGIN_NAMESPACE
Definition: features.h:501
#define _STLP_CALL
Definition: _bc.h:131
basic_ostream< _CharT, _Traits > &_STLP_CALL operator<<(basic_ostream< _CharT, _Traits > &__os, const complex< _Tp > &__z)
Definition: _complex.c:92