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

  1. // string standard header
  2.  
  3. #if     _MSC_VER > 1000 /*IFSTRIP=IGN*/
  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. #ifndef CRTDLL2
  188. #pragma warning(disable:4231) /* the extern before template is a non-standard extension */
  189.  
  190. extern template class _CRTIMP2
  191.     basic_string<char, char_traits<char>, allocator<char> > __cdecl operator+(
  192.         const basic_string<char, char_traits<char>, allocator<char> >&,
  193.         const basic_string<char, char_traits<char>, allocator<char> >&);
  194. extern template class _CRTIMP2
  195.     basic_string<char, char_traits<char>, allocator<char> > __cdecl operator+(
  196.         const char *, const basic_string<char, char_traits<char>, allocator<char> >&);
  197. extern template class _CRTIMP2
  198.     basic_string<char, char_traits<char>, allocator<char> > __cdecl operator+(
  199.         const char, const basic_string<char, char_traits<char>, allocator<char> >&);
  200. extern template class _CRTIMP2
  201.     basic_string<char, char_traits<char>, allocator<char> > __cdecl operator+(
  202.         const basic_string<char, char_traits<char>, allocator<char> >&, const char *);
  203. extern template class _CRTIMP2
  204.     basic_string<char, char_traits<char>, allocator<char> > __cdecl operator+(
  205.         const basic_string<char, char_traits<char>, allocator<char> >&, const char);
  206. extern template _CRTIMP2 bool __cdecl operator==(
  207.         const basic_string<char, char_traits<char>, allocator<char> >&,
  208.         const basic_string<char, char_traits<char>, allocator<char> >&);
  209. extern template _CRTIMP2 bool __cdecl operator==(
  210.         const char *, const basic_string<char, char_traits<char>, allocator<char> >&);
  211. extern template _CRTIMP2 bool __cdecl operator==(
  212.         const basic_string<char, char_traits<char>, allocator<char> >&, const char *);
  213. extern template _CRTIMP2 bool __cdecl operator!=(
  214.         const basic_string<char, char_traits<char>, allocator<char> >&,
  215.         const basic_string<char, char_traits<char>, allocator<char> >&);
  216. extern template _CRTIMP2 bool __cdecl operator!=(
  217.         const char *, const basic_string<char, char_traits<char>, allocator<char> >&);
  218. extern template _CRTIMP2 bool __cdecl operator!=(
  219.         const basic_string<char, char_traits<char>, allocator<char> >&, const char *);
  220. extern template _CRTIMP2 bool __cdecl operator<(
  221.         const basic_string<char, char_traits<char>, allocator<char> >&,
  222.         const basic_string<char, char_traits<char>, allocator<char> >&);
  223. extern template _CRTIMP2 bool __cdecl operator<(
  224.         const char *, const basic_string<char, char_traits<char>, allocator<char> >&);
  225. extern template _CRTIMP2 bool __cdecl operator<(
  226.         const basic_string<char, char_traits<char>, allocator<char> >&, const char *);
  227. extern template _CRTIMP2 bool __cdecl operator>(
  228.         const basic_string<char, char_traits<char>, allocator<char> >&,
  229.         const basic_string<char, char_traits<char>, allocator<char> >&);
  230. extern template _CRTIMP2 bool __cdecl operator>(
  231.         const char *, const basic_string<char, char_traits<char>, allocator<char> >&);
  232. extern template _CRTIMP2 bool __cdecl operator>(
  233.         const basic_string<char, char_traits<char>, allocator<char> >&, const char *);
  234. extern template _CRTIMP2 bool __cdecl operator<=(
  235.         const basic_string<char, char_traits<char>, allocator<char> >&,
  236.         const basic_string<char, char_traits<char>, allocator<char> >&);
  237. extern template _CRTIMP2 bool __cdecl operator<=(
  238.         const char *, const basic_string<char, char_traits<char>, allocator<char> >&);
  239. extern template _CRTIMP2 bool __cdecl operator<=(
  240.         const basic_string<char, char_traits<char>, allocator<char> >&, const char *);
  241. extern template _CRTIMP2 bool __cdecl operator>=(
  242.         const basic_string<char, char_traits<char>, allocator<char> >&,
  243.         const basic_string<char, char_traits<char>, allocator<char> >&);
  244. extern template _CRTIMP2 bool __cdecl operator>=(
  245.         const char *, const basic_string<char, char_traits<char>, allocator<char> >&);
  246. extern template _CRTIMP2 bool __cdecl operator>=(
  247.         const basic_string<char, char_traits<char>, allocator<char> >&, const char *);
  248. extern template class _CRTIMP2
  249.     basic_istream<char, char_traits<char> >& __cdecl operator>>(
  250.         basic_istream<char, char_traits<char> >&,
  251.         basic_string<char, char_traits<char>, allocator<char> >&);
  252. extern template class _CRTIMP2
  253.     basic_istream<char, char_traits<char> >& __cdecl getline(
  254.         basic_istream<char, char_traits<char> >&,
  255.         basic_string<char, char_traits<char>, allocator<char> >&);
  256. extern template class _CRTIMP2
  257.     basic_istream<char, char_traits<char> >& __cdecl getline(
  258.         basic_istream<char, char_traits<char> >&,
  259.         basic_string<char, char_traits<char>, allocator<char> >&, const char);
  260. extern template class _CRTIMP2
  261.     basic_ostream<char, char_traits<char> >& __cdecl operator<<(
  262.         basic_ostream<char, char_traits<char> >&,
  263.         const basic_string<char, char_traits<char>, allocator<char> >&);
  264.  
  265. extern template class _CRTIMP2
  266.     basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > __cdecl operator+(
  267.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&,
  268.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  269. extern template class _CRTIMP2
  270.     basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > __cdecl operator+(
  271.         const wchar_t *, const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  272. extern template class _CRTIMP2
  273.     basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > __cdecl operator+(
  274.         const wchar_t, const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  275. extern template class _CRTIMP2
  276.     basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > __cdecl operator+(
  277.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&, const wchar_t *);
  278. extern template class _CRTIMP2
  279.     basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > __cdecl operator+(
  280.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&, const wchar_t);
  281. extern template _CRTIMP2 bool __cdecl operator==(
  282.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&,
  283.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  284. extern template _CRTIMP2 bool __cdecl operator==(
  285.         const wchar_t *, const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  286. extern template _CRTIMP2 bool __cdecl operator==(
  287.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&, const wchar_t *);
  288. extern template _CRTIMP2 bool __cdecl operator!=(
  289.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&,
  290.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  291. extern template _CRTIMP2 bool __cdecl operator!=(
  292.         const wchar_t *, const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  293. extern template _CRTIMP2 bool __cdecl operator!=(
  294.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&, const wchar_t *);
  295. extern template _CRTIMP2 bool __cdecl operator<(
  296.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&,
  297.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  298. extern template _CRTIMP2 bool __cdecl operator<(
  299.         const wchar_t *, const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  300. extern template _CRTIMP2 bool __cdecl operator<(
  301.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&, const wchar_t *);
  302. extern template _CRTIMP2 bool __cdecl operator>(
  303.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&,
  304.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  305. extern template _CRTIMP2 bool __cdecl operator>(
  306.         const wchar_t *, const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  307. extern template _CRTIMP2 bool __cdecl operator>(
  308.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&, const wchar_t *);
  309. extern template _CRTIMP2 bool __cdecl operator<=(
  310.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&,
  311.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  312. extern template _CRTIMP2 bool __cdecl operator<=(
  313.         const wchar_t *, const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  314. extern template _CRTIMP2 bool __cdecl operator<=(
  315.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&, const wchar_t *);
  316. extern template _CRTIMP2 bool __cdecl operator>=(
  317.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&,
  318.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  319. extern template _CRTIMP2 bool __cdecl operator>=(
  320.         const wchar_t *, const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  321. extern template _CRTIMP2 bool __cdecl operator>=(
  322.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&, const wchar_t *);
  323. extern template class _CRTIMP2
  324.     basic_istream<wchar_t, char_traits<wchar_t> >& __cdecl operator>>(
  325.         basic_istream<wchar_t, char_traits<wchar_t> >&,
  326.         basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  327. extern template class _CRTIMP2
  328.     basic_istream<wchar_t, char_traits<wchar_t> >& __cdecl getline(
  329.         basic_istream<wchar_t, char_traits<wchar_t> >&,
  330.         basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  331. extern template class _CRTIMP2
  332.     basic_istream<wchar_t, char_traits<wchar_t> >& __cdecl getline(
  333.         basic_istream<wchar_t, char_traits<wchar_t> >&,
  334.         basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&, const wchar_t);
  335. extern template class _CRTIMP2
  336.     basic_ostream<wchar_t, char_traits<wchar_t> >& __cdecl operator<<(
  337.         basic_ostream<wchar_t, char_traits<wchar_t> >&,
  338.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  339.  
  340. #pragma warning(default:4231) /* restore previous warning */
  341. #endif      // CRTDLL2
  342. #endif      // _DLL
  343.  
  344. _STD_END
  345. #ifdef  _MSC_VER
  346. #pragma pack(pop)
  347. #endif  /* _MSC_VER */
  348.  
  349. #endif /* _STRING */
  350.  
  351. /*
  352.  * Copyright (c) 1994 by P.J. Plauger.  ALL RIGHTS RESERVED. 
  353.  * Consult your license regarding permissions and restrictions.
  354.  */
  355.