xref: /reactos/sdk/include/c++/stlport/stl/_complex.c (revision 1734f297)
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 
39 _STLP_BEGIN_NAMESPACE
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>
91 basic_ostream<_CharT, _Traits>& _STLP_CALL
92 operator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __z) {
93   basic_ostringstream<_CharT, _Traits, allocator<_CharT> > __tmp;
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>
106 basic_istream<_CharT, _Traits>& _STLP_CALL
107 operator>>(basic_istream<_CharT, _Traits>& __is, complex<_Tp>& __z) {
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 
139 _STLP_END_NAMESPACE
140 
141 #endif /* _STLP_COMPLEX_C */
142 
143 // Local Variables:
144 // mode:C++
145 // End:
146