home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / vc98 / include / string < prev    next >
Text File  |  1998-06-16  |  18KB  |  353 lines

  1. // string standard header
  2.  
  3. #if     _MSC_VER > 1000
  4. #pragma once
  5. #endif
  6.  
  7. #ifndef _STRING_
  8. #define _STRING_
  9. #include <istream>
  10.  
  11. #ifdef  _MSC_VER
  12. #pragma pack(push,8)
  13. #endif  /* _MSC_VER */
  14. _STD_BEGIN
  15.         // basic_string TEMPLATE OPERATORS
  16. template<class _E, class _Tr, class _A> inline
  17.     basic_string<_E, _Tr, _A> __cdecl operator+(
  18.         const basic_string<_E, _Tr, _A>& _L,
  19.         const basic_string<_E, _Tr, _A>& _R)
  20.     {return (basic_string<_E, _Tr, _A>(_L) += _R); }
  21. template<class _E, class _Tr, class _A> inline
  22.     basic_string<_E, _Tr, _A> __cdecl operator+(const _E *_L,
  23.         const basic_string<_E, _Tr, _A>& _R)
  24.     {return (basic_string<_E, _Tr, _A>(_L) += _R); }
  25. template<class _E, class _Tr, class _A> inline
  26.     basic_string<_E, _Tr, _A> __cdecl operator+(
  27.         const _E _L, const basic_string<_E, _Tr, _A>& _R)
  28.     {return (basic_string<_E, _Tr, _A>(1, _L) += _R); }
  29. template<class _E, class _Tr, class _A> inline
  30.     basic_string<_E, _Tr, _A> __cdecl operator+(
  31.         const basic_string<_E, _Tr, _A>& _L,
  32.         const _E *_R)
  33.     {return (basic_string<_E, _Tr, _A>(_L) += _R); }
  34. template<class _E, class _Tr, class _A> inline
  35.     basic_string<_E, _Tr, _A> __cdecl operator+(
  36.         const basic_string<_E, _Tr, _A>& _L, const _E _R)
  37.     {return (basic_string<_E, _Tr, _A>(_L) += _R); }
  38. template<class _E, class _Tr, class _A> inline
  39.     bool __cdecl operator==(const basic_string<_E, _Tr, _A>& _L,
  40.         const basic_string<_E, _Tr, _A>& _R)
  41.     {return (_L.compare(_R) == 0); }
  42. template<class _E, class _Tr, class _A> inline
  43.     bool __cdecl operator==(const _E * _L,
  44.         const basic_string<_E, _Tr, _A>& _R)
  45.     {return (_R.compare(_L) == 0); }
  46. template<class _E, class _Tr, class _A> inline
  47.     bool __cdecl operator==(const basic_string<_E, _Tr, _A>& _L,
  48.         const _E *_R)
  49.     {return (_L.compare(_R) == 0); }
  50. template<class _E, class _Tr, class _A> inline
  51.     bool __cdecl operator!=(const basic_string<_E, _Tr, _A>& _L,
  52.         const basic_string<_E, _Tr, _A>& _R)
  53.     {return (!(_L == _R)); }
  54. template<class _E, class _Tr, class _A> inline
  55.     bool __cdecl operator!=(const _E *_L,
  56.         const basic_string<_E, _Tr, _A>& _R)
  57.     {return (!(_L == _R)); }
  58. template<class _E, class _Tr, class _A> inline
  59.     bool __cdecl operator!=(const basic_string<_E, _Tr, _A>& _L,
  60.         const _E *_R)
  61.     {return (!(_L == _R)); }
  62. template<class _E, class _Tr, class _A> inline
  63.     bool __cdecl operator<(const basic_string<_E, _Tr, _A>& _L,
  64.         const basic_string<_E, _Tr, _A>& _R)
  65.     {return (_L.compare(_R) < 0); }
  66. template<class _E, class _Tr, class _A> inline
  67.     bool __cdecl operator<(const _E * _L,
  68.         const basic_string<_E, _Tr, _A>& _R)
  69.     {return (_R.compare(_L) > 0); }
  70. template<class _E, class _Tr, class _A> inline
  71.     bool __cdecl operator<(const basic_string<_E, _Tr, _A>& _L,
  72.         const _E *_R)
  73.     {return (_L.compare(_R) < 0); }
  74. template<class _E, class _Tr, class _A> inline
  75.     bool __cdecl operator>(const basic_string<_E, _Tr, _A>& _L,
  76.         const basic_string<_E, _Tr, _A>& _R)
  77.     {return (_R < _L); }
  78. template<class _E, class _Tr, class _A> inline
  79.     bool __cdecl operator>(const _E * _L,
  80.         const basic_string<_E, _Tr, _A>& _R)
  81.     {return (_R < _L); }
  82. template<class _E, class _Tr, class _A> inline
  83.     bool __cdecl operator>(const basic_string<_E, _Tr, _A>& _L,
  84.         const _E *_R)
  85.     {return (_R < _L); }
  86. template<class _E, class _Tr, class _A> inline
  87.     bool __cdecl operator<=(const basic_string<_E, _Tr, _A>& _L,
  88.         const basic_string<_E, _Tr, _A>& _R)
  89.     {return (!(_R < _L)); }
  90. template<class _E, class _Tr, class _A> inline
  91.     bool __cdecl operator<=(const _E * _L,
  92.         const basic_string<_E, _Tr, _A>& _R)
  93.     {return (!(_R < _L)); }
  94. template<class _E, class _Tr, class _A> inline
  95.     bool __cdecl operator<=(const basic_string<_E, _Tr, _A>& _L,
  96.         const _E *_R)
  97.     {return (!(_R < _L)); }
  98. template<class _E, class _Tr, class _A> inline
  99.     bool __cdecl operator>=(const basic_string<_E, _Tr, _A>& _L,
  100.         const basic_string<_E, _Tr, _A>& _R)
  101.     {return (!(_L < _R)); }
  102. template<class _E, class _Tr, class _A> inline
  103.     bool __cdecl operator>=(const _E * _L,
  104.         const basic_string<_E, _Tr, _A>& _R)
  105.     {return (!(_L < _R)); }
  106. template<class _E, class _Tr, class _A> inline
  107.     bool __cdecl operator>=(const basic_string<_E, _Tr, _A>& _L,
  108.         const _E *_R)
  109.     {return (!(_L < _R)); }
  110.         // basic_string INSERTERS AND EXTRACTORS
  111. template<class _E, class _Tr, class _A> inline
  112.     basic_istream<_E, _Tr>& __cdecl operator>>(
  113.         basic_istream<_E, _Tr>& _I,
  114.         basic_string<_E, _Tr, _A>& _X)
  115.     {typedef ctype<_E> _Ctype;
  116.     typedef basic_istream<_E, _Tr> _Myis;
  117.     ios_base::iostate _St = ios_base::goodbit;
  118.     bool _Chg = false;
  119.     _X.erase();
  120.     const _Myis::sentry _Ok(_I);
  121.     if (_Ok)
  122.         {const _Ctype& _Fac = _USE(_I.getloc(), _Ctype);
  123.         _TRY_IO_BEGIN
  124.         _A::size_type _N = 0 < _I.width()
  125.             && _I.width() < _X.max_size()
  126.                 ? _I.width() : _X.max_size();
  127.         _Tr::int_type _C = _I.rdbuf()->sgetc();
  128.         for (; 0 < --_N; _C = _I.rdbuf()->snextc())
  129.             if(_Tr::eq_int_type(_Tr::eof(), _C))
  130.                 {_St |= ios_base::eofbit;
  131.                 break; }
  132.             else if (_Fac.is(_Ctype::space,
  133.                 _Tr::to_char_type(_C)))
  134.                 break;
  135.             else
  136.                 {_X.append(1, _Tr::to_char_type(_C));
  137.                 _Chg = true; }
  138.         _CATCH_IO_(_I); }
  139.     _I.width(0);
  140.     if (!_Chg)
  141.         _St |= ios_base::failbit;
  142.     _I.setstate(_St);
  143.     return (_I); }
  144. template<class _E, class _Tr, class _A> inline
  145.     basic_istream<_E, _Tr>& __cdecl getline(basic_istream<_E, _Tr>& _I,
  146.         basic_string<_E, _Tr, _A>& _X)
  147.     {return (getline(_I, _X, _I.widen('\n'))); }
  148. template<class _E, class _Tr, class _A> inline
  149.     basic_istream<_E, _Tr>& __cdecl getline(basic_istream<_E, _Tr>& _I,
  150.         basic_string<_E, _Tr, _A>& _X, const _E _D)
  151.     {typedef basic_istream<_E, _Tr> _Myis;
  152.     ios_base::iostate _St = ios_base::goodbit;
  153.     bool _Chg = false;
  154.     _X.erase();
  155.     const _Myis::sentry _Ok(_I, true);
  156.     if (_Ok)
  157.         {_TRY_IO_BEGIN
  158.         _Tr::int_type _C = _I.rdbuf()->sgetc();
  159.         for (; ; _C = _I.rdbuf()->snextc())
  160.             if (_Tr::eq_int_type(_Tr::eof(), _C))
  161.                 {_St |= ios_base::eofbit;
  162.                 break; }
  163.             else if (_Tr::eq((_E)_C, _D))
  164.                 {_Chg = true;
  165.                 _I.rdbuf()->snextc();
  166.                 break; }
  167.             else if (_X.max_size() <= _X.size())
  168.                 {_St |= ios_base::failbit;
  169.                 break; }
  170.             else
  171.                 _X += _Tr::to_char_type(_C), _Chg = true;
  172.         _CATCH_IO_(_I); }
  173.     if (!_Chg)
  174.         _St |= ios_base::failbit;
  175.     _I.setstate(_St);
  176.     return (_I); }
  177. template<class _E, class _Tr, class _A> inline
  178.     basic_ostream<_E, _Tr>& __cdecl operator<<(
  179.         basic_ostream<_E, _Tr>& _O,
  180.         const basic_string<_E, _Tr, _A>& _X)
  181.     {
  182.     _O << _X.c_str();
  183.     return (_O); }
  184.  
  185.  
  186. #ifdef _DLL
  187. #pragma warning(disable:4231) /* the extern before template is a non-standard extension */
  188.  
  189. extern template class _CRTIMP
  190.     basic_string<char, char_traits<char>, allocator<char> > __cdecl operator+(
  191.         const basic_string<char, char_traits<char>, allocator<char> >&,
  192.         const basic_string<char, char_traits<char>, allocator<char> >&);
  193. extern template class _CRTIMP
  194.     basic_string<char, char_traits<char>, allocator<char> > __cdecl operator+(
  195.         const char *, const basic_string<char, char_traits<char>, allocator<char> >&);
  196. extern template class _CRTIMP
  197.     basic_string<char, char_traits<char>, allocator<char> > __cdecl operator+(
  198.         const char, const basic_string<char, char_traits<char>, allocator<char> >&);
  199. extern template class _CRTIMP
  200.     basic_string<char, char_traits<char>, allocator<char> > __cdecl operator+(
  201.         const basic_string<char, char_traits<char>, allocator<char> >&, const char *);
  202. extern template class _CRTIMP
  203.     basic_string<char, char_traits<char>, allocator<char> > __cdecl operator+(
  204.         const basic_string<char, char_traits<char>, allocator<char> >&, const char);
  205. extern template _CRTIMP bool __cdecl operator==(
  206.         const basic_string<char, char_traits<char>, allocator<char> >&,
  207.         const basic_string<char, char_traits<char>, allocator<char> >&);
  208. extern template _CRTIMP bool __cdecl operator==(
  209.         const char *, const basic_string<char, char_traits<char>, allocator<char> >&);
  210. extern template _CRTIMP bool __cdecl operator==(
  211.         const basic_string<char, char_traits<char>, allocator<char> >&, const char *);
  212. extern template _CRTIMP bool __cdecl operator!=(
  213.         const basic_string<char, char_traits<char>, allocator<char> >&,
  214.         const basic_string<char, char_traits<char>, allocator<char> >&);
  215. extern template _CRTIMP bool __cdecl operator!=(
  216.         const char *, const basic_string<char, char_traits<char>, allocator<char> >&);
  217. extern template _CRTIMP bool __cdecl operator!=(
  218.         const basic_string<char, char_traits<char>, allocator<char> >&, const char *);
  219. extern template _CRTIMP bool __cdecl operator<(
  220.         const basic_string<char, char_traits<char>, allocator<char> >&,
  221.         const basic_string<char, char_traits<char>, allocator<char> >&);
  222. extern template _CRTIMP bool __cdecl operator<(
  223.         const char *, const basic_string<char, char_traits<char>, allocator<char> >&);
  224. extern template _CRTIMP bool __cdecl operator<(
  225.         const basic_string<char, char_traits<char>, allocator<char> >&, const char *);
  226. extern template _CRTIMP bool __cdecl operator>(
  227.         const basic_string<char, char_traits<char>, allocator<char> >&,
  228.         const basic_string<char, char_traits<char>, allocator<char> >&);
  229. extern template _CRTIMP bool __cdecl operator>(
  230.         const char *, const basic_string<char, char_traits<char>, allocator<char> >&);
  231. extern template _CRTIMP bool __cdecl operator>(
  232.         const basic_string<char, char_traits<char>, allocator<char> >&, const char *);
  233. extern template _CRTIMP bool __cdecl operator<=(
  234.         const basic_string<char, char_traits<char>, allocator<char> >&,
  235.         const basic_string<char, char_traits<char>, allocator<char> >&);
  236. extern template _CRTIMP bool __cdecl operator<=(
  237.         const char *, const basic_string<char, char_traits<char>, allocator<char> >&);
  238. extern template _CRTIMP bool __cdecl operator<=(
  239.         const basic_string<char, char_traits<char>, allocator<char> >&, const char *);
  240. extern template _CRTIMP bool __cdecl operator>=(
  241.         const basic_string<char, char_traits<char>, allocator<char> >&,
  242.         const basic_string<char, char_traits<char>, allocator<char> >&);
  243. extern template _CRTIMP bool __cdecl operator>=(
  244.         const char *, const basic_string<char, char_traits<char>, allocator<char> >&);
  245. extern template _CRTIMP bool __cdecl operator>=(
  246.         const basic_string<char, char_traits<char>, allocator<char> >&, const char *);
  247. extern template class _CRTIMP
  248.     basic_istream<char, char_traits<char> >& __cdecl operator>>(
  249.         basic_istream<char, char_traits<char> >&,
  250.         basic_string<char, char_traits<char>, allocator<char> >&);
  251. extern template class _CRTIMP
  252.     basic_istream<char, char_traits<char> >& __cdecl getline(
  253.         basic_istream<char, char_traits<char> >&,
  254.         basic_string<char, char_traits<char>, allocator<char> >&);
  255. extern template class _CRTIMP
  256.     basic_istream<char, char_traits<char> >& __cdecl getline(
  257.         basic_istream<char, char_traits<char> >&,
  258.         basic_string<char, char_traits<char>, allocator<char> >&, const char);
  259. extern template class _CRTIMP
  260.     basic_ostream<char, char_traits<char> >& __cdecl operator<<(
  261.         basic_ostream<char, char_traits<char> >&,
  262.         const basic_string<char, char_traits<char>, allocator<char> >&);
  263.  
  264. extern template class _CRTIMP
  265.     basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > __cdecl operator+(
  266.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&,
  267.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  268. extern template class _CRTIMP
  269.     basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > __cdecl operator+(
  270.         const wchar_t *, const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  271. extern template class _CRTIMP
  272.     basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > __cdecl operator+(
  273.         const wchar_t, const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  274. extern template class _CRTIMP
  275.     basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > __cdecl operator+(
  276.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&, const wchar_t *);
  277. extern template class _CRTIMP
  278.     basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > __cdecl operator+(
  279.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&, const wchar_t);
  280. extern template _CRTIMP bool __cdecl operator==(
  281.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&,
  282.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  283. extern template _CRTIMP bool __cdecl operator==(
  284.         const wchar_t *, const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  285. extern template _CRTIMP bool __cdecl operator==(
  286.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&, const wchar_t *);
  287. extern template _CRTIMP bool __cdecl operator!=(
  288.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&,
  289.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  290. extern template _CRTIMP bool __cdecl operator!=(
  291.         const wchar_t *, const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  292. extern template _CRTIMP bool __cdecl operator!=(
  293.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&, const wchar_t *);
  294. extern template _CRTIMP bool __cdecl operator<(
  295.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&,
  296.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  297. extern template _CRTIMP bool __cdecl operator<(
  298.         const wchar_t *, const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  299. extern template _CRTIMP bool __cdecl operator<(
  300.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&, const wchar_t *);
  301. extern template _CRTIMP bool __cdecl operator>(
  302.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&,
  303.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  304. extern template _CRTIMP bool __cdecl operator>(
  305.         const wchar_t *, const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  306. extern template _CRTIMP bool __cdecl operator>(
  307.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&, const wchar_t *);
  308. extern template _CRTIMP bool __cdecl operator<=(
  309.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&,
  310.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  311. extern template _CRTIMP bool __cdecl operator<=(
  312.         const wchar_t *, const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  313. extern template _CRTIMP bool __cdecl operator<=(
  314.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&, const wchar_t *);
  315. extern template _CRTIMP bool __cdecl operator>=(
  316.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&,
  317.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  318. extern template _CRTIMP bool __cdecl operator>=(
  319.         const wchar_t *, const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  320. extern template _CRTIMP bool __cdecl operator>=(
  321.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&, const wchar_t *);
  322. extern template class _CRTIMP
  323.     basic_istream<wchar_t, char_traits<wchar_t> >& __cdecl operator>>(
  324.         basic_istream<wchar_t, char_traits<wchar_t> >&,
  325.         basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  326. extern template class _CRTIMP
  327.     basic_istream<wchar_t, char_traits<wchar_t> >& __cdecl getline(
  328.         basic_istream<wchar_t, char_traits<wchar_t> >&,
  329.         basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  330. extern template class _CRTIMP
  331.     basic_istream<wchar_t, char_traits<wchar_t> >& __cdecl getline(
  332.         basic_istream<wchar_t, char_traits<wchar_t> >&,
  333.         basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&, const wchar_t);
  334. extern template class _CRTIMP
  335.     basic_ostream<wchar_t, char_traits<wchar_t> >& __cdecl operator<<(
  336.         basic_ostream<wchar_t, char_traits<wchar_t> >&,
  337.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  338.  
  339. #pragma warning(default:4231) /* restore previous warning */
  340. #endif      // _DLL
  341.  
  342. _STD_END
  343. #ifdef  _MSC_VER
  344. #pragma pack(pop)
  345. #endif  /* _MSC_VER */
  346.  
  347. #endif /* _STRING */
  348.  
  349. /*
  350.  * Copyright (c) 1994 by P.J. Plauger.  ALL RIGHTS RESERVED. 
  351.  * Consult your license regarding permissions and restrictions.
  352.  */
  353.