// string standard header
#ifndef _STRING_
#define _STRING_
#include <use_ansi.h>
#include <istream>
#include <memory>

#ifdef  _MSC_VER
/*
 * Currently, all MS C compilers for Win32 platforms default to 8 byte
 * alignment.
 */
#pragma pack(push,8)
#endif  /* _MSC_VER */

		// basic_string TEMPLATE OPERATORS
template<class _E, class _TYPE, class _A> inline
	basic_string<_E, _TYPE, _A> operator+(
		const basic_string<_E, _TYPE, _A>& _L,
		const basic_string<_E, _TYPE, _A>& _R)
	{return (basic_string<_E, _TYPE, _A>(_L) += _R); }
template<class _E, class _TYPE, class _A> inline
	basic_string<_E, _TYPE, _A> operator+(const _E *_L,
		const basic_string<_E, _TYPE, _A>& _R)
	{return (basic_string<_E, _TYPE, _A>(_L) += _R); }
template<class _E, class _TYPE, class _A> inline
	basic_string<_E, _TYPE, _A> operator+(
		const _E _L, const basic_string<_E, _TYPE, _A>& _R)
	{return (basic_string<_E, _TYPE, _A>(1, _L) += _R); }
template<class _E, class _TYPE, class _A> inline
	basic_string<_E, _TYPE, _A> operator+(
		const basic_string<_E, _TYPE, _A>& _L,
		const _E *_R)
	{return (basic_string<_E, _TYPE, _A>(_L) += _R); }
template<class _E, class _TYPE, class _A> inline
	basic_string<_E, _TYPE, _A> operator+(
		const basic_string<_E, _TYPE, _A>& _L, const _E _R)
	{return (basic_string<_E, _TYPE, _A>(_L) += _R); }
template<class _E, class _TYPE, class _A> inline
	bool operator==(const basic_string<_E, _TYPE, _A>& _L,
		const basic_string<_E, _TYPE, _A>& _R)
	{return (_L.compare(_R) == 0); }
template<class _E, class _TYPE, class _A> inline
	bool operator==(const _E * _L,
		const basic_string<_E, _TYPE, _A>& _R)
	{return (_R.compare(_L) == 0); }
template<class _E, class _TYPE, class _A> inline
	bool operator==(const basic_string<_E, _TYPE, _A>& _L,
		const _E *_R)
	{return (_L.compare(_R) == 0); }
template<class _E, class _TYPE, class _A> inline
	bool operator!=(const _E *_L,
		const basic_string<_E, _TYPE, _A>& _R)
	{return (!(_L == _R)); }
template<class _E, class _TYPE, class _A> inline
	bool operator!=(const basic_string<_E, _TYPE, _A>& _L,
		const _E *_R)
	{return (!(_L == _R)); }
template<class _E, class _TYPE, class _A> inline
	bool operator<(const basic_string<_E, _TYPE, _A>& _L,
		const basic_string<_E, _TYPE, _A>& _R)
	{return (_L.compare(_R) < 0); }
template<class _E, class _TYPE, class _A> inline
	bool operator<(const _E * _L,
		const basic_string<_E, _TYPE, _A>& _R)
	{return (_R.compare(_L) > 0); }
template<class _E, class _TYPE, class _A> inline
	bool operator<(const basic_string<_E, _TYPE, _A>& _L,
		const _E *_R)
	{return (_L.compare(_R) < 0); }
template<class _E, class _TYPE, class _A> inline
	bool operator>(const _E * _L,
		const basic_string<_E, _TYPE, _A>& _R)
	{return (_R < _L); }
template<class _E, class _TYPE, class _A> inline
	bool operator>(const basic_string<_E, _TYPE, _A>& _L,
		const _E *_R)
	{return (_R < _L); }
template<class _E, class _TYPE, class _A> inline
	bool operator<=(const _E * _L,
		const basic_string<_E, _TYPE, _A>& _R)
	{return (!(_R < _L)); }
template<class _E, class _TYPE, class _A> inline
	bool operator<=(const basic_string<_E, _TYPE, _A>& _L,
		const _E *_R)
	{return (!(_R < _L)); }
