📄 streambuf
字号:
{ // put a character back to stream (always fail)
return (_Traits::eof());
}
virtual streamsize __CLR_OR_THIS_CALL showmanyc()
{ // return count of input characters
return (0);
}
virtual int_type __CLR_OR_THIS_CALL underflow()
{ // get a character from stream, but don't point past it
return (_Traits::eof());
}
virtual int_type __CLR_OR_THIS_CALL uflow()
{ // get a character from stream, point past it
return (_Traits::eq_int_type(_Traits::eof(), underflow())
? _Traits::eof() : _Traits::to_int_type(*_Gninc()));
}
virtual streamsize __CLR_OR_THIS_CALL xsgetn(_Elem * _Ptr,
streamsize _Count)
{ // get _Count characters from stream
int_type _Meta;
streamsize _Size, _Copied;
for (_Copied = 0; 0 < _Count; )
if (0 < (_Size = _Gnavail()))
{ // copy from read buffer
if (_Count < _Size)
_Size = _Count;
_Traits::copy(_Ptr, gptr(), (size_t)_Size);
_Ptr += _Size;
_Copied += _Size;
_Count -= _Size;
gbump((int)_Size);
}
else if (_Traits::eq_int_type(_Traits::eof(), _Meta = uflow()))
break; // end of file, quit
else
{ // get a single character
*_Ptr++ = _Traits::to_char_type(_Meta);
++_Copied;
--_Count;
}
return (_Copied);
}
virtual streamsize __CLR_OR_THIS_CALL xsputn(const _Elem *_Ptr,
streamsize _Count)
{ // put _Count characters to stream
streamsize _Size, _Copied;
for (_Copied = 0; 0 < _Count; )
if (0 < (_Size = _Pnavail()))
{ // copy to write buffer
if (_Count < _Size)
_Size = _Count;
_Traits::copy(pptr(), _Ptr, (size_t)_Size);
_Ptr += _Size;
_Copied += _Size;
_Count -= _Size;
pbump((int)_Size);
}
else if (_Traits::eq_int_type(_Traits::eof(),
overflow(_Traits::to_int_type(*_Ptr))))
break; // single character put failed, quit
else
{ // count character successfully put
++_Ptr;
++_Copied;
--_Count;
}
return (_Copied);
}
virtual pos_type __CLR_OR_THIS_CALL seekoff(off_type,
ios_base::seekdir,
ios_base::openmode = ios_base::in | ios_base::out)
{ // change position by offset, according to way and mode
return (streampos(_BADOFF));
}
virtual pos_type __CLR_OR_THIS_CALL seekpos(pos_type,
ios_base::openmode = ios_base::in | ios_base::out)
{ // change to specified position, according to mode
return (streampos(_BADOFF));
}
virtual _Myt *__CLR_OR_THIS_CALL setbuf(_Elem *, streamsize)
{ // offer buffer to external agent (do nothing)
return (this);
}
virtual int __CLR_OR_THIS_CALL sync()
{ // synchronize with external agent (do nothing)
return (0);
}
virtual void __CLR_OR_THIS_CALL imbue(const locale&)
{ // set locale to argument (do nothing)
}
private:
_Mutex _Mylock; // thread lock
_Elem *_Gfirst; // beginning of read buffer
_Elem *_Pfirst; // beginning of write buffer
_Elem **_IGfirst; // pointer to beginning of read buffer
_Elem **_IPfirst; // pointer to beginning of write buffer
_Elem *_Gnext; // current position in read buffer
_Elem *_Pnext; // current position in write buffer
_Elem **_IGnext; // pointer to current position in read buffer
_Elem **_IPnext; // pointer to current position in write buffer
int _Gcount; // length of read buffer
int _Pcount; // length of write buffer
int *_IGcount; // pointer to length of read buffer
int *_IPcount; // pointer to length of write buffer
locale *_Plocale; // pointer to imbued locale object
};
#if defined(_DLL_CPPLIB) && !defined(_M_CEE_PURE)
#ifdef __FORCE_INSTANCE
template class _CRTIMP2_PURE basic_streambuf<char, char_traits<char> >;
template class _CRTIMP2_PURE basic_streambuf<wchar_t, char_traits<wchar_t> >;
#ifdef _CRTBLD_NATIVE_WCHAR_T
template class _CRTIMP2_PURE basic_streambuf<unsigned short,
char_traits<unsigned short> >;
#endif /* _CRTBLD_NATIVE_WCHAR_T */
#endif /* __FORCE_INSTANCE */
#endif /* defined(_DLL_CPPLIB) etc. */
// TEMPLATE CLASS istreambuf_iterator
template<class _Elem,
class _Traits>
class istreambuf_iterator
: public iterator<input_iterator_tag,
_Elem, typename _Traits::off_type, _Elem *, _Elem&>
{ // wrap stream buffer as input iterator
typedef istreambuf_iterator<_Elem, _Traits> _Myt;
public:
typedef _Elem char_type;
typedef _Traits traits_type;
typedef basic_streambuf<_Elem, _Traits> streambuf_type;
typedef basic_istream<_Elem, _Traits> istream_type;
typedef typename traits_type::int_type int_type;
istreambuf_iterator(streambuf_type *_Sb = 0) _THROW0()
: _Strbuf(_Sb), _Got(_Sb == 0)
{ // construct from stream buffer _Sb
}
istreambuf_iterator(istream_type& _Istr) _THROW0()
: _Strbuf(_Istr.rdbuf()), _Got(_Istr.rdbuf() == 0)
{ // construct from stream buffer in istream _Istr
}
_Elem operator*() const
{ // return designated value
if (!_Got)
_Peek();
#if _ITERATOR_DEBUG_LEVEL == 2
if (_Strbuf == 0)
_DEBUG_ERROR("istreambuf_iterator is not dereferencable");
#endif /* _ITERATOR_DEBUG_LEVEL == 2 */
return (_Val);
}
_Myt& operator++()
{ // preincrement
#if _ITERATOR_DEBUG_LEVEL == 2
if (_Strbuf == 0)
_DEBUG_ERROR("istreambuf_iterator is not incrementable");
#endif /* _ITERATOR_DEBUG_LEVEL == 2 */
_Inc();
return (*this);
}
_Myt operator++(int)
{ // postincrement
if (!_Got)
_Peek();
_Myt _Tmp = *this;
++*this;
return (_Tmp);
}
bool equal(const _Myt& _Right) const
{ // test for equality
if (!_Got)
_Peek();
if (!_Right._Got)
_Right._Peek();
return (_Strbuf == 0 && _Right._Strbuf == 0
|| _Strbuf != 0 && _Right._Strbuf != 0);
}
private:
void _Inc()
{ // skip to next input element
if (_Strbuf == 0
|| traits_type::eq_int_type(traits_type::eof(),
_Strbuf->sbumpc()))
_Strbuf = 0, _Got = true;
else
_Got = false;
}
_Elem _Peek() const
{ // peek at next input element
int_type _Meta;
if (_Strbuf == 0
|| traits_type::eq_int_type(traits_type::eof(),
_Meta = _Strbuf->sgetc()))
_Strbuf = 0;
else
_Val = traits_type::to_char_type(_Meta);
_Got = true;
return (_Val);
}
mutable streambuf_type *_Strbuf; // the wrapped stream buffer
mutable bool _Got; // true if _Val is valid
mutable _Elem _Val; // next element to deliver
};
template<class _Elem,
class _Traits>
struct _Is_checked_helper<istreambuf_iterator<_Elem, _Traits> >
: public _STD tr1::true_type
{ // mark istreambuf_iterator as checked
};
// istreambuf_iterator TEMPLATE OPERATORS
template<class _Elem,
class _Traits> inline
bool __CLR_OR_THIS_CALL operator==(
const istreambuf_iterator<_Elem, _Traits>& _Left,
const istreambuf_iterator<_Elem, _Traits>& _Right)
{ // test for istreambuf_iterator equality
return (_Left.equal(_Right));
}
template<class _Elem,
class _Traits> inline
bool __CLR_OR_THIS_CALL operator!=(
const istreambuf_iterator<_Elem, _Traits>& _Left,
const istreambuf_iterator<_Elem, _Traits>& _Right)
{ // test for istreambuf_iterator inequality
return (!(_Left == _Right));
}
// TEMPLATE CLASS ostreambuf_iterator
template<class _Elem,
class _Traits>
class ostreambuf_iterator
: public _Outit
{ // wrap stream buffer as output iterator
typedef ostreambuf_iterator<_Elem, _Traits> _Myt;
public:
typedef _Elem char_type;
typedef _Traits traits_type;
typedef basic_streambuf<_Elem, _Traits> streambuf_type;
typedef basic_ostream<_Elem, _Traits> ostream_type;
ostreambuf_iterator(streambuf_type *_Sb) _THROW0()
: _Failed(false), _Strbuf(_Sb)
{ // construct from stream buffer _Sb
}
ostreambuf_iterator(ostream_type& _Ostr) _THROW0()
: _Failed(false), _Strbuf(_Ostr.rdbuf())
{ // construct from stream buffer in _Ostr
}
_Myt& operator=(_Elem _Right)
{ // store element and increment
if (_Strbuf == 0
|| traits_type::eq_int_type(_Traits::eof(),
_Strbuf->sputc(_Right)))
_Failed = true;
return (*this);
}
_Myt& operator*()
{ // pretend to get designated element
return (*this);
}
_Myt& operator++()
{ // pretend to preincrement
return (*this);
}
_Myt& operator++(int)
{ // pretend to postincrement
return (*this);
}
bool failed() const _THROW0()
{ // return true if any stores failed
return (_Failed);
}
private:
bool _Failed; // true if any stores have failed
streambuf_type *_Strbuf; // the wrapped stream buffer
};
template<class _Elem,
class _Traits>
struct _Is_checked_helper<ostreambuf_iterator<_Elem, _Traits> >
: public _STD tr1::true_type
{ // mark ostreambuf_iterator as checked
};
_STD_END
#pragma pop_macro("new")
#pragma warning(pop)
#pragma pack(pop)
#endif /* RC_INVOKED */
#endif /* _STREAMBUF_ */
/*
* Copyright (c) 1992-2009 by P.J. Plauger. ALL RIGHTS RESERVED.
* Consult your license regarding permissions and restrictions.
V5.20:0009 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -