libstdc++
streambuf
Go to the documentation of this file.
1 // Stream buffer classes -*- C++ -*-
2 
3 // Copyright (C) 1997-2022 Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library. This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
9 // any later version.
10 
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
15 
16 // Under Section 7 of GPL version 3, you are granted additional
17 // permissions described in the GCC Runtime Library Exception, version
18 // 3.1, as published by the Free Software Foundation.
19 
20 // You should have received a copy of the GNU General Public License and
21 // a copy of the GCC Runtime Library Exception along with this program;
22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 // <http://www.gnu.org/licenses/>.
24 
25 /** @file include/streambuf
26  * This is a Standard C++ Library header.
27  */
28 
29 //
30 // ISO C++ 14882: 27.5 Stream buffers
31 //
32 
33 #ifndef _GLIBXX_STREAMBUF
34 #define _GLIBXX_STREAMBUF 1
35 
36 #pragma GCC system_header
37 
38 #include <bits/c++config.h>
39 #include <iosfwd>
40 #include <bits/localefwd.h>
41 #include <bits/ios_base.h>
42 #include <bits/cpp_type_traits.h>
43 #include <ext/type_traits.h>
44 
45 namespace std _GLIBCXX_VISIBILITY(default)
46 {
47 _GLIBCXX_BEGIN_NAMESPACE_VERSION
48 
49 #define _IsUnused __attribute__ ((__unused__))
50 
51  template<typename _CharT, typename _Traits>
52  streamsize
53  __copy_streambufs_eof(basic_streambuf<_CharT, _Traits>*,
54  basic_streambuf<_CharT, _Traits>*, bool&);
55 
56  /**
57  * @brief The actual work of input and output (interface).
58  * @ingroup io
59  *
60  * @tparam _CharT Type of character stream.
61  * @tparam _Traits Traits for character type, defaults to
62  * char_traits<_CharT>.
63  *
64  * This is a base class. Derived stream buffers each control a
65  * pair of character sequences: one for input, and one for output.
66  *
67  * Section [27.5.1] of the standard describes the requirements and
68  * behavior of stream buffer classes. That section (three paragraphs)
69  * is reproduced here, for simplicity and accuracy.
70  *
71  * -# Stream buffers can impose various constraints on the sequences
72  * they control. Some constraints are:
73  * - The controlled input sequence can be not readable.
74  * - The controlled output sequence can be not writable.
75  * - The controlled sequences can be associated with the contents of
76  * other representations for character sequences, such as external
77  * files.
78  * - The controlled sequences can support operations @e directly to or
79  * from associated sequences.
80  * - The controlled sequences can impose limitations on how the
81  * program can read characters from a sequence, write characters to
82  * a sequence, put characters back into an input sequence, or alter
83  * the stream position.
84  * .
85  * -# Each sequence is characterized by three pointers which, if non-null,
86  * all point into the same @c charT array object. The array object
87  * represents, at any moment, a (sub)sequence of characters from the
88  * sequence. Operations performed on a sequence alter the values
89  * stored in these pointers, perform reads and writes directly to or
90  * from associated sequences, and alter <em>the stream position</em> and
91  * conversion state as needed to maintain this subsequence relationship.
92  * The three pointers are:
93  * - the <em>beginning pointer</em>, or lowest element address in the
94  * array (called @e xbeg here);
95  * - the <em>next pointer</em>, or next element address that is a
96  * current candidate for reading or writing (called @e xnext here);
97  * - the <em>end pointer</em>, or first element address beyond the
98  * end of the array (called @e xend here).
99  * .
100  * -# The following semantic constraints shall always apply for any set
101  * of three pointers for a sequence, using the pointer names given
102  * immediately above:
103  * - If @e xnext is not a null pointer, then @e xbeg and @e xend shall
104  * also be non-null pointers into the same @c charT array, as
105  * described above; otherwise, @e xbeg and @e xend shall also be null.
106  * - If @e xnext is not a null pointer and @e xnext < @e xend for an
107  * output sequence, then a <em>write position</em> is available.
108  * In this case, @e *xnext shall be assignable as the next element
109  * to write (to put, or to store a character value, into the sequence).
110  * - If @e xnext is not a null pointer and @e xbeg < @e xnext for an
111  * input sequence, then a <em>putback position</em> is available.
112  * In this case, @e xnext[-1] shall have a defined value and is the
113  * next (preceding) element to store a character that is put back
114  * into the input sequence.
115  * - If @e xnext is not a null pointer and @e xnext< @e xend for an
116  * input sequence, then a <em>read position</em> is available.
117  * In this case, @e *xnext shall have a defined value and is the
118  * next element to read (to get, or to obtain a character value,
119  * from the sequence).
120  */
121  template<typename _CharT, typename _Traits>
122  class basic_streambuf
123  {
124  public:
125  ///@{
126  /**
127  * These are standard types. They permit a standardized way of
128  * referring to names of (or names dependent on) the template
129  * parameters, which are specific to the implementation.
130  */
131  typedef _CharT char_type;
132  typedef _Traits traits_type;
133  typedef typename traits_type::int_type int_type;
134  typedef typename traits_type::pos_type pos_type;
135  typedef typename traits_type::off_type off_type;
136  ///@}
137 
138  ///@{
139  /// This is a non-standard type.
140  typedef basic_streambuf<char_type, traits_type> __streambuf_type;
141  ///@}
142 
143  friend class basic_ios<char_type, traits_type>;
144  friend class basic_istream<char_type, traits_type>;
145  friend class basic_ostream<char_type, traits_type>;
146  friend class istreambuf_iterator<char_type, traits_type>;
147  friend class ostreambuf_iterator<char_type, traits_type>;
148 
149  friend streamsize
150  __copy_streambufs_eof<>(basic_streambuf*, basic_streambuf*, bool&);
151 
152  template<bool _IsMove, typename _CharT2>
153  friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value,
154  _CharT2*>::__type
155  __copy_move_a2(istreambuf_iterator<_CharT2>,
156  istreambuf_iterator<_CharT2>, _CharT2*);
157 
158  template<typename _CharT2>
159  friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value,
160  istreambuf_iterator<_CharT2> >::__type
161  find(istreambuf_iterator<_CharT2>, istreambuf_iterator<_CharT2>,
162  const _CharT2&);
163 
164  template<typename _CharT2, typename _Distance>
165  friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value,
166  void>::__type
167  advance(istreambuf_iterator<_CharT2>&, _Distance);
168 
169  friend void __istream_extract(istream&, char*, streamsize);
170 
171  template<typename _CharT2, typename _Traits2, typename _Alloc>
172  friend basic_istream<_CharT2, _Traits2>&
173  operator>>(basic_istream<_CharT2, _Traits2>&,
174  basic_string<_CharT2, _Traits2, _Alloc>&);
175 
176  template<typename _CharT2, typename _Traits2, typename _Alloc>
177  friend basic_istream<_CharT2, _Traits2>&
178  getline(basic_istream<_CharT2, _Traits2>&,
179  basic_string<_CharT2, _Traits2, _Alloc>&, _CharT2);
180 
181  protected:
182  /*
183  * This is based on _IO_FILE, just reordered to be more consistent,
184  * and is intended to be the most minimal abstraction for an
185  * internal buffer.
186  * - get == input == read
187  * - put == output == write
188  */
189  char_type* _M_in_beg; ///< Start of get area.
190  char_type* _M_in_cur; ///< Current read area.
191  char_type* _M_in_end; ///< End of get area.
192  char_type* _M_out_beg; ///< Start of put area.
193  char_type* _M_out_cur; ///< Current put area.
194  char_type* _M_out_end; ///< End of put area.
195 
196  /// Current locale setting.
197  locale _M_buf_locale;
198 
199  public:
200  /// Destructor deallocates no buffer space.
201  virtual
202  ~basic_streambuf()
203  { }
204 
205  // [27.5.2.2.1] locales
206  /**
207  * @brief Entry point for imbue().
208  * @param __loc The new locale.
209  * @return The previous locale.
210  *
211  * Calls the derived imbue(__loc).
212  */
213  locale
214  pubimbue(const locale& __loc)
215  {
216  locale __tmp(this->getloc());
217  this->imbue(__loc);
218  _M_buf_locale = __loc;
219  return __tmp;
220  }
221 
222  /**
223  * @brief Locale access.
224  * @return The current locale in effect.
225  *
226  * If pubimbue(loc) has been called, then the most recent @c loc
227  * is returned. Otherwise the global locale in effect at the time
228  * of construction is returned.
229  */
230  locale
231  getloc() const
232  { return _M_buf_locale; }
233 
234  // [27.5.2.2.2] buffer management and positioning
235  ///@{
236  /**
237  * @brief Entry points for derived buffer functions.
238  *
239  * The public versions of @c pubfoo dispatch to the protected
240  * derived @c foo member functions, passing the arguments (if any)
241  * and returning the result unchanged.
242  */
243  basic_streambuf*
244  pubsetbuf(char_type* __s, streamsize __n)
245  { return this->setbuf(__s, __n); }
246 
247  /**
248  * @brief Alters the stream position.
249  * @param __off Offset.
250  * @param __way Value for ios_base::seekdir.
251  * @param __mode Value for ios_base::openmode.
252  *
253  * Calls virtual seekoff function.
254  */
255  pos_type
256  pubseekoff(off_type __off, ios_base::seekdir __way,
257  ios_base::openmode __mode = ios_base::in | ios_base::out)
258  { return this->seekoff(__off, __way, __mode); }
259 
260  /**
261  * @brief Alters the stream position.
262  * @param __sp Position
263  * @param __mode Value for ios_base::openmode.
264  *
265  * Calls virtual seekpos function.
266  */
267  pos_type
268  pubseekpos(pos_type __sp,
269  ios_base::openmode __mode = ios_base::in | ios_base::out)
270  { return this->seekpos(__sp, __mode); }
271 
272  /**
273  * @brief Calls virtual sync function.
274  */
275  int
276  pubsync() { return this->sync(); }
277  ///@}
278 
279  // [27.5.2.2.3] get area
280  /**
281  * @brief Looking ahead into the stream.
282  * @return The number of characters available.
283  *
284  * If a read position is available, returns the number of characters
285  * available for reading before the buffer must be refilled.
286  * Otherwise returns the derived @c showmanyc().
287  */
288  streamsize
289  in_avail()
290  {
291  const streamsize __ret = this->egptr() - this->gptr();
292  return __ret ? __ret : this->showmanyc();
293  }
294 
295  /**
296  * @brief Getting the next character.
297  * @return The next character, or eof.
298  *
299  * Calls @c sbumpc(), and if that function returns
300  * @c traits::eof(), so does this function. Otherwise, @c sgetc().
301  */
302  int_type
303  snextc()
304  {
305  int_type __ret = traits_type::eof();
306  if (__builtin_expect(!traits_type::eq_int_type(this->sbumpc(),
307  __ret), true))
308  __ret = this->sgetc();
309  return __ret;
310  }
311 
312  /**
313  * @brief Getting the next character.
314  * @return The next character, or eof.
315  *
316  * If the input read position is available, returns that character
317  * and increments the read pointer, otherwise calls and returns
318  * @c uflow().
319  */
320  int_type
321  sbumpc()
322  {
323  int_type __ret;
324  if (__builtin_expect(this->gptr() < this->egptr(), true))
325  {
326  __ret = traits_type::to_int_type(*this->gptr());
327  this->gbump(1);
328  }
329  else
330  __ret = this->uflow();
331  return __ret;
332  }
333 
334  /**
335  * @brief Getting the next character.
336  * @return The next character, or eof.
337  *
338  * If the input read position is available, returns that character,
339  * otherwise calls and returns @c underflow(). Does not move the
340  * read position after fetching the character.
341  */
342  int_type
343  sgetc()
344  {
345  int_type __ret;
346  if (__builtin_expect(this->gptr() < this->egptr(), true))
347  __ret = traits_type::to_int_type(*this->gptr());
348  else
349  __ret = this->underflow();
350  return __ret;
351  }
352 
353  /**
354  * @brief Entry point for xsgetn.
355  * @param __s A buffer area.
356  * @param __n A count.
357  *
358  * Returns xsgetn(__s,__n). The effect is to fill @a __s[0] through
359  * @a __s[__n-1] with characters from the input sequence, if possible.
360  */
361  streamsize
362  sgetn(char_type* __s, streamsize __n)
363  { return this->xsgetn(__s, __n); }
364 
365  // [27.5.2.2.4] putback
366  /**
367  * @brief Pushing characters back into the input stream.
368  * @param __c The character to push back.
369  * @return The previous character, if possible.
370  *
371  * Similar to sungetc(), but @a __c is pushed onto the stream
372  * instead of <em>the previous character.</em> If successful,
373  * the next character fetched from the input stream will be @a
374  * __c.
375  */
376  int_type
377  sputbackc(char_type __c)
378  {
379  int_type __ret;
380  const bool __testpos = this->eback() < this->gptr();
381  if (__builtin_expect(!__testpos ||
382  !traits_type::eq(__c, this->gptr()[-1]), false))
383  __ret = this->pbackfail(traits_type::to_int_type(__c));
384  else
385  {
386  this->gbump(-1);
387  __ret = traits_type::to_int_type(*this->gptr());
388  }
389  return __ret;
390  }
391 
392  /**
393  * @brief Moving backwards in the input stream.
394  * @return The previous character, if possible.
395  *
396  * If a putback position is available, this function decrements
397  * the input pointer and returns that character. Otherwise,
398  * calls and returns pbackfail(). The effect is to @a unget
399  * the last character @a gotten.
400  */
401  int_type
402  sungetc()
403  {
404  int_type __ret;
405  if (__builtin_expect(this->eback() < this->gptr(), true))
406  {
407  this->gbump(-1);
408  __ret = traits_type::to_int_type(*this->gptr());
409  }
410  else
411  __ret = this->pbackfail();
412  return __ret;
413  }
414 
415  // [27.5.2.2.5] put area
416  /**
417  * @brief Entry point for all single-character output functions.
418  * @param __c A character to output.
419  * @return @a __c, if possible.
420  *
421  * One of two public output functions.
422  *
423  * If a write position is available for the output sequence (i.e.,
424  * the buffer is not full), stores @a __c in that position, increments
425  * the position, and returns @c traits::to_int_type(__c). If a write
426  * position is not available, returns @c overflow(__c).
427  */
428  int_type
429  sputc(char_type __c)
430  {
431  int_type __ret;
432  if (__builtin_expect(this->pptr() < this->epptr(), true))
433  {
434  *this->pptr() = __c;
435  this->pbump(1);
436  __ret = traits_type::to_int_type(__c);
437  }
438  else
439  __ret = this->overflow(traits_type::to_int_type(__c));
440  return __ret;
441  }
442 
443  /**
444  * @brief Entry point for all single-character output functions.
445  * @param __s A buffer read area.
446  * @param __n A count.
447  *
448  * One of two public output functions.
449  *
450  *
451  * Returns xsputn(__s,__n). The effect is to write @a __s[0] through
452  * @a __s[__n-1] to the output sequence, if possible.
453  */
454  streamsize
455  sputn(const char_type* __s, streamsize __n)
456  { return this->xsputn(__s, __n); }
457 
458  protected:
459  /**
460  * @brief Base constructor.
461  *
462  * Only called from derived constructors, and sets up all the
463  * buffer data to zero, including the pointers described in the
464  * basic_streambuf class description. Note that, as a result,
465  * - the class starts with no read nor write positions available,
466  * - this is not an error
467  */
468  basic_streambuf()
469  : _M_in_beg(0), _M_in_cur(0), _M_in_end(0),
470  _M_out_beg(0), _M_out_cur(0), _M_out_end(0),
471  _M_buf_locale(locale())
472  { }
473 
474  // [27.5.2.3.1] get area access
475  ///@{
476  /**
477  * @brief Access to the get area.
478  *
479  * These functions are only available to other protected functions,
480  * including derived classes.
481  *
482  * - eback() returns the beginning pointer for the input sequence
483  * - gptr() returns the next pointer for the input sequence
484  * - egptr() returns the end pointer for the input sequence
485  */
486  char_type*
487  eback() const { return _M_in_beg; }
488 
489  char_type*
490  gptr() const { return _M_in_cur; }
491 
492  char_type*
493  egptr() const { return _M_in_end; }
494  ///@}
495 
496  /**
497  * @brief Moving the read position.
498  * @param __n The delta by which to move.
499  *
500  * This just advances the read position without returning any data.
501  */
502  void
503  gbump(int __n) { _M_in_cur += __n; }
504 
505  /**
506  * @brief Setting the three read area pointers.
507  * @param __gbeg A pointer.
508  * @param __gnext A pointer.
509  * @param __gend A pointer.
510  * @post @a __gbeg == @c eback(), @a __gnext == @c gptr(), and
511  * @a __gend == @c egptr()
512  */
513  void
514  setg(char_type* __gbeg, char_type* __gnext, char_type* __gend)
515  {
516  _M_in_beg = __gbeg;
517  _M_in_cur = __gnext;
518  _M_in_end = __gend;
519  }
520 
521  // [27.5.2.3.2] put area access
522  ///@{
523  /**
524  * @brief Access to the put area.
525  *
526  * These functions are only available to other protected functions,
527  * including derived classes.
528  *
529  * - pbase() returns the beginning pointer for the output sequence
530  * - pptr() returns the next pointer for the output sequence
531  * - epptr() returns the end pointer for the output sequence
532  */
533  char_type*
534  pbase() const { return _M_out_beg; }
535 
536  char_type*
537  pptr() const { return _M_out_cur; }
538 
539  char_type*
540  epptr() const { return _M_out_end; }
541  ///@}
542 
543  /**
544  * @brief Moving the write position.
545  * @param __n The delta by which to move.
546  *
547  * This just advances the write position without returning any data.
548  */
549  void
550  pbump(int __n) { _M_out_cur += __n; }
551 
552  /**
553  * @brief Setting the three write area pointers.
554  * @param __pbeg A pointer.
555  * @param __pend A pointer.
556  * @post @a __pbeg == @c pbase(), @a __pbeg == @c pptr(), and
557  * @a __pend == @c epptr()
558  */
559  void
560  setp(char_type* __pbeg, char_type* __pend)
561  {
562  _M_out_beg = _M_out_cur = __pbeg;
563  _M_out_end = __pend;
564  }
565 
566  // [27.5.2.4] virtual functions
567  // [27.5.2.4.1] locales
568  /**
569  * @brief Changes translations.
570  * @param __loc A new locale.
571  *
572  * Translations done during I/O which depend on the current
573  * locale are changed by this call. The standard adds,
574  * <em>Between invocations of this function a class derived
575  * from streambuf can safely cache results of calls to locale
576  * functions and to members of facets so obtained.</em>
577  *
578  * @note Base class version does nothing.
579  */
580  virtual void
581  imbue(const locale& __loc _IsUnused)
582  { }
583 
584  // [27.5.2.4.2] buffer management and positioning
585  /**
586  * @brief Manipulates the buffer.
587  *
588  * Each derived class provides its own appropriate behavior. See
589  * the next-to-last paragraph of
590  * https://gcc.gnu.org/onlinedocs/libstdc++/manual/streambufs.html#io.streambuf.buffering
591  * for more on this function.
592  *
593  * @note Base class version does nothing, returns @c this.
594  */
595  virtual basic_streambuf<char_type,_Traits>*
596  setbuf(char_type*, streamsize)
597  { return this; }
598 
599  /**
600  * @brief Alters the stream positions.
601  *
602  * Each derived class provides its own appropriate behavior.
603  * @note Base class version does nothing, returns a @c pos_type
604  * that represents an invalid stream position.
605  */
606  virtual pos_type
607  seekoff(off_type, ios_base::seekdir,
608  ios_base::openmode /*__mode*/ = ios_base::in | ios_base::out)
609  { return pos_type(off_type(-1)); }
610 
611  /**
612  * @brief Alters the stream positions.
613  *
614  * Each derived class provides its own appropriate behavior.
615  * @note Base class version does nothing, returns a @c pos_type
616  * that represents an invalid stream position.
617  */
618  virtual pos_type
619  seekpos(pos_type,
620  ios_base::openmode /*__mode*/ = ios_base::in | ios_base::out)
621  { return pos_type(off_type(-1)); }
622 
623  /**
624  * @brief Synchronizes the buffer arrays with the controlled sequences.
625  * @return -1 on failure.
626  *
627  * Each derived class provides its own appropriate behavior,
628  * including the definition of @a failure.
629  * @note Base class version does nothing, returns zero.
630  */
631  virtual int
632  sync() { return 0; }
633 
634  // [27.5.2.4.3] get area
635  /**
636  * @brief Investigating the data available.
637  * @return An estimate of the number of characters available in the
638  * input sequence, or -1.
639  *
640  * <em>If it returns a positive value, then successive calls to
641  * @c underflow() will not return @c traits::eof() until at
642  * least that number of characters have been supplied. If @c
643  * showmanyc() returns -1, then calls to @c underflow() or @c
644  * uflow() will fail.</em> [27.5.2.4.3]/1
645  *
646  * @note Base class version does nothing, returns zero.
647  * @note The standard adds that <em>the intention is not only that the
648  * calls [to underflow or uflow] will not return @c eof() but
649  * that they will return immediately.</em>
650  * @note The standard adds that <em>the morphemes of @c showmanyc are
651  * @b es-how-many-see, not @b show-manic.</em>
652  */
653  virtual streamsize
654  showmanyc() { return 0; }
655 
656  /**
657  * @brief Multiple character extraction.
658  * @param __s A buffer area.
659  * @param __n Maximum number of characters to assign.
660  * @return The number of characters assigned.
661  *
662  * Fills @a __s[0] through @a __s[__n-1] with characters from the input
663  * sequence, as if by @c sbumpc(). Stops when either @a __n characters
664  * have been copied, or when @c traits::eof() would be copied.
665  *
666  * It is expected that derived classes provide a more efficient
667  * implementation by overriding this definition.
668  */
669  virtual streamsize
670  xsgetn(char_type* __s, streamsize __n);
671 
672  /**
673  * @brief Fetches more data from the controlled sequence.
674  * @return The first character from the <em>pending sequence</em>.
675  *
676  * Informally, this function is called when the input buffer is
677  * exhausted (or does not exist, as buffering need not actually be
678  * done). If a buffer exists, it is @a refilled. In either case, the
679  * next available character is returned, or @c traits::eof() to
680  * indicate a null pending sequence.
681  *
682  * For a formal definition of the pending sequence, see a good text
683  * such as Langer & Kreft, or [27.5.2.4.3]/7-14.
684  *
685  * A functioning input streambuf can be created by overriding only
686  * this function (no buffer area will be used). For an example, see
687  * https://gcc.gnu.org/onlinedocs/libstdc++/manual/streambufs.html
688  *
689  * @note Base class version does nothing, returns eof().
690  */
691  virtual int_type
692  underflow()
693  { return traits_type::eof(); }
694 
695  /**
696  * @brief Fetches more data from the controlled sequence.
697  * @return The first character from the <em>pending sequence</em>.
698  *
699  * Informally, this function does the same thing as @c underflow(),
700  * and in fact is required to call that function. It also returns
701  * the new character, like @c underflow() does. However, this
702  * function also moves the read position forward by one.
703  */
704  virtual int_type
705  uflow()
706  {
707  int_type __ret = traits_type::eof();
708  const bool __testeof = traits_type::eq_int_type(this->underflow(),
709  __ret);
710  if (!__testeof)
711  {
712  __ret = traits_type::to_int_type(*this->gptr());
713  this->gbump(1);
714  }
715  return __ret;
716  }
717 
718  // [27.5.2.4.4] putback
719  /**
720  * @brief Tries to back up the input sequence.
721  * @param __c The character to be inserted back into the sequence.
722  * @return eof() on failure, <em>some other value</em> on success
723  * @post The constraints of @c gptr(), @c eback(), and @c pptr()
724  * are the same as for @c underflow().
725  *
726  * @note Base class version does nothing, returns eof().
727  */
728  virtual int_type
729  pbackfail(int_type __c _IsUnused = traits_type::eof())
730  { return traits_type::eof(); }
731 
732  // Put area:
733  /**
734  * @brief Multiple character insertion.
735  * @param __s A buffer area.
736  * @param __n Maximum number of characters to write.
737  * @return The number of characters written.
738  *
739  * Writes @a __s[0] through @a __s[__n-1] to the output sequence, as if
740  * by @c sputc(). Stops when either @a n characters have been
741  * copied, or when @c sputc() would return @c traits::eof().
742  *
743  * It is expected that derived classes provide a more efficient
744  * implementation by overriding this definition.
745  */
746  virtual streamsize
747  xsputn(const char_type* __s, streamsize __n);
748 
749  /**
750  * @brief Consumes data from the buffer; writes to the
751  * controlled sequence.
752  * @param __c An additional character to consume.
753  * @return eof() to indicate failure, something else (usually
754  * @a __c, or not_eof())
755  *
756  * Informally, this function is called when the output buffer
757  * is full (or does not exist, as buffering need not actually
758  * be done). If a buffer exists, it is @a consumed, with
759  * <em>some effect</em> on the controlled sequence.
760  * (Typically, the buffer is written out to the sequence
761  * verbatim.) In either case, the character @a c is also
762  * written out, if @a __c is not @c eof().
763  *
764  * For a formal definition of this function, see a good text
765  * such as Langer & Kreft, or [27.5.2.4.5]/3-7.
766  *
767  * A functioning output streambuf can be created by overriding only
768  * this function (no buffer area will be used).
769  *
770  * @note Base class version does nothing, returns eof().
771  */
772  virtual int_type
773  overflow(int_type __c _IsUnused = traits_type::eof())
774  { return traits_type::eof(); }
775 
776 #if _GLIBCXX_USE_DEPRECATED && __cplusplus <= 201402L
777  // Annex D.6 (removed in C++17)
778  public:
779  /**
780  * @brief Tosses a character.
781  *
782  * Advances the read pointer, ignoring the character that would have
783  * been read.
784  *
785  * See http://gcc.gnu.org/ml/libstdc++/2002-05/msg00168.html
786  */
787  _GLIBCXX_DEPRECATED_SUGGEST("std::basic_streambuf::sbumpc")
788  void
789  stossc()
790  {
791  if (this->gptr() < this->egptr())
792  this->gbump(1);
793  else
794  this->uflow();
795  }
796 #endif
797 
798  // Also used by specializations for char and wchar_t in src.
799  void
800  __safe_gbump(streamsize __n) { _M_in_cur += __n; }
801 
802  void
803  __safe_pbump(streamsize __n) { _M_out_cur += __n; }
804 
805 #if __cplusplus < 201103L
806  private:
807 #else
808  protected:
809 #endif
810  basic_streambuf(const basic_streambuf&);
811 
812  basic_streambuf&
813  operator=(const basic_streambuf&);
814 
815 #if __cplusplus >= 201103L
816  void
817  swap(basic_streambuf& __sb)
818  {
819  std::swap(_M_in_beg, __sb._M_in_beg);
820  std::swap(_M_in_cur, __sb._M_in_cur);
821  std::swap(_M_in_end, __sb._M_in_end);
822  std::swap(_M_out_beg, __sb._M_out_beg);
823  std::swap(_M_out_cur, __sb._M_out_cur);
824  std::swap(_M_out_end, __sb._M_out_end);
825  std::swap(_M_buf_locale, __sb._M_buf_locale);
826  }
827 #endif
828  };
829 
830 #if __cplusplus >= 201103L
831  template<typename _CharT, typename _Traits>
832  std::basic_streambuf<_CharT, _Traits>::
833  basic_streambuf(const basic_streambuf&) = default;
834 
835  template<typename _CharT, typename _Traits>
836  std::basic_streambuf<_CharT, _Traits>&
837  std::basic_streambuf<_CharT, _Traits>::
838  operator=(const basic_streambuf&) = default;
839 #endif
840 
841  // Explicit specialization declarations, defined in src/streambuf.cc.
842  template<>
843  streamsize
844  __copy_streambufs_eof(basic_streambuf<char>* __sbin,
845  basic_streambuf<char>* __sbout, bool& __ineof);
846 #ifdef _GLIBCXX_USE_WCHAR_T
847  template<>
848  streamsize
849  __copy_streambufs_eof(basic_streambuf<wchar_t>* __sbin,
850  basic_streambuf<wchar_t>* __sbout, bool& __ineof);
851 #endif
852 
853 #undef _IsUnused
854 
855 _GLIBCXX_END_NAMESPACE_VERSION
856 } // namespace
857 
858 #include <bits/streambuf.tcc>
859 
860 #endif /* _GLIBCXX_STREAMBUF */