Home | History | Annotate | Download | only in stl
      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