1 // complex standard header
2 #pragma once
3 #ifndef _COMPLEX_
4 #define _COMPLEX_
5 #ifndef RC_INVOKED
6 #include <ymath.h>
7 #include <ccomplex>    /* dummy if not C99 library */
8 #include <cmath>
9 #include <sstream>
10
11 #ifdef _MSC_VER
12  #pragma pack(push,_CRT_PACKING)
13  #pragma warning(push,3)
14  #pragma warning(disable: 4244)
15 #endif  /* _MSC_VER */
16
17 _C_STD_BEGIN
18  #ifndef _C_COMPLEX_T
19   #define _C_COMPLEX_T
20
21 typedef struct _C_double_complex
22     {    /* double complex */
23     double _Val[2];
24     } _C_double_complex;
25
26 typedef struct _C_float_complex
27     {    /* float complex */
28     float _Val[2];
29     } _C_float_complex;
30
31 typedef struct _C_ldouble_complex
32     {    /* long double complex */
33     long double _Val[2];
34     } _C_ldouble_complex;
35
36  #endif /* _C_COMPLEX_T */
37
38 _C_STD_END
39
40     // COMPLEX _Val OFFSETS
41  #define _RE    0
42  #define _IM    1
43
44 _STD_BEGIN
45 typedef ::_C_double_complex _Dcomplex_value;
46 typedef ::_C_float_complex _Fcomplex_value;
47 typedef ::_C_ldouble_complex _Lcomplex_value;
48
49 #define __STD_COMPLEX    /* signal presence of complex classes */
50
51 template<class _Ty>
52     class complex;
53 template<> class _CRTIMP2_PURE complex<float>;
54 template<> class _CRTIMP2_PURE complex<double>;
55 template<> class _CRTIMP2_PURE complex<long double>;
56
57         // TEMPLATE CLASS _Ctraits
58 template<class _Ty>
59     class _Ctraits
60     {    // complex traits for _Ty
61 public:
62     static _Ty __CLRCALL_OR_CDECL _Cosh(_Ty _Left, _Ty _Right)
63         {    // return cosh(_Left) * _Right
64         return (::_Cosh((double)_Left, (double)_Right));
65         }
66
67     static short __CLRCALL_OR_CDECL _Exp(_Ty *_Pleft, _Ty _Right, short _Exponent)
68         {    // compute exp(*_Pleft) * _Right * 2 ^ _Exponent
69         double _Tmp = (double)*_Pleft;
Lines 70 ... 1084 are skipped.
1085     if (_Istr >> _Ch && _Ch != _Ctype_fac.widen('('))
1086         {    // no leading '(', treat as real only
1087         _Istr.putback(_Ch);
1088         _Istr >> _Real;
1089         _Imag = 0;
1090         }
1091     else if (_Istr >> _Real >> _Ch && _Ch != _Ctype_fac.widen(','))
1092         if (_Ch == _Ctype_fac.widen(')'))
1093             _Imag = 0;    // (real)
1094         else
1095             {    // no trailing ')' after real, treat as bad field
1096             _Istr.putback(_Ch);
1097             _Istr.setstate(ios_base::failbit);
1098             }
1099     else if (_Istr >> _Imag >> _Ch && _Ch != _Ctype_fac.widen(')'))
1100             {    // no imag or trailing ')', treat as bad field
1101             _Istr.putback(_Ch);
1102             _Istr.setstate(ios_base::failbit);
1103             }
1104
1105     if (!_Istr.fail())
1106         {    // store valid result
1107         _Ty _Tyreal((_Ty)_Real), _Tyimag((_Ty)_Imag);
1108         _Right = _Myt(_Tyreal, _Tyimag);
1109         }
1110     return (_Istr);
1111     }
1112
1113         // TEMPLATE FUNCTION operator<<
1114 template<class _Ty,
1115     class _Elem,
1116     class _Tr> inline
1117     basic_ostream<_Elem, _Tr>& __CLRCALL_OR_CDECL operator<<(
1118         basic_ostream<_Elem, _Tr>& _Ostr, const complex<_Ty>& _Right)
1119     {    // insert a complex<_Ty>
1120     const ctype<_Elem>& _Ctype_fac = _USE(_Ostr.getloc(), ctype<_Elem>);
1121     basic_ostringstream<_Elem, _Tr, allocator<_Elem> > _Sstr;
1122
1123     _Sstr.flags(_Ostr.flags());
1124     _Sstr.imbue(_Ostr.getloc());
1125     _Sstr.precision(_Ostr.precision());
1126     _Sstr << _Ctype_fac.widen('(') << real(_Right)
1127         << _Ctype_fac.widen(',') << imag(_Right)
1128         << _Ctype_fac.widen(')');
1129
1130     basic_string<_Elem, _Tr, allocator<_Elem> > _Str = _Sstr.str();
1131     return (_Ostr << _Str.c_str());
1132     }
1133
1134  #if defined(_DLL_CPPLIB) && !defined(_M_CEE_PURE)
1135 template _CRTIMP2_PURE basic_istream<char, char_traits<char> >&
1136     __CLRCALL_OR_CDECL operator>>(basic_istream<char, char_traits<char> >&,
1137         complex<float>&);
1138 template _CRTIMP2_PURE basic_ostream<char, char_traits<char> >&
1139     __CLRCALL_OR_CDECL operator<<(basic_ostream<char, char_traits<char> >&,
1140         const complex<float>&);
1141 template _CRTIMP2_PURE basic_istream<wchar_t, char_traits<wchar_t> >&
1142     __CLRCALL_OR_CDECL operator>>(basic_istream<wchar_t, char_traits<wchar_t> >&,
1143         complex<float>&);
1144 template _CRTIMP2_PURE basic_ostream<wchar_t, char_traits<wchar_t> >&
1145     __CLRCALL_OR_CDECL operator<<(basic_ostream<wchar_t, char_traits<wchar_t> >&,
1146         const complex<float>&);
1147
1148
1149 template _CRTIMP2_PURE basic_istream<char, char_traits<char> >&
1150     __CLRCALL_OR_CDECL operator>>(basic_istream<char, char_traits<char> >&,
1151         complex<double>&);
1152 template _CRTIMP2_PURE basic_ostream<char, char_traits<char> >&
1153     __CLRCALL_OR_CDECL operator<<(basic_ostream<char, char_traits<char> >&,
1154         const complex<double>&);
1155 template _CRTIMP2_PURE basic_istream<wchar_t, char_traits<wchar_t> >&
1156     __CLRCALL_OR_CDECL operator>>(basic_istream<wchar_t, char_traits<wchar_t> >&,
1157         complex<double>&);
1158 template _CRTIMP2_PURE basic_ostream<wchar_t, char_traits<wchar_t> >&
1159     __CLRCALL_OR_CDECL operator<<(basic_ostream<wchar_t, char_traits<wchar_t> >&,
1160         const complex<double>&);
1161
1162
1163 template _CRTIMP2_PURE basic_istream<char, char_traits<char> >&
1164     __CLRCALL_OR_CDECL operator>>(basic_istream<char, char_traits<char> >&,
1165         complex<long double>&);
1166 template _CRTIMP2_PURE basic_ostream<char, char_traits<char> >&
1167     __CLRCALL_OR_CDECL operator<<(basic_ostream<char, char_traits<char> >&,
1168         const complex<long double>&);
1169 template _CRTIMP2_PURE basic_istream<wchar_t, char_traits<wchar_t> >&
1170     __CLRCALL_OR_CDECL operator>>(basic_istream<wchar_t, char_traits<wchar_t> >&,
1171         complex<long double>&);
1172 template _CRTIMP2_PURE basic_ostream<wchar_t, char_traits<wchar_t> >&
1173     __CLRCALL_OR_CDECL operator<<(basic_ostream<wchar_t, char_traits<wchar_t> >&,
1174         const complex<long double>&);
1175
1176
1177
1178  #endif /* _DLL_CPPLIB */
1179 _STD_END
1180
1181 _C_STD_BEGIN
1182         // TEMPLATE CLASS _Rc_type (ADDITIONS TO <math.h>)
1183 template<class _Ty>
1184     struct _Rc_type;
1185
1186 template<> struct _Rc_type<std::complex<float> >
1187     {    // determine if type is real or complex
1188     typedef char _Type;
1189     };
1190
1191 template<> struct _Rc_type<std::complex<double> >
1192     {    // determine if type is real or complex
1193     typedef char _Type;
1194     };
1195
1196 template<> struct _Rc_type<std::complex<long double> >
1197     {    // determine if type is real or complex
1198     typedef char _Type;
1199     };
1200
1201         // TEMPLATE CLASS _Real_type (ADDITIONS TO <math.h>)
1202 template<class _Ty>
1203     struct _Real_type;
1204
1205 template<> struct _Real_type<std::complex<float> >
1206     {    // determine equivalent real type
1207     typedef float _Type;
1208     };
1209
1210 template<> struct _Real_type<std::complex<double> >
1211     {    // determine equivalent real type
1212     typedef double _Type;
1213     };
1214
1215 template<> struct _Real_type<std::complex<long double> >
1216     {    // determine equivalent real type
1217     typedef long double _Type;
1218     };
1219 _C_STD_END
1220
1221   #pragma warning(default: 4244)
1222
1223 #ifdef _MSC_VER
1224  #pragma warning(pop)
1225  #pragma pack(pop)
1226 #endif  /* _MSC_VER */
1227
1228 #endif /* RC_INVOKED */
1229 #endif /* _COMPLEX_ */
1230
1231 /*
1232  * Copyright (c) 1992-2007 by P.J. Plauger.  ALL RIGHTS RESERVED.
1233  * Consult your license regarding permissions and restrictions.
1234  V5.03:0009 */
1235
1236
1237