19720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/* 29720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1999 39720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Silicon Graphics Computer Systems, Inc. 49720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 59720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1999 69720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Boris Fomitchev 79720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 89720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * This material is provided "as is", with absolutely no warranty expressed 99720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * or implied. Any use is at your own risk. 109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to use or copy this software for any purpose is hereby granted 129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * without fee, provided the above notices are retained on all copies. 139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to modify the code and to distribute modified code is granted, 149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * provided the above notices are retained, and a notice that the code was 159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * modified is included with the above copyright notice. 169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */ 189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_COMPLEX_C 199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_COMPLEX_C 209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_COMPLEX 229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_complex.h> 239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_USE_NO_IOSTREAMS) 269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# ifndef _STLP_INTERNAL_ISTREAM 279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_istream.h> 289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif 299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# ifndef _STLP_INTERNAL_SSTREAM 319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_sstream.h> 329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif 339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# ifndef _STLP_STRING_IO_H 359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_string_io.h> 369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif 379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE 409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Non-inline member functions. 429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp> 449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid complex<_Tp>::_div(const _Tp& __z1_r, const _Tp& __z1_i, 459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _Tp& __z2_r, const _Tp& __z2_i, 469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Tp& __res_r, _Tp& __res_i) { 479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Tp __ar = __z2_r >= 0 ? __z2_r : -__z2_r; 489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Tp __ai = __z2_i >= 0 ? __z2_i : -__z2_i; 499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__ar <= __ai) { 519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Tp __ratio = __z2_r / __z2_i; 529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Tp __denom = __z2_i * (1 + __ratio * __ratio); 539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __res_r = (__z1_r * __ratio + __z1_i) / __denom; 549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __res_i = (__z1_i * __ratio - __z1_r) / __denom; 559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else { 579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Tp __ratio = __z2_i / __z2_r; 589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Tp __denom = __z2_r * (1 + __ratio * __ratio); 599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __res_r = (__z1_r + __z1_i * __ratio) / __denom; 609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __res_i = (__z1_i - __z1_r * __ratio) / __denom; 619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp> 659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid complex<_Tp>::_div(const _Tp& __z1_r, 669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _Tp& __z2_r, const _Tp& __z2_i, 679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Tp& __res_r, _Tp& __res_i) { 689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Tp __ar = __z2_r >= 0 ? __z2_r : -__z2_r; 699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Tp __ai = __z2_i >= 0 ? __z2_i : -__z2_i; 709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__ar <= __ai) { 729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Tp __ratio = __z2_r / __z2_i; 739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Tp __denom = __z2_i * (1 + __ratio * __ratio); 749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __res_r = (__z1_r * __ratio) / __denom; 759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __res_i = - __z1_r / __denom; 769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else { 789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Tp __ratio = __z2_i / __z2_r; 799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Tp __denom = __z2_r * (1 + __ratio * __ratio); 809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __res_r = __z1_r / __denom; 819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __res_i = - (__z1_r * __ratio) / __denom; 829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// I/O. 869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_USE_NO_IOSTREAMS) 879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Complex output, in the form (re,im). We use a two-step process 899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// involving stringstream so that we get the padding right. 909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _CharT, class _Traits> 919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_ostream<_CharT, _Traits>& _STLP_CALL 929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __z) { 939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block basic_ostringstream<_CharT, _Traits, allocator<_CharT> > __tmp; 949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __tmp.flags(__os.flags()); 959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __tmp.imbue(__os.getloc()); 969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __tmp.precision(__os.precision()); 979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __tmp << '(' << __z.real() << ',' << __z.imag() << ')'; 989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __os << __tmp.str(); 999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 1009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Complex input from arbitrary streams. Note that results in some 1029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// locales may be confusing, since the decimal character varies with 1039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// locale and the separator between real and imaginary parts does not. 1049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _CharT, class _Traits> 1069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>& _STLP_CALL 1079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator>>(basic_istream<_CharT, _Traits>& __is, complex<_Tp>& __z) { 1089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Tp __re = 0; 1099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Tp __im = 0; 1109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 111e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const ctype<_CharT>& __c_type = *__is._M_ctype_facet(); 1129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const char __punct[4] = "(,)"; 1149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _CharT __wpunct[3]; 1159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __c_type.widen(__punct, __punct + 3, __wpunct); 1169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _CharT __c; 1189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __is >> __c; 1209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (_Traits::eq(__c, __wpunct[0])) { // Left paren 1219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __is >> __re >> __c; 1229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (_Traits::eq(__c, __wpunct[1])) // Comma 1239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __is >> __im >> __c; 1249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (!_Traits::eq(__c, __wpunct[2])) // Right paren 1259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __is.setstate(ios_base::failbit); 1269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else { 1289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __is.putback(__c); 1299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __is >> __re; 1309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__is) 1339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __z = complex<_Tp>(__re, __im); 1349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __is; 1359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 1369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_USE_NO_IOSTREAMS */ 1389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE 1409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_COMPLEX_C */ 1429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Local Variables: 1449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// mode:C++ 1459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// End: 146