30 #ifndef _STREAMBUF_ITERATOR_H 
   31 #define _STREAMBUF_ITERATOR_H 1 
   33 #pragma GCC system_header 
   38 namespace std _GLIBCXX_VISIBILITY(default)
 
   40 _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
   49   template<
typename _CharT, 
typename _Traits>
 
   50     class istreambuf_iterator
 
   51     : 
public iterator<input_iterator_tag, _CharT, typename _Traits::off_type,
 
   53 #if __cplusplus >= 201103L
 
   71       template<
typename _CharT2>
 
   72     friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value,
 
   77       template<
bool _IsMove, 
typename _CharT2>
 
   78     friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value, 
 
   83       template<
typename _CharT2>
 
   84     friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value,
 
   97       mutable streambuf_type*   _M_sbuf;
 
   98       mutable int_type      _M_c;
 
  103       : _M_sbuf(0), _M_c(traits_type::eof()) { }
 
  105 #if __cplusplus >= 201103L 
  113       : _M_sbuf(__s.rdbuf()), _M_c(traits_type::eof()) { }
 
  117       : _M_sbuf(__s), _M_c(traits_type::eof()) { }
 
  125 #ifdef _GLIBCXX_DEBUG_PEDANTIC 
  128     __glibcxx_requires_cond(!_M_at_eof(),
 
  129                 _M_message(__gnu_debug::__msg_deref_istreambuf)
 
  130                 ._M_iterator(*
this));
 
  132     return traits_type::to_char_type(_M_get());
 
  139     __glibcxx_requires_cond(!_M_at_eof(),
 
  140                 _M_message(__gnu_debug::__msg_inc_istreambuf)
 
  141                 ._M_iterator(*
this));
 
  145         _M_c = traits_type::eof();
 
  154     __glibcxx_requires_cond(!_M_at_eof(),
 
  155                 _M_message(__gnu_debug::__msg_inc_istreambuf)
 
  156                 ._M_iterator(*
this));
 
  161         __old._M_c = _M_sbuf->sbumpc();
 
  162         _M_c = traits_type::eof();
 
  173       { 
return _M_at_eof() == __b._M_at_eof(); }
 
  179     const int_type __eof = traits_type::eof();
 
  180     int_type __ret = __eof;
 
  183         if (!traits_type::eq_int_type(_M_c, __eof))
 
  185         else if (!traits_type::eq_int_type((__ret = _M_sbuf->sgetc()),
 
  197     const int_type __eof = traits_type::eof();
 
  198     return traits_type::eq_int_type(_M_get(), __eof);
 
  202   template<
typename _CharT, 
typename _Traits>
 
  204     operator==(
const istreambuf_iterator<_CharT, _Traits>& __a,
 
  205            const istreambuf_iterator<_CharT, _Traits>& __b)
 
  206     { 
return __a.equal(__b); }
 
  208   template<
typename _CharT, 
typename _Traits>
 
  210     operator!=(
const istreambuf_iterator<_CharT, _Traits>& __a,
 
  211            const istreambuf_iterator<_CharT, _Traits>& __b)
 
  212     { 
return !__a.equal(__b); }
 
  215   template<
typename _CharT, 
typename _Traits>
 
  216     class ostreambuf_iterator
 
  217     : 
public iterator<output_iterator_tag, void, void, void, void>
 
  229       template<
typename _CharT2>
 
  230     friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value,
 
  236       streambuf_type*   _M_sbuf;
 
  242       : _M_sbuf(__s.rdbuf()), _M_failed(!_M_sbuf) { }
 
  246       : _M_sbuf(__s), _M_failed(!_M_sbuf) { }
 
  253         _Traits::eq_int_type(_M_sbuf->sputc(__c), _Traits::eof()))
 
  276       { 
return _M_failed; }
 
  281     if (__builtin_expect(!_M_failed, 
true)
 
  282         && __builtin_expect(this->_M_sbuf->sputn(__ws, __len) != __len,
 
  290   template<
typename _CharT>
 
  291     typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
 
  292                                 ostreambuf_iterator<_CharT> >::__type
 
  293     copy(istreambuf_iterator<_CharT> __first,
 
  294      istreambuf_iterator<_CharT> __last,
 
  295      ostreambuf_iterator<_CharT> __result)
 
  297       if (__first._M_sbuf && !__last._M_sbuf && !__result._M_failed)
 
  300       __copy_streambufs_eof(__first._M_sbuf, __result._M_sbuf, __ineof);
 
  302         __result._M_failed = 
true;
 
  307   template<
bool _IsMove, 
typename _CharT>
 
  308     typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value, 
 
  309                         ostreambuf_iterator<_CharT> >::__type
 
  310     __copy_move_a2(_CharT* __first, _CharT* __last,
 
  311            ostreambuf_iterator<_CharT> __result)
 
  315     __result._M_put(__first, __num);
 
  319   template<
bool _IsMove, 
typename _CharT>
 
  320     typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
 
  321                     ostreambuf_iterator<_CharT> >::__type
 
  322     __copy_move_a2(
const _CharT* __first, 
const _CharT* __last,
 
  323            ostreambuf_iterator<_CharT> __result)
 
  327     __result._M_put(__first, __num);
 
  331   template<
bool _IsMove, 
typename _CharT>
 
  332     typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value, 
 
  334     __copy_move_a2(istreambuf_iterator<_CharT> __first,
 
  335            istreambuf_iterator<_CharT> __last, _CharT* __result)
 
  337       typedef istreambuf_iterator<_CharT>                  __is_iterator_type;
 
  338       typedef typename __is_iterator_type::traits_type     traits_type;
 
  339       typedef typename __is_iterator_type::streambuf_type  streambuf_type;
 
  340       typedef typename traits_type::int_type               int_type;
 
  342       if (__first._M_sbuf && !__last._M_sbuf)
 
  344       streambuf_type* __sb = __first._M_sbuf;
 
  345       int_type __c = __sb->sgetc();
 
  346       while (!traits_type::eq_int_type(__c, traits_type::eof()))
 
  348           const streamsize __n = __sb->egptr() - __sb->gptr();
 
  351           traits_type::copy(__result, __sb->gptr(), __n);
 
  352           __sb->__safe_gbump(__n);
 
  354           __c = __sb->underflow();
 
  358           *__result++ = traits_type::to_char_type(__c);
 
  359           __c = __sb->snextc();
 
  366   template<
typename _CharT>
 
  367     typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
 
  368                     istreambuf_iterator<_CharT> >::__type
 
  369     find(istreambuf_iterator<_CharT> __first,
 
  370      istreambuf_iterator<_CharT> __last, 
const _CharT& __val)
 
  372       typedef istreambuf_iterator<_CharT>                  __is_iterator_type;
 
  373       typedef typename __is_iterator_type::traits_type     traits_type;
 
  374       typedef typename __is_iterator_type::streambuf_type  streambuf_type;
 
  375       typedef typename traits_type::int_type               int_type;
 
  377       if (__first._M_sbuf && !__last._M_sbuf)
 
  379       const int_type __ival = traits_type::to_int_type(__val);
 
  380       streambuf_type* __sb = __first._M_sbuf;
 
  381       int_type __c = __sb->sgetc();
 
  382       while (!traits_type::eq_int_type(__c, traits_type::eof())
 
  383          && !traits_type::eq_int_type(__c, __ival))
 
  385           streamsize __n = __sb->egptr() - __sb->gptr();
 
  388           const _CharT* __p = traits_type::find(__sb->gptr(),
 
  391             __n = __p - __sb->gptr();
 
  392           __sb->__safe_gbump(__n);
 
  396         __c = __sb->snextc();
 
  399       if (!traits_type::eq_int_type(__c, traits_type::eof()))
 
  409 _GLIBCXX_END_NAMESPACE_VERSION
 
_CharT char_type
Public typedefs. 
basic_istream< _CharT, _Traits > istream_type
Public typedefs. 
Provides output iterator semantics for streambufs. 
ostreambuf_iterator & operator=(_CharT __c)
Write character to streambuf. Calls streambuf.sputc(). 
Provides input iterator semantics for streambufs. 
istreambuf_iterator & operator++()
Advance the iterator. Calls streambuf.sbumpc(). 
basic_ostream< _CharT, _Traits > ostream_type
Public typedefs. 
istreambuf_iterator operator++(int)
Advance the iterator. Calls streambuf.sbumpc(). 
bool equal(const istreambuf_iterator &__b) const 
Return true both iterators are end or both are not end. 
_Traits::int_type int_type
Public typedefs. 
bool failed() const noexcept
Return true if previous operator=() failed. 
istreambuf_iterator(istream_type &__s) noexcept
Construct start of input stream iterator. 
constexpr istreambuf_iterator() noexcept
Construct end of input stream iterator. 
ptrdiff_t streamsize
Integral type for I/O operation counts and buffer sizes. 
ostreambuf_iterator & operator++(int)
Return *this. 
istreambuf_iterator(streambuf_type *__s) noexcept
Construct start of streambuf iterator. 
ISO C++ entities toplevel namespace is std. 
basic_streambuf< _CharT, _Traits > streambuf_type
Public typedefs. 
ostreambuf_iterator(streambuf_type *__s) noexcept
Construct output iterator from streambuf. 
ostreambuf_iterator(ostream_type &__s) noexcept
Construct output iterator from ostream. 
_Traits traits_type
Public typedefs. 
_CharT char_type
Public typedefs. 
ostreambuf_iterator & operator*()
Return *this. 
basic_streambuf< _CharT, _Traits > streambuf_type
Public typedefs. 
ostreambuf_iterator & operator++()
Return *this. 
char_type operator*() const 
Return the current character pointed to by iterator. This returns streambuf.sgetc(). It cannot be assigned. NB: The result of operator*() on an end of stream is undefined. 
_Traits traits_type
Public typedefs.