SHARE
TWEET

C++ string (VS2008 version)

Archon Dec 12th, 2010 100 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // string standard header
  2. #pragma once
  3. #ifndef _STRING_
  4. #define _STRING_
  5. #ifndef RC_INVOKED
  6. #include <istream>
  7.  
  8. #ifdef  _MSC_VER
  9.  #pragma pack(push,_CRT_PACKING)
  10.  #pragma warning(push,3)
  11.  #pragma warning(disable: 4189)
  12. #endif  /* _MSC_VER */
  13.  
  14. _STD_BEGIN
  15.  
  16.                 // basic_string TEMPLATE OPERATORS
  17. template<class _Elem,
  18.         class _Traits,
  19.         class _Alloc> inline
  20.         basic_string<_Elem, _Traits, _Alloc> __CLRCALL_OR_CDECL operator+(
  21.                 const basic_string<_Elem, _Traits, _Alloc>& _Left,
  22.                 const basic_string<_Elem, _Traits, _Alloc>& _Right)
  23.         {       // return string + string
  24.         return (basic_string<_Elem, _Traits, _Alloc>(_Left) += _Right);
  25.         }
  26.  
  27. template<class _Elem,
  28.         class _Traits,
  29.         class _Alloc> inline
  30.         basic_string<_Elem, _Traits, _Alloc> __CLRCALL_OR_CDECL operator+(
  31.                 const _Elem *_Left,
  32.                 const basic_string<_Elem, _Traits, _Alloc>& _Right)
  33.         {       // return NTCS + string
  34.         return (basic_string<_Elem, _Traits, _Alloc>(_Left) += _Right);
  35.         }
  36.  
  37. template<class _Elem,
  38.         class _Traits,
  39.         class _Alloc> inline
  40.         basic_string<_Elem, _Traits, _Alloc> __CLRCALL_OR_CDECL operator+(
  41.                 const _Elem _Left,
  42.                 const basic_string<_Elem, _Traits, _Alloc>& _Right)
  43.         {       // return character + string
  44.         return (basic_string<_Elem, _Traits, _Alloc>(1, _Left) += _Right);
  45.         }
  46.  
  47. template<class _Elem,
  48.         class _Traits,
  49.         class _Alloc> inline
  50.         basic_string<_Elem, _Traits, _Alloc> __CLRCALL_OR_CDECL operator+(
  51.                 const basic_string<_Elem, _Traits, _Alloc>& _Left,
  52.                 const _Elem *_Right)
  53.         {       // return string + NTCS
  54.         return (basic_string<_Elem, _Traits, _Alloc>(_Left) += _Right);
  55.         }
  56.  
  57. template<class _Elem,
  58.         class _Traits,
  59.         class _Alloc> inline
  60.         basic_string<_Elem, _Traits, _Alloc> __CLRCALL_OR_CDECL operator+(
  61.                 const basic_string<_Elem, _Traits, _Alloc>& _Left,
  62.                 const _Elem _Right)
  63.         {       // return string + character
  64.         return (basic_string<_Elem, _Traits, _Alloc>(_Left) += _Right);
  65.         }
  66.  
  67. template<class _Elem,
  68.         class _Traits,
  69.         class _Alloc> inline
  70.         bool __CLRCALL_OR_CDECL operator==(
  71.                 const basic_string<_Elem, _Traits, _Alloc>& _Left,
  72.                 const basic_string<_Elem, _Traits, _Alloc>& _Right)
  73.         {       // test for string equality
  74.         return (_Left.compare(_Right) == 0);
  75.         }
  76.  
  77. template<class _Elem,
  78.         class _Traits,
  79.         class _Alloc> inline
  80.         bool __CLRCALL_OR_CDECL operator==(
  81.                 const _Elem * _Left,
  82.                 const basic_string<_Elem, _Traits, _Alloc>& _Right)
  83.         {       // test for NTCS vs. string equality
  84.         return (_Right.compare(_Left) == 0);
  85.         }
  86.  
  87. template<class _Elem,
  88.         class _Traits,
  89.         class _Alloc> inline
  90.         bool __CLRCALL_OR_CDECL operator==(
  91.                 const basic_string<_Elem, _Traits, _Alloc>& _Left,
  92.                 const _Elem *_Right)
  93.         {       // test for string vs. NTCS equality
  94.         return (_Left.compare(_Right) == 0);
  95.         }
  96.  
  97. template<class _Elem,
  98.         class _Traits,
  99.         class _Alloc> inline
  100.         bool __CLRCALL_OR_CDECL operator!=(
  101.                 const basic_string<_Elem, _Traits, _Alloc>& _Left,
  102.                 const basic_string<_Elem, _Traits, _Alloc>& _Right)
  103.         {       // test for string inequality
  104.         return (!(_Left == _Right));
  105.         }
  106.  
  107. template<class _Elem,
  108.         class _Traits,
  109.         class _Alloc> inline
  110.         bool __CLRCALL_OR_CDECL operator!=(
  111.                 const _Elem *_Left,
  112.                 const basic_string<_Elem, _Traits, _Alloc>& _Right)
  113.         {       // test for NTCS vs. string inequality
  114.         return (!(_Left == _Right));
  115.         }
  116.  
  117. template<class _Elem,
  118.         class _Traits,
  119.         class _Alloc> inline
  120.         bool __CLRCALL_OR_CDECL operator!=(
  121.                 const basic_string<_Elem, _Traits, _Alloc>& _Left,
  122.                 const _Elem *_Right)
  123.         {       // test for string vs. NTCS inequality
  124.         return (!(_Left == _Right));
  125.         }
  126.  
  127. template<class _Elem,
  128.         class _Traits,
  129.         class _Alloc> inline
  130.         bool __CLRCALL_OR_CDECL operator<(
  131.                 const basic_string<_Elem, _Traits, _Alloc>& _Left,
  132.                 const basic_string<_Elem, _Traits, _Alloc>& _Right)
  133.         {       // test if string < string
  134.         return (_Left.compare(_Right) < 0);
  135.         }
  136.  
  137. template<class _Elem,
  138.         class _Traits,
  139.         class _Alloc> inline
  140.         bool __CLRCALL_OR_CDECL operator<(
  141.                 const _Elem * _Left,
  142.                 const basic_string<_Elem, _Traits, _Alloc>& _Right)
  143.         {       // test if NTCS < string
  144.         return (_Right.compare(_Left) > 0);
  145.         }
  146.  
  147. template<class _Elem,
  148.         class _Traits,
  149.         class _Alloc> inline
  150.         bool __CLRCALL_OR_CDECL operator<(
  151.                 const basic_string<_Elem, _Traits, _Alloc>& _Left,
  152.                 const _Elem *_Right)
  153.         {       // test if string < NTCS
  154.         return (_Left.compare(_Right) < 0);
  155.         }
  156.  
  157. template<class _Elem,
  158.         class _Traits,
  159.         class _Alloc> inline
  160.         bool __CLRCALL_OR_CDECL operator>(
  161.                 const basic_string<_Elem, _Traits, _Alloc>& _Left,
  162.                 const basic_string<_Elem, _Traits, _Alloc>& _Right)
  163.         {       // test if string > string
  164.         return (_Right < _Left);
  165.         }
  166.  
  167. template<class _Elem,
  168.         class _Traits,
  169.         class _Alloc> inline
  170.         bool __CLRCALL_OR_CDECL operator>(
  171.                 const _Elem * _Left,
  172.                 const basic_string<_Elem, _Traits, _Alloc>& _Right)
  173.         {       // test if NTCS > string
  174.         return (_Right < _Left);
  175.         }
  176.  
  177. template<class _Elem,
  178.         class _Traits,
  179.         class _Alloc> inline
  180.         bool __CLRCALL_OR_CDECL operator>(
  181.                 const basic_string<_Elem, _Traits, _Alloc>& _Left,
  182.                 const _Elem *_Right)
  183.         {       // test if string > NTCS
  184.         return (_Right < _Left);
  185.         }
  186.  
  187. template<class _Elem,
  188.         class _Traits,
  189.         class _Alloc> inline
  190.         bool __CLRCALL_OR_CDECL operator<=(
  191.                 const basic_string<_Elem, _Traits, _Alloc>& _Left,
  192.                 const basic_string<_Elem, _Traits, _Alloc>& _Right)
  193.         {       // test if string <= string
  194.         return (!(_Right < _Left));
  195.         }
  196.  
  197. template<class _Elem,
  198.         class _Traits,
  199.         class _Alloc> inline
  200.         bool __CLRCALL_OR_CDECL operator<=(
  201.                 const _Elem * _Left,
  202.                 const basic_string<_Elem, _Traits, _Alloc>& _Right)
  203.         {       // test if NTCS <= string
  204.         return (!(_Right < _Left));
  205.         }
  206.  
  207. template<class _Elem,
  208.         class _Traits,
  209.         class _Alloc> inline
  210.         bool __CLRCALL_OR_CDECL operator<=(
  211.                 const basic_string<_Elem, _Traits, _Alloc>& _Left,
  212.                 const _Elem *_Right)
  213.         {       // test if string <= NTCS
  214.         return (!(_Right < _Left));
  215.         }
  216.  
  217. template<class _Elem,
  218.         class _Traits,
  219.         class _Alloc> inline
  220.         bool __CLRCALL_OR_CDECL operator>=(
  221.                 const basic_string<_Elem, _Traits, _Alloc>& _Left,
  222.                 const basic_string<_Elem, _Traits, _Alloc>& _Right)
  223.         {       // test if string >= string
  224.         return (!(_Left < _Right));
  225.         }
  226.  
  227. template<class _Elem,
  228.         class _Traits,
  229.         class _Alloc> inline
  230.         bool __CLRCALL_OR_CDECL operator>=(
  231.                 const _Elem * _Left,
  232.                 const basic_string<_Elem, _Traits, _Alloc>& _Right)
  233.         {       // test if NTCS >= string
  234.         return (!(_Left < _Right));
  235.         }
  236.  
  237. template<class _Elem,
  238.         class _Traits,
  239.         class _Alloc> inline
  240.         bool __CLRCALL_OR_CDECL operator>=(
  241.                 const basic_string<_Elem, _Traits, _Alloc>& _Left,
  242.                 const _Elem *_Right)
  243.         {       // test if string >= NTCS
  244.         return (!(_Left < _Right));
  245.         }
  246.  
  247.  #if defined(_DLL_CPPLIB) && !defined(_M_CEE_PURE)
  248. template _CRTIMP2_PURE basic_string<char,
  249.         char_traits<char>, allocator<char> > __CLRCALL_OR_CDECL operator+(
  250.                 const basic_string<char, char_traits<char>, allocator<char> >&,
  251.                 const basic_string<char, char_traits<char>, allocator<char> >&);
  252. template _CRTIMP2_PURE basic_string<char,
  253.         char_traits<char>, allocator<char> > __CLRCALL_OR_CDECL operator+(
  254.                 const char *,
  255.                 const basic_string<char, char_traits<char>, allocator<char> >&);
  256. template _CRTIMP2_PURE basic_string<char,
  257.         char_traits<char>, allocator<char> > __CLRCALL_OR_CDECL operator+(
  258.                 const char,
  259.                 const basic_string<char, char_traits<char>, allocator<char> >&);
  260. template _CRTIMP2_PURE basic_string<char,
  261.         char_traits<char>, allocator<char> > __CLRCALL_OR_CDECL operator+(
  262.                 const basic_string<char, char_traits<char>, allocator<char> >&,
  263.                 const char *);
  264. template _CRTIMP2_PURE basic_string<char,
  265.         char_traits<char>, allocator<char> > __CLRCALL_OR_CDECL operator+(
  266.                 const basic_string<char, char_traits<char>, allocator<char> >&,
  267.                 const char);
  268.  
  269. template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator==(
  270.         const basic_string<char, char_traits<char>, allocator<char> >&,
  271.         const basic_string<char, char_traits<char>, allocator<char> >&);
  272. template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator==(
  273.         const char *,
  274.         const basic_string<char, char_traits<char>, allocator<char> >&);
  275. template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator==(
  276.         const basic_string<char, char_traits<char>, allocator<char> >&,
  277.         const char *);
  278.  
  279. template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator!=(
  280.         const basic_string<char, char_traits<char>, allocator<char> >&,
  281.         const basic_string<char, char_traits<char>, allocator<char> >&);
  282. template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator!=(
  283.         const char *,
  284.         const basic_string<char, char_traits<char>, allocator<char> >&);
  285. template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator!=(
  286.         const basic_string<char, char_traits<char>, allocator<char> >&,
  287.         const char *);
  288.  
  289. template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator<(
  290.         const basic_string<char, char_traits<char>, allocator<char> >&,
  291.         const basic_string<char, char_traits<char>, allocator<char> >&);
  292. template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator<(
  293.         const char *,
  294.         const basic_string<char, char_traits<char>, allocator<char> >&);
  295. template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator<(
  296.         const basic_string<char, char_traits<char>, allocator<char> >&,
  297.         const char *);
  298.  
  299. template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator>(
  300.         const basic_string<char, char_traits<char>, allocator<char> >&,
  301.         const basic_string<char, char_traits<char>, allocator<char> >&);
  302. template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator>(
  303.         const char *,
  304.         const basic_string<char, char_traits<char>, allocator<char> >&);
  305. template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator>(
  306.         const basic_string<char, char_traits<char>, allocator<char> >&,
  307.         const char *);
  308.  
  309. template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator<=(
  310.         const basic_string<char, char_traits<char>, allocator<char> >&,
  311.         const basic_string<char, char_traits<char>, allocator<char> >&);
  312. template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator<=(
  313.         const char *,
  314.         const basic_string<char, char_traits<char>, allocator<char> >&);
  315. template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator<=(
  316.         const basic_string<char, char_traits<char>, allocator<char> >&,
  317.         const char *);
  318.  
  319. template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator>=(
  320.         const basic_string<char, char_traits<char>, allocator<char> >&,
  321.         const basic_string<char, char_traits<char>, allocator<char> >&);
  322. template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator>=(
  323.         const char *,
  324.         const basic_string<char, char_traits<char>, allocator<char> >&);
  325. template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator>=(
  326.         const basic_string<char, char_traits<char>, allocator<char> >&,
  327.         const char *);
  328.  
  329. template _CRTIMP2_PURE basic_string<wchar_t,
  330.         char_traits<wchar_t>, allocator<wchar_t> > __CLRCALL_OR_CDECL operator+(
  331.                 const basic_string<wchar_t, char_traits<wchar_t>,
  332.                         allocator<wchar_t> >&,
  333.                 const basic_string<wchar_t, char_traits<wchar_t>,
  334.                         allocator<wchar_t> >&);
  335. template _CRTIMP2_PURE basic_string<wchar_t,
  336.         char_traits<wchar_t>, allocator<wchar_t> > __CLRCALL_OR_CDECL operator+(
  337.                 const wchar_t *,
  338.                 const basic_string<wchar_t, char_traits<wchar_t>,
  339.                         allocator<wchar_t> >&);
  340. template _CRTIMP2_PURE basic_string<wchar_t,
  341.         char_traits<wchar_t>, allocator<wchar_t> > __CLRCALL_OR_CDECL operator+(
  342.                 const wchar_t,
  343.                 const basic_string<wchar_t, char_traits<wchar_t>,
  344.                         allocator<wchar_t> >&);
  345. template _CRTIMP2_PURE basic_string<wchar_t,
  346.         char_traits<wchar_t>, allocator<wchar_t> > __CLRCALL_OR_CDECL operator+(
  347.                 const basic_string<wchar_t, char_traits<wchar_t>,
  348.                         allocator<wchar_t> >&,
  349.                 const wchar_t *);
  350. template _CRTIMP2_PURE basic_string<wchar_t,
  351.         char_traits<wchar_t>, allocator<wchar_t> > __CLRCALL_OR_CDECL operator+(
  352.                 const basic_string<wchar_t, char_traits<wchar_t>,
  353.                         allocator<wchar_t> >&,
  354.                 const wchar_t);
  355.  
  356. template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator==(
  357.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&,
  358.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  359. template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator==(
  360.         const wchar_t *,
  361.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  362. template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator==(
  363.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&,
  364.         const wchar_t *);
  365.  
  366. template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator!=(
  367.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&,
  368.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  369. template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator!=(
  370.         const wchar_t *,
  371.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  372. template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator!=(
  373.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&,
  374.         const wchar_t *);
  375.  
  376. template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator<(
  377.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&,
  378.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  379. template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator<(
  380.         const wchar_t *,
  381.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  382. template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator<(
  383.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&,
  384.         const wchar_t *);
  385.  
  386. template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator>(
  387.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&,
  388.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  389. template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator>(
  390.         const wchar_t *,
  391.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  392. template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator>(
  393.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&,
  394.         const wchar_t *);
  395.  
  396. template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator<=(
  397.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&,
  398.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  399. template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator<=(
  400.         const wchar_t *,
  401.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  402. template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator<=(
  403.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&,
  404.         const wchar_t *);
  405.  
  406. template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator>=(
  407.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&,
  408.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  409. template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator>=(
  410.         const wchar_t *,
  411.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  412. template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator>=(
  413.         const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&,
  414.         const wchar_t *);
  415.  
  416.  
  417.  
  418.  #endif /* _DLL_CPPLIB */
  419.  
  420.                 // basic_string INSERTERS AND EXTRACTORS
  421. template<class _Elem,
  422.         class _Traits,
  423.         class _Alloc> inline
  424.         basic_istream<_Elem, _Traits>& __CLRCALL_OR_CDECL operator>>(
  425.                 basic_istream<_Elem, _Traits>& _Istr,
  426.                 basic_string<_Elem, _Traits, _Alloc>& _Str)
  427.         {       // extract a string
  428.         typedef ctype<_Elem> _Ctype;
  429.         typedef basic_istream<_Elem, _Traits> _Myis;
  430.         typedef basic_string<_Elem, _Traits, _Alloc> _Mystr;
  431.         typedef typename _Mystr::size_type _Mysizt;
  432.  
  433.         ios_base::iostate _State = ios_base::goodbit;
  434.         bool _Changed = false;
  435.         const typename _Myis::sentry _Ok(_Istr);
  436.  
  437.         if (_Ok)
  438.                 {       // state okay, extract characters
  439.                 const _Ctype& _Ctype_fac = _USE(_Istr.getloc(), _Ctype);
  440.                 _Str.erase();
  441.  
  442.                 _TRY_IO_BEGIN
  443.                 _Mysizt _Size = 0 < _Istr.width()
  444.                         && (_Mysizt)_Istr.width() < _Str.max_size()
  445.                                 ? (_Mysizt)_Istr.width() : _Str.max_size();
  446.                 typename _Traits::int_type _Meta = _Istr.rdbuf()->sgetc();
  447.  
  448.                 for (; 0 < _Size; --_Size, _Meta = _Istr.rdbuf()->snextc())
  449.                         if(_Traits::eq_int_type(_Traits::eof(), _Meta))
  450.                                 {       // end of file, quit
  451.                                 _State |= ios_base::eofbit;
  452.                                 break;
  453.                                 }
  454.                         else if (_Ctype_fac.is(_Ctype::space,
  455.                                 _Traits::to_char_type(_Meta)))
  456.                                 break;  // whitespace, quit
  457.                         else
  458.                                 {       // add character to string
  459.                                 _Str.append(1, _Traits::to_char_type(_Meta));
  460.                                 _Changed = true;
  461.                                 }
  462.                 _CATCH_IO_(_Istr)
  463.                 }
  464.  
  465.         _Istr.width(0);
  466.         if (!_Changed)
  467.                 _State |= ios_base::failbit;
  468.         _Istr.setstate(_State);
  469.         return (_Istr);
  470.         }
  471.  
  472. template<class _Elem,
  473.         class _Traits,
  474.         class _Alloc> inline
  475.         basic_istream<_Elem, _Traits>& __CLRCALL_OR_CDECL getline(
  476.                 basic_istream<_Elem, _Traits>& _Istr,
  477.                 basic_string<_Elem, _Traits, _Alloc>& _Str,
  478.                 const _Elem _Delim)
  479.         {       // get characters into string, discard delimiter
  480.         typedef basic_istream<_Elem, _Traits> _Myis;
  481.         ios_base::iostate _State = ios_base::goodbit;
  482.         bool _Changed = false;
  483.         const typename _Myis::sentry _Ok(_Istr, true);
  484.  
  485.         if (_Ok)
  486.                 {       // state okay, extract characters
  487.                 _TRY_IO_BEGIN
  488.                 _Str.erase();
  489.                 const typename _Traits::int_type _Metadelim =
  490.                         _Traits::to_int_type(_Delim);
  491.                 typename _Traits::int_type _Meta = _Istr.rdbuf()->sgetc();
  492.  
  493.                 for (; ; _Meta = _Istr.rdbuf()->snextc())
  494.                         if (_Traits::eq_int_type(_Traits::eof(), _Meta))
  495.                                 {       // end of file, quit
  496.                                 _State |= ios_base::eofbit;
  497.                                 break;
  498.                                 }
  499.                         else if (_Traits::eq_int_type(_Meta, _Metadelim))
  500.                                 {       // got a delimiter, discard it and quit
  501.                                 _Changed = true;
  502.                                 _Istr.rdbuf()->sbumpc();
  503.                                 break;
  504.                                 }
  505.                         else if (_Str.max_size() <= _Str.size())
  506.                                 {       // string too large, quit
  507.                                 _State |= ios_base::failbit;
  508.                                 break;
  509.                                 }
  510.                         else
  511.                                 {       // got a character, add it to string
  512.                                 _Str += _Traits::to_char_type(_Meta);
  513.                                 _Changed = true;
  514.                                 }
  515.                 _CATCH_IO_(_Istr)
  516.                 }
  517.  
  518.         if (!_Changed)
  519.                 _State |= ios_base::failbit;
  520.         _Istr.setstate(_State);
  521.         return (_Istr);
  522.         }
  523.  
  524. template<class _Elem,
  525.         class _Traits,
  526.         class _Alloc> inline
  527.         basic_istream<_Elem, _Traits>& __CLRCALL_OR_CDECL getline(
  528.                 basic_istream<_Elem, _Traits>& _Istr,
  529.                 basic_string<_Elem, _Traits, _Alloc>& _Str)
  530.         {       // get characters into string, discard newline
  531.         return (getline(_Istr, _Str, _Istr.widen('\n')));
  532.         }
  533.  
  534. template<class _Elem,
  535.         class _Traits,
  536.         class _Alloc> inline
  537.         basic_ostream<_Elem, _Traits>& __CLRCALL_OR_CDECL operator<<(
  538.                 basic_ostream<_Elem, _Traits>& _Ostr,
  539.                 const basic_string<_Elem, _Traits, _Alloc>& _Str)
  540.         {       // insert a string
  541.         typedef basic_ostream<_Elem, _Traits> _Myos;
  542.         typedef basic_string<_Elem, _Traits, _Alloc> _Mystr;
  543.         typedef typename _Mystr::size_type _Mysizt;
  544.  
  545.         ios_base::iostate _State = ios_base::goodbit;
  546.         _Mysizt _Size = _Str.size();
  547.         _Mysizt _Pad = _Ostr.width() <= 0 || (_Mysizt)_Ostr.width() <= _Size
  548.                         ? 0 : (_Mysizt)_Ostr.width() - _Size;
  549.         const typename _Myos::sentry _Ok(_Ostr);
  550.  
  551.         if (!_Ok)
  552.                 _State |= ios_base::badbit;
  553.         else
  554.                 {       // state okay, insert characters
  555.         _TRY_IO_BEGIN
  556.                 if ((_Ostr.flags() & ios_base::adjustfield) != ios_base::left)
  557.                         for (; 0 < _Pad; --_Pad)        // pad on left
  558.                                 if (_Traits::eq_int_type(_Traits::eof(),
  559.                                         _Ostr.rdbuf()->sputc(_Ostr.fill())))
  560.                                         {       // insertion failed, quit
  561.                                         _State |= ios_base::badbit;
  562.                                         break;
  563.                                         }
  564.  
  565.                 if (_State == ios_base::goodbit)
  566.                         for (_Mysizt _Count = 0; _Count < _Size; ++_Count)
  567.                                 if (_Traits::eq_int_type(_Traits::eof(),
  568.                                         _Ostr.rdbuf()->sputc(_Str[_Count])))
  569.                                         {       // insertion failed, quit
  570.                                         _State |= ios_base::badbit;
  571.                                         break;
  572.                                         }
  573.  
  574.                 if (_State == ios_base::goodbit)
  575.                         for (; 0 < _Pad; --_Pad)        // pad on right
  576.                                 if (_Traits::eq_int_type(_Traits::eof(),
  577.                                         _Ostr.rdbuf()->sputc(_Ostr.fill())))
  578.                                         {       // insertion failed, quit
  579.                                         _State |= ios_base::badbit;
  580.                                         break;
  581.                                         }
  582.                 _Ostr.width(0);
  583.                 _CATCH_IO_(_Ostr)
  584.                 }
  585.  
  586.         _Ostr.setstate(_State);
  587.         return (_Ostr);
  588.         }
  589.  
  590.  #ifdef _DLL_CPPLIB
  591. template _CRTIMP2_PURE basic_istream<char,
  592.         char_traits<char> >& __CLRCALL_OR_CDECL operator>>(
  593.                 basic_istream<char, char_traits<char> >&,
  594.                 basic_string<char, char_traits<char>, allocator<char> >&);
  595. template _CRTIMP2_PURE basic_istream<char,
  596.         char_traits<char> >& __CLRCALL_OR_CDECL getline(
  597.                 basic_istream<char, char_traits<char> >&,
  598.                 basic_string<char, char_traits<char>, allocator<char> >&);
  599. template _CRTIMP2_PURE basic_istream<char,
  600.         char_traits<char> >& __CLRCALL_OR_CDECL getline(
  601.                 basic_istream<char, char_traits<char> >&,
  602.                 basic_string<char, char_traits<char>, allocator<char> >&,
  603.                 const char);
  604. template _CRTIMP2_PURE basic_ostream<char,
  605.         char_traits<char> >& __CLRCALL_OR_CDECL operator<<(
  606.                 basic_ostream<char, char_traits<char> >&,
  607.                 const basic_string<char, char_traits<char>, allocator<char> >&);
  608.  
  609. template _CRTIMP2_PURE basic_istream<wchar_t,
  610.         char_traits<wchar_t> >& __CLRCALL_OR_CDECL operator>>(
  611.                 basic_istream<wchar_t, char_traits<wchar_t> >&,
  612.                 basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  613. template _CRTIMP2_PURE basic_istream<wchar_t,
  614.         char_traits<wchar_t> >& __CLRCALL_OR_CDECL getline(
  615.                 basic_istream<wchar_t, char_traits<wchar_t> >&,
  616.                 basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&);
  617. template _CRTIMP2_PURE basic_istream<wchar_t,
  618.         char_traits<wchar_t> >& __CLRCALL_OR_CDECL getline(
  619.                 basic_istream<wchar_t, char_traits<wchar_t> >&,
  620.                 basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&,
  621.                 const wchar_t);
  622. template _CRTIMP2_PURE basic_ostream<wchar_t,
  623.         char_traits<wchar_t> >& __CLRCALL_OR_CDECL operator<<(
  624.                 basic_ostream<wchar_t, char_traits<wchar_t> >&,
  625.                 const basic_string<wchar_t, char_traits<wchar_t>,
  626.                         allocator<wchar_t> >&);
  627.  
  628.  
  629.  
  630.  #endif /* _DLL_CPPLIB */
  631. _STD_END
  632.  
  633. #ifdef _MSC_VER
  634.  #pragma warning(default: 4189)
  635.  #pragma warning(pop)
  636.  #pragma pack(pop)
  637. #endif  /* _MSC_VER */
  638.  
  639. #endif /* RC_INVOKED */
  640. #endif /* _STRING */
  641.  
  642. /*
  643.  * Copyright (c) 1992-2006 by P.J. Plauger.  ALL RIGHTS RESERVED.
  644.  * Consult your license regarding permissions and restrictions.
  645.  V5.02:0009 */
RAW Paste Data
Want to get better at C++?
Learn to code C++ in 2017
Pastebin PRO Summer Special!
Get 40% OFF on Pastebin PRO accounts!
Top