|
|
// string standard header #pragma once #ifndef _STRING_ #define _STRING_ #include <istream>
#pragma pack(push,8) #pragma warning(push,3)
#pragma warning(disable: 4189)
_STD_BEGIN
// basic_string TEMPLATE FUNCTIONS template<class _Elem, class _Traits, class _Alloc> inline basic_string<_Elem, _Traits, _Alloc> __cdecl operator+( const basic_string<_Elem, _Traits, _Alloc>& _Left, const basic_string<_Elem, _Traits, _Alloc>& _Right) { // return string + string return (basic_string<_Elem, _Traits, _Alloc>(_Left) += _Right); }
template<class _Elem, class _Traits, class _Alloc> inline basic_string<_Elem, _Traits, _Alloc> __cdecl operator+( const _Elem *_Left, const basic_string<_Elem, _Traits, _Alloc>& _Right) { // return NTCS + string return (basic_string<_Elem, _Traits, _Alloc>(_Left) += _Right); }
template<class _Elem, class _Traits, class _Alloc> inline basic_string<_Elem, _Traits, _Alloc> __cdecl operator+( const _Elem _Left, const basic_string<_Elem, _Traits, _Alloc>& _Right) { // return character + string return (basic_string<_Elem, _Traits, _Alloc>(1, _Left) += _Right); }
template<class _Elem, class _Traits, class _Alloc> inline basic_string<_Elem, _Traits, _Alloc> __cdecl operator+( const basic_string<_Elem, _Traits, _Alloc>& _Left, const _Elem *_Right) { // return string + NTCS return (basic_string<_Elem, _Traits, _Alloc>(_Left) += _Right); }
template<class _Elem, class _Traits, class _Alloc> inline basic_string<_Elem, _Traits, _Alloc> __cdecl operator+( const basic_string<_Elem, _Traits, _Alloc>& _Left, const _Elem _Right) { // return string + character return (basic_string<_Elem, _Traits, _Alloc>(_Left) += _Right); }
template<class _Elem, class _Traits, class _Alloc> inline bool __cdecl operator==( const basic_string<_Elem, _Traits, _Alloc>& _Left, const basic_string<_Elem, _Traits, _Alloc>& _Right) { // test for string equality return (_Left.compare(_Right) == 0); }
template<class _Elem, class _Traits, class _Alloc> inline bool __cdecl operator==( const _Elem * _Left, const basic_string<_Elem, _Traits, _Alloc>& _Right) { // test for NTCS vs. string equality return (_Right.compare(_Left) == 0); }
template<class _Elem, class _Traits, class _Alloc> inline bool __cdecl operator==( const basic_string<_Elem, _Traits, _Alloc>& _Left, const _Elem *_Right) { // test for string vs. NTCS equality return (_Left.compare(_Right) == 0); }
template<class _Elem, class _Traits, class _Alloc> inline bool __cdecl operator!=( const basic_string<_Elem, _Traits, _Alloc>& _Left, const basic_string<_Elem, _Traits, _Alloc>& _Right) { // test for string inequality return (!(_Left == _Right)); }
template<class _Elem, class _Traits, class _Alloc> inline bool __cdecl operator!=( const _Elem *_Left, const basic_string<_Elem, _Traits, _Alloc>& _Right) { // test for NTCS vs. string inequality return (!(_Left == _Right)); }
template<class _Elem, class _Traits, class _Alloc> inline bool __cdecl operator!=( const basic_string<_Elem, _Traits, _Alloc>& _Left, const _Elem *_Right) { // test for string vs. NTCS inequality return (!(_Left == _Right)); }
template<class _Elem, class _Traits, class _Alloc> inline bool __cdecl operator<( const basic_string<_Elem, _Traits, _Alloc>& _Left, const basic_string<_Elem, _Traits, _Alloc>& _Right) { // test if string < string return (_Left.compare(_Right) < 0); }
template<class _Elem, class _Traits, class _Alloc> inline bool __cdecl operator<( const _Elem * _Left, const basic_string<_Elem, _Traits, _Alloc>& _Right) { // test if NTCS < string return (_Right.compare(_Left) > 0); }
template<class _Elem, class _Traits, class _Alloc> inline bool __cdecl operator<( const basic_string<_Elem, _Traits, _Alloc>& _Left, const _Elem *_Right) { // test if string < NTCS return (_Left.compare(_Right) < 0); }
template<class _Elem, class _Traits, class _Alloc> inline bool __cdecl operator>( const basic_string<_Elem, _Traits, _Alloc>& _Left, const basic_string<_Elem, _Traits, _Alloc>& _Right) { // test if string > string return (_Right < _Left); }
template<class _Elem, class _Traits, class _Alloc> inline bool __cdecl operator>( const _Elem * _Left, const basic_string<_Elem, _Traits, _Alloc>& _Right) { // test if NTCS > string return (_Right < _Left); }
template<class _Elem, class _Traits, class _Alloc> inline bool __cdecl operator>( const basic_string<_Elem, _Traits, _Alloc>& _Left, const _Elem *_Right) { // test if string > NTCS return (_Right < _Left); }
template<class _Elem, class _Traits, class _Alloc> inline bool __cdecl operator<=( const basic_string<_Elem, _Traits, _Alloc>& _Left, const basic_string<_Elem, _Traits, _Alloc>& _Right) { // test if string <= string return (!(_Right < _Left)); }
template<class _Elem, class _Traits, class _Alloc> inline bool __cdecl operator<=( const _Elem * _Left, const basic_string<_Elem, _Traits, _Alloc>& _Right) { // test if NTCS <= string return (!(_Right < _Left)); }
template<class _Elem, class _Traits, class _Alloc> inline bool __cdecl operator<=( const basic_string<_Elem, _Traits, _Alloc>& _Left, const _Elem *_Right) { // test if string <= NTCS return (!(_Right < _Left)); }
template<class _Elem, class _Traits, class _Alloc> inline bool __cdecl operator>=( const basic_string<_Elem, _Traits, _Alloc>& _Left, const basic_string<_Elem, _Traits, _Alloc>& _Right) { // test if string >= string return (!(_Left < _Right)); }
template<class _Elem, class _Traits, class _Alloc> inline bool __cdecl operator>=( const _Elem * _Left, const basic_string<_Elem, _Traits, _Alloc>& _Right) { // test if NTCS >= string return (!(_Left < _Right)); }
template<class _Elem, class _Traits, class _Alloc> inline bool __cdecl operator>=( const basic_string<_Elem, _Traits, _Alloc>& _Left, const _Elem *_Right) { // test if string >= NTCS return (!(_Left < _Right)); }
template<class _Elem, class _Traits, class _Alloc> inline void swap( basic_string<_Elem, _Traits, _Alloc>& _Left, basic_string<_Elem, _Traits, _Alloc>& _Right) { // swap _Left and _Right strings _Left.swap(_Right); }
#ifdef _DLL_CPPLIB template class _CRTIMP2 basic_string<char, char_traits<char>, allocator<char> > __cdecl operator+( const basic_string<char, char_traits<char>, allocator<char> >&, const basic_string<char, char_traits<char>, allocator<char> >&); template class _CRTIMP2 basic_string<char, char_traits<char>, allocator<char> > __cdecl operator+( const char *, const basic_string<char, char_traits<char>, allocator<char> >&); template class _CRTIMP2 basic_string<char, char_traits<char>, allocator<char> > __cdecl operator+( const char, const basic_string<char, char_traits<char>, allocator<char> >&); template class _CRTIMP2 basic_string<char, char_traits<char>, allocator<char> > __cdecl operator+( const basic_string<char, char_traits<char>, allocator<char> >&, const char *); template class _CRTIMP2 basic_string<char, char_traits<char>, allocator<char> > __cdecl operator+( const basic_string<char, char_traits<char>, allocator<char> >&, const char);
template _CRTIMP2 bool __cdecl operator==( const basic_string<char, char_traits<char>, allocator<char> >&, const basic_string<char, char_traits<char>, allocator<char> >&); template _CRTIMP2 bool __cdecl operator==( const char *, const basic_string<char, char_traits<char>, allocator<char> >&); template _CRTIMP2 bool __cdecl operator==( const basic_string<char, char_traits<char>, allocator<char> >&, const char *);
template _CRTIMP2 bool __cdecl operator!=( const basic_string<char, char_traits<char>, allocator<char> >&, const basic_string<char, char_traits<char>, allocator<char> >&); template _CRTIMP2 bool __cdecl operator!=( const char *, const basic_string<char, char_traits<char>, allocator<char> >&); template _CRTIMP2 bool __cdecl operator!=( const basic_string<char, char_traits<char>, allocator<char> >&, const char *);
template _CRTIMP2 bool __cdecl operator<( const basic_string<char, char_traits<char>, allocator<char> >&, const basic_string<char, char_traits<char>, allocator<char> >&); template _CRTIMP2 bool __cdecl operator<( const char *, const basic_string<char, char_traits<char>, allocator<char> >&); template _CRTIMP2 bool __cdecl operator<( const basic_string<char, char_traits<char>, allocator<char> >&, const char *);
template _CRTIMP2 bool __cdecl operator>( const basic_string<char, char_traits<char>, allocator<char> >&, const basic_string<char, char_traits<char>, allocator<char> >&); template _CRTIMP2 bool __cdecl operator>( const char *, const basic_string<char, char_traits<char>, allocator<char> >&); template _CRTIMP2 bool __cdecl operator>( const basic_string<char, char_traits<char>, allocator<char> >&, const char *);
template _CRTIMP2 bool __cdecl operator<=( const basic_string<char, char_traits<char>, allocator<char> >&, const basic_string<char, char_traits<char>, allocator<char> >&); template _CRTIMP2 bool __cdecl operator<=( const char *, const basic_string<char, char_traits<char>, allocator<char> >&); template _CRTIMP2 bool __cdecl operator<=( const basic_string<char, char_traits<char>, allocator<char> >&, const char *);
template _CRTIMP2 bool __cdecl operator>=( const basic_string<char, char_traits<char>, allocator<char> >&, const basic_string<char, char_traits<char>, allocator<char> >&); template _CRTIMP2 bool __cdecl operator>=( const char *, const basic_string<char, char_traits<char>, allocator<char> >&); template _CRTIMP2 bool __cdecl operator>=( const basic_string<char, char_traits<char>, allocator<char> >&, const char *);
template class _CRTIMP2 basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > __cdecl operator+( const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&, const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&); template class _CRTIMP2 basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > __cdecl operator+( const wchar_t *, const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&); template class _CRTIMP2 basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > __cdecl operator+( const wchar_t, const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&); template class _CRTIMP2 basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > __cdecl operator+( const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&, const wchar_t *); template class _CRTIMP2 basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > __cdecl operator+( const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&, const wchar_t);
template _CRTIMP2 bool __cdecl operator==( const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&, const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&); template _CRTIMP2 bool __cdecl operator==( const wchar_t *, const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&); template _CRTIMP2 bool __cdecl operator==( const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&, const wchar_t *);
template _CRTIMP2 bool __cdecl operator!=( const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&, const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&); template _CRTIMP2 bool __cdecl operator!=( const wchar_t *, const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&); template _CRTIMP2 bool __cdecl operator!=( const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&, const wchar_t *);
template _CRTIMP2 bool __cdecl operator<( const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&, const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&); template _CRTIMP2 bool __cdecl operator<( const wchar_t *, const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&); template _CRTIMP2 bool __cdecl operator<( const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&, const wchar_t *);
template _CRTIMP2 bool __cdecl operator>( const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&, const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&); template _CRTIMP2 bool __cdecl operator>( const wchar_t *, const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&); template _CRTIMP2 bool __cdecl operator>( const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&, const wchar_t *);
template _CRTIMP2 bool __cdecl operator<=( const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&, const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&); template _CRTIMP2 bool __cdecl operator<=( const wchar_t *, const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&); template _CRTIMP2 bool __cdecl operator<=( const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&, const wchar_t *);
template _CRTIMP2 bool __cdecl operator>=( const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&, const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&); template _CRTIMP2 bool __cdecl operator>=( const wchar_t *, const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&); template _CRTIMP2 bool __cdecl operator>=( const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&, const wchar_t *);
#endif // _DLL_CPPLIB
// basic_string INSERTERS AND EXTRACTORS template<class _Elem, class _Traits, class _Alloc> inline basic_istream<_Elem, _Traits>& __cdecl operator>>( basic_istream<_Elem, _Traits>& _Istr, basic_string<_Elem, _Traits, _Alloc>& _Str) { // extract a string typedef ctype<_Elem> _Ctype; typedef basic_istream<_Elem, _Traits> _Myis; typedef basic_string<_Elem, _Traits, _Alloc> _Mystr; typedef typename _Mystr::size_type _Mysizt;
ios_base::iostate _State = ios_base::goodbit; bool _Changed = false; const typename _Myis::sentry _Ok(_Istr);
if (_Ok) { // state okay, extract characters const _Ctype& _Fac = _USE(_Istr.getloc(), _Ctype); _Str.erase();
_TRY_IO_BEGIN _Mysizt _Size = 0 < _Istr.width() && (_Mysizt)_Istr.width() < _Str.max_size() ? (_Mysizt)_Istr.width() : _Str.max_size(); typename _Traits::int_type _Meta = _Istr.rdbuf()->sgetc();
for (; 0 < _Size; --_Size, _Meta = _Istr.rdbuf()->snextc()) if(_Traits::eq_int_type(_Traits::eof(), _Meta)) { // end of file, quit _State |= ios_base::eofbit; break; } else if (_Fac.is(_Ctype::space, _Traits::to_char_type(_Meta))) break; // whitespace, quit else { // add character to string _Str.append(1, _Traits::to_char_type(_Meta)); _Changed = true; } _CATCH_IO_(_Istr) }
_Istr.width(0); if (!_Changed) _State |= ios_base::failbit; _Istr.setstate(_State); return (_Istr); }
template<class _Elem, class _Traits, class _Alloc> inline basic_istream<_Elem, _Traits>& __cdecl getline( basic_istream<_Elem, _Traits>& _Istr, basic_string<_Elem, _Traits, _Alloc>& _Str) { // get characters into string, discard newline return (getline(_Istr, _Str, _Istr.widen('\n'))); }
template<class _Elem, class _Traits, class _Alloc> inline basic_istream<_Elem, _Traits>& __cdecl getline( basic_istream<_Elem, _Traits>& _Istr, basic_string<_Elem, _Traits, _Alloc>& _Str, const _Elem _Delim) { // get characters into string, discard delimiter typedef basic_istream<_Elem, _Traits> _Myis; ios_base::iostate _State = ios_base::goodbit; bool _Changed = false; const typename _Myis::sentry _Ok(_Istr, true);
if (_Ok) { // state okay, extract characters _TRY_IO_BEGIN _Str.erase(); const typename _Traits::int_type _Metadelim = _Traits::to_int_type(_Delim); typename _Traits::int_type _Meta = _Istr.rdbuf()->sgetc();
for (; ; _Meta = _Istr.rdbuf()->snextc()) if (_Traits::eq_int_type(_Traits::eof(), _Meta)) { // end of file, quit _State |= ios_base::eofbit; break; } else if (_Traits::eq_int_type(_Meta, _Metadelim)) { // got a delimiter, discard it and quit _Changed = true; _Istr.rdbuf()->sbumpc(); break; } else if (_Str.max_size() <= _Str.size()) { // string too large, quit _State |= ios_base::failbit; break; } else { // got a character, add it to string _Str += _Traits::to_char_type(_Meta); _Changed = true; } _CATCH_IO_(_Istr) }
if (!_Changed) _State |= ios_base::failbit; _Istr.setstate(_State); return (_Istr); }
template<class _Elem, class _Traits, class _Alloc> inline basic_ostream<_Elem, _Traits>& __cdecl operator<<( basic_ostream<_Elem, _Traits>& _Ostr, const basic_string<_Elem, _Traits, _Alloc>& _Str) { // insert a string typedef basic_ostream<_Elem, _Traits> _Myos; typedef basic_string<_Elem, _Traits, _Alloc> _Mystr; typedef typename _Mystr::size_type _Mysizt;
ios_base::iostate _State = ios_base::goodbit; _Mysizt _Size = _Str.size(); _Mysizt _Pad = _Ostr.width() <= 0 || (_Mysizt)_Ostr.width() <= _Size ? 0 : (_Mysizt)_Ostr.width() - _Size; const typename _Myos::sentry _Ok(_Ostr);
if (!_Ok) _State |= ios_base::badbit; else { // state okay, insert characters _TRY_IO_BEGIN if ((_Ostr.flags() & ios_base::adjustfield) != ios_base::left) for (; 0 < _Pad; --_Pad) // pad on left if (_Traits::eq_int_type(_Traits::eof(), _Ostr.rdbuf()->sputc(_Ostr.fill()))) { // insertion failed, quit _State |= ios_base::badbit; break; }
if (_State == ios_base::goodbit) for (_Mysizt _Count = 0; _Count < _Size; ++_Count) if (_Traits::eq_int_type(_Traits::eof(), _Ostr.rdbuf()->sputc(_Str[_Count]))) { // insertion failed, quit _State |= ios_base::badbit; break; }
if (_State == ios_base::goodbit) for (; 0 < _Pad; --_Pad) // pad on right if (_Traits::eq_int_type(_Traits::eof(), _Ostr.rdbuf()->sputc(_Ostr.fill()))) { // insertion failed, quit _State |= ios_base::badbit; break; } _Ostr.width(0); _CATCH_IO_(_Ostr) }
_Ostr.setstate(_State); return (_Ostr); }
#ifdef _DLL_CPPLIB template class _CRTIMP2 basic_istream<char, char_traits<char> >& __cdecl operator>>( basic_istream<char, char_traits<char> >&, basic_string<char, char_traits<char>, allocator<char> >&); template class _CRTIMP2 basic_istream<char, char_traits<char> >& __cdecl getline( basic_istream<char, char_traits<char> >&, basic_string<char, char_traits<char>, allocator<char> >&); template class _CRTIMP2 basic_istream<char, char_traits<char> >& __cdecl getline( basic_istream<char, char_traits<char> >&, basic_string<char, char_traits<char>, allocator<char> >&, const char); template class _CRTIMP2 basic_ostream<char, char_traits<char> >& __cdecl operator<<( basic_ostream<char, char_traits<char> >&, const basic_string<char, char_traits<char>, allocator<char> >&);
template class _CRTIMP2 basic_istream<wchar_t, char_traits<wchar_t> >& __cdecl operator>>( basic_istream<wchar_t, char_traits<wchar_t> >&, basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&); template class _CRTIMP2 basic_istream<wchar_t, char_traits<wchar_t> >& __cdecl getline( basic_istream<wchar_t, char_traits<wchar_t> >&, basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&); template class _CRTIMP2 basic_istream<wchar_t, char_traits<wchar_t> >& __cdecl getline( basic_istream<wchar_t, char_traits<wchar_t> >&, basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&, const wchar_t); template class _CRTIMP2 basic_ostream<wchar_t, char_traits<wchar_t> >& __cdecl operator<<( basic_ostream<wchar_t, char_traits<wchar_t> >&, const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&); #endif // _DLL_CPPLIB _STD_END #pragma warning(default: 4189) #pragma warning(pop) #pragma pack(pop)
#endif /* _STRING */
/* * Copyright (c) 1992-2001 by P.J. Plauger. ALL RIGHTS RESERVED. * Consult your license regarding permissions and restrictions. V3.10:0009 */
|