template<class _E, class _TYPE, class _A> inline
	bool operator>=(const _E * _L,
		const basic_string<_E, _TYPE, _A>& _R)
	{return (!(_L < _R)); }
template<class _E, class _TYPE, class _A> inline
	bool operator>=(const basic_string<_E, _TYPE, _A>& _L,
		const _E *_R)
	{return (!(_L < _R)); }
		// basic_string INSERTERS AND EXTRACTORS
template<class _E, class _TYPE, class _A> inline
	basic_istream<_E, _TYPE>& operator>>(
		basic_istream<_E, _TYPE>& _I,
		basic_string<_E, _TYPE, _A>& _X)
	{ios_base::iostate _St = ios_base::goodbit;
	bool _Chg = false;
	_X.erase();
	const basic_istream<_E, _TYPE>::sentry _Ok(_I);
	if (_Ok)
		{const ctype<_E>& _Fac = _USE(_I.getloc(), ctype<_E>);
		_TRY_IO_BEGIN
		_A::size_type _N = 0 < _I.width()
			&& _I.width() < _X.max_size()
				? _I.width() : _X.max_size();
		_TYPE::int_type _C = _I.rdbuf()->sgetc();
		for (; 0 < --_N; _C = _I.rdbuf()->snextc())
			if(_TYPE::eq_int_type(_TYPE::eof(), _C))
				{_St |= ios_base::eofbit;
				break; }
			else if (_Fac.is(ctype<_E>::space,
				_TYPE::to_char_type(_C)))
				break;
			else
				{_X.append(1, _TYPE::to_char_type(_C));
				_Chg = true; }
		_CATCH_IO_(_I); }
	_I.width(0);
	if (!_Chg)
		_St |= ios_base::failbit;
	_I.setstate(_St);
	return (_I); }
template<class _E, class _TYPE, class _A> inline
	basic_istream<_E, _TYPE>& getline(basic_istream<_E, _TYPE>& _I,
		basic_string<_E, _TYPE, _A>& _X)
	{return (getline(_I, _X, _E('\n'))); }
template<class _E, class _TYPE, class _A> inline
	basic_istream<_E, _TYPE>& getline(basic_istream<_E, _TYPE>& _I,
		basic_string<_E, _TYPE, _A>& _X, const _E _D)
	{ios_base::iostate _St = ios_base::goodbit;
	bool _Chg = false;
	_X.erase();
	const basic_istream<_E, _TYPE>::sentry _Ok(_I, true);
	if (_Ok)
		{_TRY_IO_BEGIN
		_TYPE::int_type _C = _I.rdbuf()->sgetc();
		for (; ; _C = _I.rdbuf()->snextc())
			if (_TYPE::eq_int_type(_TYPE::eof(), _C))
				{_St |= ios_base::eofbit;
				break; }
			else if (_TYPE::eq(_C, _D))
				{_Chg = true;
				_I.rdbuf()->snextc();
				break; }
			else if (_X.max_size() <= _X.size())
				{_St |= ios_base::failbit;
				break; }
			else
				_X += _TYPE::to_char_type(_C), _Chg = true;
		_CATCH_IO_(_I); }
	if (!_Chg)
		_St |= ios_base::failbit;
	_I.setstate(_St);
	return (_I); }
template<class _E, class _TYPE, class _A> inline
	basic_ostream<_E, _TYPE>& operator<<(
		basic_ostream<_E, _TYPE>& _O,
		const basic_string<_E, _TYPE, _A>& _X)
	{for (_A::size_type _N = 0; _N < _X.size(); ++_N)
		if (_TYPE::eq_int_type(_TYPE::eof(),
			_O.rdbuf()->sputc(_X[_N])))
			break;
	return (_O); }

#ifdef  _MSC_VER
#pragma pack(pop)
#endif  /* _MSC_VER */

#endif /* _STRING */

/*
 * Copyright (c) 1994 by P.J. Plauger.  ALL RIGHTS RESERVED. 
 * Consult your license regarding permissions and restrictions.
 */
