File Coverage

/usr/include/c++/5/streambuf
Criterion Covered Total %
statement 0 1 0.0
branch n/a
condition n/a
subroutine n/a
pod n/a
total 0 1 0.0


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