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
int_type sputc(char_type __c)
Entry point for all single-character output functions.
int_type sgetc()
Getting the next character.
bool failed() const noexcept
Return true if previous operator=() failed.
_CharT char_type
Public typedefs.
ostreambuf_iterator(streambuf_type *__s) noexcept
Construct output iterator from streambuf.
_Traits traits_type
Public typedefs.
basic_streambuf< _CharT, _Traits > streambuf_type
Public typedefs.
ostreambuf_iterator & operator++(int)
Return *this.
Template class basic_ostream.
streamsize sputn(const char_type *__s, streamsize __n)
Entry point for all single-character output functions.
_CharT char_type
Public typedefs.
ISO C++ entities toplevel namespace is std.
_Traits traits_type
Public typedefs.
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.
ostreambuf_iterator & operator=(_CharT __c)
Write character to streambuf. Calls streambuf.sputc().
basic_streambuf< _CharT, _Traits > streambuf_type
Public typedefs.
Template class basic_istream.
istreambuf_iterator(istream_type &__s) noexcept
Construct start of input stream iterator.
istreambuf_iterator operator++(int)
Advance the iterator. Calls streambuf.sbumpc().
int_type sbumpc()
Getting the next character.
istreambuf_iterator & operator++()
Advance the iterator. Calls streambuf.sbumpc().
ptrdiff_t streamsize
Integral type for I/O operation counts and buffer sizes.
ostreambuf_iterator(ostream_type &__s) noexcept
Construct output iterator from ostream.
ostreambuf_iterator & operator++()
Return *this.
istreambuf_iterator(streambuf_type *__s) noexcept
Construct start of streambuf iterator.
basic_ostream< _CharT, _Traits > ostream_type
Public typedefs.
ostreambuf_iterator & operator*()
Return *this.
bool equal(const istreambuf_iterator &__b) const
Return true both iterators are end or both are not end.
The actual work of input and output (interface).
Provides output iterator semantics for streambufs.
Provides input iterator semantics for streambufs.
_Traits::int_type int_type
Public typedefs.
constexpr istreambuf_iterator() noexcept
Construct end of input stream iterator.
basic_istream< _CharT, _Traits > istream_type
Public typedefs.