namespace std {
template<class charT, class traits = char_traits<charT>>
class basic_streambuf {
public:
using char_type = charT;
using int_type = typename traits::int_type;
using pos_type = typename traits::pos_type;
using off_type = typename traits::off_type;
using traits_type = traits;
virtual ~basic_streambuf();
locale pubimbue(const locale& loc);
locale getloc() const;
basic_streambuf* pubsetbuf(char_type* s, streamsize n);
pos_type pubseekoff(off_type off, ios_base::seekdir way,
ios_base::openmode which
= ios_base::in | ios_base::out);
pos_type pubseekpos(pos_type sp,
ios_base::openmode which
= ios_base::in | ios_base::out);
int pubsync();
streamsize in_avail();
int_type snextc();
int_type sbumpc();
int_type sgetc();
streamsize sgetn(char_type* s, streamsize n);
int_type sputbackc(char_type c);
int_type sungetc();
int_type sputc(char_type c);
streamsize sputn(const char_type* s, streamsize n);
protected:
basic_streambuf();
basic_streambuf(const basic_streambuf& rhs);
basic_streambuf& operator=(const basic_streambuf& rhs);
void swap(basic_streambuf& rhs);
char_type* eback() const;
char_type* gptr() const;
char_type* egptr() const;
void gbump(int n);
void setg(char_type* gbeg, char_type* gnext, char_type* gend);
char_type* pbase() const;
char_type* pptr() const;
char_type* epptr() const;
void pbump(int n);
void setp(char_type* pbeg, char_type* pend);
virtual void imbue(const locale& loc);
virtual basic_streambuf* setbuf(char_type* s, streamsize n);
virtual pos_type seekoff(off_type off, ios_base::seekdir way,
ios_base::openmode which
= ios_base::in | ios_base::out);
virtual pos_type seekpos(pos_type sp,
ios_base::openmode which
= ios_base::in | ios_base::out);
virtual int sync();
virtual streamsize showmanyc();
virtual streamsize xsgetn(char_type* s, streamsize n);
virtual int_type underflow();
virtual int_type uflow();
virtual int_type pbackfail(int_type c = traits::eof());
virtual streamsize xsputn(const char_type* s, streamsize n);
virtual int_type overflow(int_type c = traits::eof());
};
}
Effects: Initializes:
- all pointer member objects to null pointers,
- the
getloc()
member to a copy the global locale,
locale(),
at the time of construction.
Remarks: Once the
getloc()
member is initialized, results of calling locale member functions,
and of members of facets so obtained, can safely be cached until the
next time the member
imbue
is called
. basic_streambuf(const basic_streambuf& rhs);
Postconditions: - eback() == rhs.eback()
- gptr() == rhs.gptr()
- egptr() == rhs.egptr()
- pbase() == rhs.pbase()
- pptr() == rhs.pptr()
- epptr() == rhs.epptr()
- getloc() == rhs.getloc()
locale pubimbue(const locale& loc);
Effects: Calls
imbue(loc). Postconditions: loc == getloc(). Returns: Previous value of
getloc(). Returns: If
pubimbue()
has ever been called, then the last value of
loc supplied,
otherwise the current global locale,
locale(),
in effect at the time of construction
. If called after
pubimbue()
has been called but before
pubimbue
has returned (i.e., from within the call of
imbue())
then it returns the previous value
.basic_streambuf* pubsetbuf(char_type* s, streamsize n);
pos_type pubseekoff(off_type off, ios_base::seekdir way,
ios_base::openmode which
= ios_base::in | ios_base::out);
Returns: seekoff(off, way, which). pos_type pubseekpos(pos_type sp,
ios_base::openmode which
= ios_base::in | ios_base::out);
Returns: seekpos(sp, which). Returns: If a read position is available, returns
egptr() - gptr(). Returns: If that function returns
traits::eof(),
returns
traits::eof(). Otherwise, returns
sgetc().Effects: If the input sequence read position is not available,
returns
uflow(). Otherwise, returns
traits::to_int_type(*gptr())
and increments the next pointer for the input sequence
.Returns: If the input sequence read position is not available,
returns
underflow(). Otherwise, returns
traits::to_int_type(*gptr()).streamsize sgetn(char_type* s, streamsize n);
int_type sputbackc(char_type c);
Effects: If the input sequence putback position is not available, or
if
traits::eq(c, gptr()[-1])
is
false, returns
pbackfail(traits::to_int_type(c)). Otherwise, decrements the next pointer for the input sequence and
returns
traits::to_int_type(*gptr()).Effects: If the input sequence putback position is not available,
returns
pbackfail(). Otherwise, decrements the next pointer for the input sequence and
returns
traits::to_int_type(*gptr()).int_type sputc(char_type c);
Effects: If the output sequence write position is not available,
returns
overflow(traits::to_int_type(c)). Otherwise, stores
c at the next pointer for the output sequence,
increments the pointer, and
returns
traits::to_int_type(c).streamsize sputn(const char_type* s, streamsize n);
basic_streambuf& operator=(const basic_streambuf& rhs);
Postconditions: - eback() == rhs.eback()
- gptr() == rhs.gptr()
- egptr() == rhs.egptr()
- pbase() == rhs.pbase()
- pptr() == rhs.pptr()
- epptr() == rhs.epptr()
- getloc() == rhs.getloc()
void swap(basic_streambuf& rhs);
Effects: Swaps the data members of
rhs
and
*this. char_type* eback() const;
Returns: The beginning pointer for the input sequence
. Returns: The next pointer for the input sequence
. char_type* egptr() const;
Returns: The end pointer for the input sequence
. Effects: Adds
n to the next pointer for the input sequence
. void setg(char_type* gbeg, char_type* gnext, char_type* gend);
Postconditions: gbeg == eback(),
gnext == gptr(),
and
gend == egptr() are all
true. char_type* pbase() const;
Returns: The beginning pointer for the output sequence
. Returns: The next pointer for the output sequence
. char_type* epptr() const;
Returns: The end pointer for the output sequence
. Effects: Adds
n to the next pointer for the output sequence
. void setp(char_type* pbeg, char_type* pend);
Postconditions: pbeg == pbase(),
pbeg == pptr(),
and
pend == epptr() are all
true. void imbue(const locale&);
Effects: Change any translations based on locale
. Remarks: Allows the derived class to be informed of changes in locale at the
time they occur
. Between invocations of this function a class derived
from streambuf can safely cache results of calls to locale functions
and to members of facets so obtained
.Default behavior: Does nothing
. basic_streambuf* setbuf(char_type* s, streamsize n);
Default behavior: Does nothing
. pos_type seekoff(off_type off, ios_base::seekdir way,
ios_base::openmode which
= ios_base::in | ios_base::out);
Effects: Alters the stream positions within one or more of
the controlled sequences in a way that is defined separately for each class
derived from
basic_streambuf
in this Clause (
[stringbuf.virtuals],
[filebuf.virtuals])
. Default behavior: Returns
pos_type(off_type(-1)). pos_type seekpos(pos_type sp,
ios_base::openmode which
= ios_base::in | ios_base::out);
Effects: Alters the stream positions within one or more of
the controlled sequences in a way that is defined separately for each class
derived from
basic_streambuf
in this Clause (
[stringbuf],
[filebuf])
. Default behavior: Returns
pos_type(off_type(-1)). Effects: Synchronizes the controlled sequences with the arrays
. That is, if
pbase()
is non-null the characters between
pbase()
and
pptr()
are written to the controlled sequence
. The pointers may then be reset as appropriate
.Default behavior: Returns zero
. Returns: An estimate of the number of
characters available in the sequence, or -1
. If it returns
a positive value, then successive calls to
underflow()
will not return
traits::eof()
until at least that number of characters have been
extracted from the stream
. If
showmanyc()
returns -1, then calls to
underflow()
or
uflow()
will fail
.Default behavior: Returns zero
. Remarks: Uses
traits::eof(). streamsize xsgetn(char_type* s, streamsize n);
Effects: Assigns up to
n characters to successive elements of
the array whose first element is designated by
s. The characters assigned are read from the input sequence as if
by repeated calls to
sbumpc(). Assigning stops when either
n characters
have been assigned or a call to
sbumpc()
would return
traits::eof().Returns: The number of characters assigned
. Remarks: Uses
traits::eof(). Remarks: The public members of
basic_streambuf
call this virtual function only if
gptr()
is null or
gptr() >= egptr(). Returns: traits::to_int_type(c),
where
c is the first
character
of the
pending sequence,
without moving the input sequence position past it
. If the pending sequence is null then the function returns
traits::eof()
to indicate failure
.The
pending sequence
of characters is defined as the concatenation of
- the empty sequence if gptr() is null, otherwise the
characters in
[gptr(), egptr()),
followed by
- some (possibly empty) sequence of characters read from the input sequence.
The
result character
is
the first character of the pending sequence if it is non-empty,
otherwise
the next character that would be read from the input sequence
.The
backup sequence
is the empty sequence if
eback() is null, otherwise the
characters in
[
eback(), gptr())
.Effects: The function sets up the
gptr()
and
egptr()
such that
if the pending sequence is non-empty, then
egptr()
is non-null and
the characters in [
gptr(), egptr()) are
the characters in the pending sequence,
otherwise
either
gptr()
is null or
gptr() == egptr(). If
eback()
and
gptr()
are non-null then the function is not constrained as to their contents, but the โusual backup conditionโ is that either
- the backup sequence contains at least
gptr() - eback()
characters, in which case the characters in
[eback(), gptr())
agree with the last
gptr() - eback()
characters of the backup sequence, or
- the characters in [gptr() - n, gptr())
agree with the backup sequence (where n is the length of the backup sequence).
Default behavior: Returns
traits::eof(). Preconditions: The constraints are the same as for
underflow(),
except that the result character is transferred from the pending
sequence to the backup sequence, and the pending sequence is not empty before the transfer
. Default behavior: Calls
underflow(). If
underflow()
returns
traits::eof(),
returns
traits::eof(). Otherwise, returns the value of
traits::to_int_type(*gptr())
and increment the value of the next pointer for the input sequence
.Returns: traits::eof()
to indicate failure
. int_type pbackfail(int_type c = traits::eof());
Remarks: The public functions of
basic_streambuf
call this virtual function only when
gptr()
is null,
gptr() == eback(),
or
traits::eq(traits::to_char_type(c), gptr()[-1])
returns
false. Other calls shall also satisfy that constraint
.The
pending sequence
is defined as for
underflow(),
with the modifications that
- If
traits::eq_int_type(c, traits::eof())
returns
true,
then the input sequence is backed up one character before the pending sequence is determined.
- If
traits::eq_int_type(c, traits::eof())
returns false, then c is prepended. Whether the input sequence is backed up or modified in any other way is unspecified.
Postconditions: On return, the constraints of
gptr(),
eback(),
and
pptr()
are the same as for
underflow(). Returns: traits::eof()
to indicate failure
. Failure may occur because the input sequence could not be backed up, or if for some
other reason the pointers could not be set consistent with the constraints
. pbackfail()
is called only when put back has really failed
. Returns some value other than
traits::eof()
to indicate success
.Default behavior: Returns
traits::eof(). streamsize xsputn(const char_type* s, streamsize n);
Effects: Writes up to
n characters to the output sequence as if
by repeated calls to
sputc(c). The characters written are obtained from successive elements of
the array whose first element is designated by
s. Writing stops when either
n characters have been written or
a call to
sputc(c)
would return
traits::eof(). It is unspecified whether the function calls
overflow() when
pptr() == epptr() becomes
true or whether it achieves the same effects by other means
.Returns: The number of characters written
. int_type overflow(int_type c = traits::eof());
Effects: Consumes some initial subsequence of the characters of the
pending sequence. The pending sequence is defined as the concatenation of
- the empty sequence if pbase() is null, otherwise the
pptr() - pbase()
characters beginning at
pbase(), followed by
- the empty sequence
if
traits::eq_int_type(c, traits::eof())
returns
true, otherwise the sequence consisting of c.
Remarks: The member functions
sputc()
and
sputn()
call this function in case that
no room can be found in the put buffer enough to accommodate the
argument character sequence
. Preconditions: Every overriding definition of this virtual function
obeys the following constraints:
- The effect of consuming a character on the associated output sequence is
specified.
- Let
r
be the number of characters in the pending sequence not consumed. If
r
is nonzero then
pbase()
and
pptr()
are set so that:
pptr() - pbase() == r
and the r characters starting at
pbase()
are the associated output stream. In case r is zero (all characters of the pending sequence have been consumed)
then either
pbase()
is set to
nullptr,
or
pbase()
and
pptr()
are both set to the same non-null value.
- The function may fail if either
appending some character to the associated output stream fails or
if it is unable to establish
pbase()
and
pptr()
according to the above rules.
Returns: traits::eof()
or throws an exception
if the function fails
. Otherwise,
returns some value other than
traits::eof()
to indicate success
.Default behavior: Returns
traits::eof().