xref: /freebsd/contrib/llvm-project/libcxx/include/streambuf (revision 0b57cec536236d46e3dba9bd041533462f33dbb7)
1*0b57cec5SDimitry Andric// -*- C++ -*-
2*0b57cec5SDimitry Andric//===------------------------- streambuf ----------------------------------===//
3*0b57cec5SDimitry Andric//
4*0b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5*0b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
6*0b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7*0b57cec5SDimitry Andric//
8*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
9*0b57cec5SDimitry Andric
10*0b57cec5SDimitry Andric#ifndef _LIBCPP_STEAMBUF
11*0b57cec5SDimitry Andric#define _LIBCPP_STEAMBUF
12*0b57cec5SDimitry Andric
13*0b57cec5SDimitry Andric/*
14*0b57cec5SDimitry Andric    streambuf synopsis
15*0b57cec5SDimitry Andric
16*0b57cec5SDimitry Andricnamespace std
17*0b57cec5SDimitry Andric{
18*0b57cec5SDimitry Andric
19*0b57cec5SDimitry Andrictemplate <class charT, class traits = char_traits<charT> >
20*0b57cec5SDimitry Andricclass basic_streambuf
21*0b57cec5SDimitry Andric{
22*0b57cec5SDimitry Andricpublic:
23*0b57cec5SDimitry Andric    // types:
24*0b57cec5SDimitry Andric    typedef charT char_type;
25*0b57cec5SDimitry Andric    typedef traits traits_type;
26*0b57cec5SDimitry Andric    typedef typename traits_type::int_type int_type;
27*0b57cec5SDimitry Andric    typedef typename traits_type::pos_type pos_type;
28*0b57cec5SDimitry Andric    typedef typename traits_type::off_type off_type;
29*0b57cec5SDimitry Andric
30*0b57cec5SDimitry Andric    virtual ~basic_streambuf();
31*0b57cec5SDimitry Andric
32*0b57cec5SDimitry Andric    // 27.6.2.2.1 locales:
33*0b57cec5SDimitry Andric    locale pubimbue(const locale& loc);
34*0b57cec5SDimitry Andric    locale getloc() const;
35*0b57cec5SDimitry Andric
36*0b57cec5SDimitry Andric    // 27.6.2.2.2 buffer and positioning:
37*0b57cec5SDimitry Andric    basic_streambuf* pubsetbuf(char_type* s, streamsize n);
38*0b57cec5SDimitry Andric    pos_type pubseekoff(off_type off, ios_base::seekdir way,
39*0b57cec5SDimitry Andric                        ios_base::openmode which = ios_base::in | ios_base::out);
40*0b57cec5SDimitry Andric    pos_type pubseekpos(pos_type sp,
41*0b57cec5SDimitry Andric                        ios_base::openmode which = ios_base::in | ios_base::out);
42*0b57cec5SDimitry Andric    int pubsync();
43*0b57cec5SDimitry Andric
44*0b57cec5SDimitry Andric    // Get and put areas:
45*0b57cec5SDimitry Andric    // 27.6.2.2.3 Get area:
46*0b57cec5SDimitry Andric    streamsize in_avail();
47*0b57cec5SDimitry Andric    int_type snextc();
48*0b57cec5SDimitry Andric    int_type sbumpc();
49*0b57cec5SDimitry Andric    int_type sgetc();
50*0b57cec5SDimitry Andric    streamsize sgetn(char_type* s, streamsize n);
51*0b57cec5SDimitry Andric
52*0b57cec5SDimitry Andric    // 27.6.2.2.4 Putback:
53*0b57cec5SDimitry Andric    int_type sputbackc(char_type c);
54*0b57cec5SDimitry Andric    int_type sungetc();
55*0b57cec5SDimitry Andric
56*0b57cec5SDimitry Andric    // 27.6.2.2.5 Put area:
57*0b57cec5SDimitry Andric    int_type sputc(char_type c);
58*0b57cec5SDimitry Andric    streamsize sputn(const char_type* s, streamsize n);
59*0b57cec5SDimitry Andric
60*0b57cec5SDimitry Andricprotected:
61*0b57cec5SDimitry Andric    basic_streambuf();
62*0b57cec5SDimitry Andric    basic_streambuf(const basic_streambuf& rhs);
63*0b57cec5SDimitry Andric    basic_streambuf& operator=(const basic_streambuf& rhs);
64*0b57cec5SDimitry Andric    void swap(basic_streambuf& rhs);
65*0b57cec5SDimitry Andric
66*0b57cec5SDimitry Andric    // 27.6.2.3.2 Get area:
67*0b57cec5SDimitry Andric    char_type* eback() const;
68*0b57cec5SDimitry Andric    char_type* gptr() const;
69*0b57cec5SDimitry Andric    char_type* egptr() const;
70*0b57cec5SDimitry Andric    void gbump(int n);
71*0b57cec5SDimitry Andric    void setg(char_type* gbeg, char_type* gnext, char_type* gend);
72*0b57cec5SDimitry Andric
73*0b57cec5SDimitry Andric    // 27.6.2.3.3 Put area:
74*0b57cec5SDimitry Andric    char_type* pbase() const;
75*0b57cec5SDimitry Andric    char_type* pptr() const;
76*0b57cec5SDimitry Andric    char_type* epptr() const;
77*0b57cec5SDimitry Andric    void pbump(int n);
78*0b57cec5SDimitry Andric    void setp(char_type* pbeg, char_type* pend);
79*0b57cec5SDimitry Andric
80*0b57cec5SDimitry Andric    // 27.6.2.4 virtual functions:
81*0b57cec5SDimitry Andric    // 27.6.2.4.1 Locales:
82*0b57cec5SDimitry Andric    virtual void imbue(const locale& loc);
83*0b57cec5SDimitry Andric
84*0b57cec5SDimitry Andric    // 27.6.2.4.2 Buffer management and positioning:
85*0b57cec5SDimitry Andric    virtual basic_streambuf* setbuf(char_type* s, streamsize n);
86*0b57cec5SDimitry Andric    virtual pos_type seekoff(off_type off, ios_base::seekdir way,
87*0b57cec5SDimitry Andric                             ios_base::openmode which = ios_base::in | ios_base::out);
88*0b57cec5SDimitry Andric    virtual pos_type seekpos(pos_type sp,
89*0b57cec5SDimitry Andric                             ios_base::openmode which = ios_base::in | ios_base::out);
90*0b57cec5SDimitry Andric    virtual int sync();
91*0b57cec5SDimitry Andric
92*0b57cec5SDimitry Andric    // 27.6.2.4.3 Get area:
93*0b57cec5SDimitry Andric    virtual streamsize showmanyc();
94*0b57cec5SDimitry Andric    virtual streamsize xsgetn(char_type* s, streamsize n);
95*0b57cec5SDimitry Andric    virtual int_type underflow();
96*0b57cec5SDimitry Andric    virtual int_type uflow();
97*0b57cec5SDimitry Andric
98*0b57cec5SDimitry Andric    // 27.6.2.4.4 Putback:
99*0b57cec5SDimitry Andric    virtual int_type pbackfail(int_type c = traits_type::eof());
100*0b57cec5SDimitry Andric
101*0b57cec5SDimitry Andric    // 27.6.2.4.5 Put area:
102*0b57cec5SDimitry Andric    virtual streamsize xsputn(const char_type* s, streamsize n);
103*0b57cec5SDimitry Andric    virtual int_type overflow (int_type c = traits_type::eof());
104*0b57cec5SDimitry Andric};
105*0b57cec5SDimitry Andric
106*0b57cec5SDimitry Andric}  // std
107*0b57cec5SDimitry Andric
108*0b57cec5SDimitry Andric*/
109*0b57cec5SDimitry Andric
110*0b57cec5SDimitry Andric#include <__config>
111*0b57cec5SDimitry Andric#include <iosfwd>
112*0b57cec5SDimitry Andric#include <ios>
113*0b57cec5SDimitry Andric
114*0b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
115*0b57cec5SDimitry Andric#pragma GCC system_header
116*0b57cec5SDimitry Andric#endif
117*0b57cec5SDimitry Andric
118*0b57cec5SDimitry Andric_LIBCPP_PUSH_MACROS
119*0b57cec5SDimitry Andric#include <__undef_macros>
120*0b57cec5SDimitry Andric
121*0b57cec5SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD
122*0b57cec5SDimitry Andric
123*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
124*0b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_streambuf
125*0b57cec5SDimitry Andric{
126*0b57cec5SDimitry Andricpublic:
127*0b57cec5SDimitry Andric    // types:
128*0b57cec5SDimitry Andric    typedef _CharT                         char_type;
129*0b57cec5SDimitry Andric    typedef _Traits                        traits_type;
130*0b57cec5SDimitry Andric    typedef typename traits_type::int_type int_type;
131*0b57cec5SDimitry Andric    typedef typename traits_type::pos_type pos_type;
132*0b57cec5SDimitry Andric    typedef typename traits_type::off_type off_type;
133*0b57cec5SDimitry Andric
134*0b57cec5SDimitry Andric    static_assert((is_same<_CharT, typename traits_type::char_type>::value),
135*0b57cec5SDimitry Andric                  "traits_type::char_type must be the same type as CharT");
136*0b57cec5SDimitry Andric
137*0b57cec5SDimitry Andric    virtual ~basic_streambuf();
138*0b57cec5SDimitry Andric
139*0b57cec5SDimitry Andric    // 27.6.2.2.1 locales:
140*0b57cec5SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
141*0b57cec5SDimitry Andric    locale pubimbue(const locale& __loc) {
142*0b57cec5SDimitry Andric        imbue(__loc);
143*0b57cec5SDimitry Andric        locale __r = __loc_;
144*0b57cec5SDimitry Andric        __loc_ = __loc;
145*0b57cec5SDimitry Andric        return __r;
146*0b57cec5SDimitry Andric    }
147*0b57cec5SDimitry Andric
148*0b57cec5SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
149*0b57cec5SDimitry Andric    locale getloc() const { return __loc_; }
150*0b57cec5SDimitry Andric
151*0b57cec5SDimitry Andric    // 27.6.2.2.2 buffer and positioning:
152*0b57cec5SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
153*0b57cec5SDimitry Andric    basic_streambuf* pubsetbuf(char_type* __s, streamsize __n)
154*0b57cec5SDimitry Andric    { return setbuf(__s, __n); }
155*0b57cec5SDimitry Andric
156*0b57cec5SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
157*0b57cec5SDimitry Andric    pos_type pubseekoff(off_type __off, ios_base::seekdir __way,
158*0b57cec5SDimitry Andric                        ios_base::openmode __which = ios_base::in | ios_base::out)
159*0b57cec5SDimitry Andric    { return seekoff(__off, __way, __which); }
160*0b57cec5SDimitry Andric
161*0b57cec5SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
162*0b57cec5SDimitry Andric    pos_type pubseekpos(pos_type __sp,
163*0b57cec5SDimitry Andric                        ios_base::openmode __which = ios_base::in | ios_base::out)
164*0b57cec5SDimitry Andric    { return seekpos(__sp, __which); }
165*0b57cec5SDimitry Andric
166*0b57cec5SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
167*0b57cec5SDimitry Andric    int pubsync() { return sync(); }
168*0b57cec5SDimitry Andric
169*0b57cec5SDimitry Andric    // Get and put areas:
170*0b57cec5SDimitry Andric    // 27.6.2.2.3 Get area:
171*0b57cec5SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
172*0b57cec5SDimitry Andric    streamsize in_avail() {
173*0b57cec5SDimitry Andric        if (__ninp_ < __einp_)
174*0b57cec5SDimitry Andric            return static_cast<streamsize>(__einp_ - __ninp_);
175*0b57cec5SDimitry Andric        return showmanyc();
176*0b57cec5SDimitry Andric    }
177*0b57cec5SDimitry Andric
178*0b57cec5SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
179*0b57cec5SDimitry Andric    int_type snextc() {
180*0b57cec5SDimitry Andric        if (sbumpc() == traits_type::eof())
181*0b57cec5SDimitry Andric            return traits_type::eof();
182*0b57cec5SDimitry Andric        return sgetc();
183*0b57cec5SDimitry Andric    }
184*0b57cec5SDimitry Andric
185*0b57cec5SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
186*0b57cec5SDimitry Andric    int_type sbumpc() {
187*0b57cec5SDimitry Andric        if (__ninp_ == __einp_)
188*0b57cec5SDimitry Andric            return uflow();
189*0b57cec5SDimitry Andric        return traits_type::to_int_type(*__ninp_++);
190*0b57cec5SDimitry Andric    }
191*0b57cec5SDimitry Andric
192*0b57cec5SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
193*0b57cec5SDimitry Andric    int_type sgetc() {
194*0b57cec5SDimitry Andric        if (__ninp_ == __einp_)
195*0b57cec5SDimitry Andric            return underflow();
196*0b57cec5SDimitry Andric        return traits_type::to_int_type(*__ninp_);
197*0b57cec5SDimitry Andric    }
198*0b57cec5SDimitry Andric
199*0b57cec5SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
200*0b57cec5SDimitry Andric    streamsize sgetn(char_type* __s, streamsize __n)
201*0b57cec5SDimitry Andric    { return xsgetn(__s, __n); }
202*0b57cec5SDimitry Andric
203*0b57cec5SDimitry Andric    // 27.6.2.2.4 Putback:
204*0b57cec5SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
205*0b57cec5SDimitry Andric    int_type sputbackc(char_type __c) {
206*0b57cec5SDimitry Andric        if (__binp_ == __ninp_ || !traits_type::eq(__c, __ninp_[-1]))
207*0b57cec5SDimitry Andric            return pbackfail(traits_type::to_int_type(__c));
208*0b57cec5SDimitry Andric        return traits_type::to_int_type(*--__ninp_);
209*0b57cec5SDimitry Andric    }
210*0b57cec5SDimitry Andric
211*0b57cec5SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
212*0b57cec5SDimitry Andric    int_type sungetc() {
213*0b57cec5SDimitry Andric        if (__binp_ == __ninp_)
214*0b57cec5SDimitry Andric          return pbackfail();
215*0b57cec5SDimitry Andric        return traits_type::to_int_type(*--__ninp_);
216*0b57cec5SDimitry Andric    }
217*0b57cec5SDimitry Andric
218*0b57cec5SDimitry Andric    // 27.6.2.2.5 Put area:
219*0b57cec5SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
220*0b57cec5SDimitry Andric    int_type sputc(char_type __c) {
221*0b57cec5SDimitry Andric        if (__nout_ == __eout_)
222*0b57cec5SDimitry Andric            return overflow(traits_type::to_int_type(__c));
223*0b57cec5SDimitry Andric        *__nout_++ = __c;
224*0b57cec5SDimitry Andric        return traits_type::to_int_type(__c);
225*0b57cec5SDimitry Andric    }
226*0b57cec5SDimitry Andric
227*0b57cec5SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
228*0b57cec5SDimitry Andric    streamsize sputn(const char_type* __s, streamsize __n)
229*0b57cec5SDimitry Andric    { return xsputn(__s, __n); }
230*0b57cec5SDimitry Andric
231*0b57cec5SDimitry Andricprotected:
232*0b57cec5SDimitry Andric    basic_streambuf();
233*0b57cec5SDimitry Andric    basic_streambuf(const basic_streambuf& __rhs);
234*0b57cec5SDimitry Andric    basic_streambuf& operator=(const basic_streambuf& __rhs);
235*0b57cec5SDimitry Andric    void swap(basic_streambuf& __rhs);
236*0b57cec5SDimitry Andric
237*0b57cec5SDimitry Andric    // 27.6.2.3.2 Get area:
238*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY char_type* eback() const {return __binp_;}
239*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY char_type* gptr()  const {return __ninp_;}
240*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY char_type* egptr() const {return __einp_;}
241*0b57cec5SDimitry Andric
242*0b57cec5SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
243*0b57cec5SDimitry Andric    void gbump(int __n) { __ninp_ += __n; }
244*0b57cec5SDimitry Andric
245*0b57cec5SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
246*0b57cec5SDimitry Andric    void setg(char_type* __gbeg, char_type* __gnext, char_type* __gend) {
247*0b57cec5SDimitry Andric        __binp_ = __gbeg;
248*0b57cec5SDimitry Andric        __ninp_ = __gnext;
249*0b57cec5SDimitry Andric        __einp_ = __gend;
250*0b57cec5SDimitry Andric    }
251*0b57cec5SDimitry Andric
252*0b57cec5SDimitry Andric    // 27.6.2.3.3 Put area:
253*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY char_type* pbase() const {return __bout_;}
254*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY char_type* pptr()  const {return __nout_;}
255*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY char_type* epptr() const {return __eout_;}
256*0b57cec5SDimitry Andric
257*0b57cec5SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
258*0b57cec5SDimitry Andric    void pbump(int __n) { __nout_ += __n; }
259*0b57cec5SDimitry Andric
260*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
261*0b57cec5SDimitry Andric    void __pbump(streamsize __n) { __nout_ += __n; }
262*0b57cec5SDimitry Andric
263*0b57cec5SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
264*0b57cec5SDimitry Andric    void setp(char_type* __pbeg, char_type* __pend) {
265*0b57cec5SDimitry Andric        __bout_ = __nout_ = __pbeg;
266*0b57cec5SDimitry Andric        __eout_ = __pend;
267*0b57cec5SDimitry Andric    }
268*0b57cec5SDimitry Andric
269*0b57cec5SDimitry Andric    // 27.6.2.4 virtual functions:
270*0b57cec5SDimitry Andric    // 27.6.2.4.1 Locales:
271*0b57cec5SDimitry Andric    virtual void imbue(const locale& __loc);
272*0b57cec5SDimitry Andric
273*0b57cec5SDimitry Andric    // 27.6.2.4.2 Buffer management and positioning:
274*0b57cec5SDimitry Andric    virtual basic_streambuf* setbuf(char_type* __s, streamsize __n);
275*0b57cec5SDimitry Andric    virtual pos_type seekoff(off_type __off, ios_base::seekdir __way,
276*0b57cec5SDimitry Andric                             ios_base::openmode __which = ios_base::in | ios_base::out);
277*0b57cec5SDimitry Andric    virtual pos_type seekpos(pos_type __sp,
278*0b57cec5SDimitry Andric                             ios_base::openmode __which = ios_base::in | ios_base::out);
279*0b57cec5SDimitry Andric    virtual int sync();
280*0b57cec5SDimitry Andric
281*0b57cec5SDimitry Andric    // 27.6.2.4.3 Get area:
282*0b57cec5SDimitry Andric    virtual streamsize showmanyc();
283*0b57cec5SDimitry Andric    virtual streamsize xsgetn(char_type* __s, streamsize __n);
284*0b57cec5SDimitry Andric    virtual int_type underflow();
285*0b57cec5SDimitry Andric    virtual int_type uflow();
286*0b57cec5SDimitry Andric
287*0b57cec5SDimitry Andric    // 27.6.2.4.4 Putback:
288*0b57cec5SDimitry Andric    virtual int_type pbackfail(int_type __c = traits_type::eof());
289*0b57cec5SDimitry Andric
290*0b57cec5SDimitry Andric    // 27.6.2.4.5 Put area:
291*0b57cec5SDimitry Andric    virtual streamsize xsputn(const char_type* __s, streamsize __n);
292*0b57cec5SDimitry Andric    virtual int_type overflow(int_type __c = traits_type::eof());
293*0b57cec5SDimitry Andric
294*0b57cec5SDimitry Andricprivate:
295*0b57cec5SDimitry Andric    locale __loc_;
296*0b57cec5SDimitry Andric    char_type* __binp_;
297*0b57cec5SDimitry Andric    char_type* __ninp_;
298*0b57cec5SDimitry Andric    char_type* __einp_;
299*0b57cec5SDimitry Andric    char_type* __bout_;
300*0b57cec5SDimitry Andric    char_type* __nout_;
301*0b57cec5SDimitry Andric    char_type* __eout_;
302*0b57cec5SDimitry Andric};
303*0b57cec5SDimitry Andric
304*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
305*0b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::~basic_streambuf()
306*0b57cec5SDimitry Andric{
307*0b57cec5SDimitry Andric}
308*0b57cec5SDimitry Andric
309*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
310*0b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::basic_streambuf()
311*0b57cec5SDimitry Andric    : __binp_(0),
312*0b57cec5SDimitry Andric      __ninp_(0),
313*0b57cec5SDimitry Andric      __einp_(0),
314*0b57cec5SDimitry Andric      __bout_(0),
315*0b57cec5SDimitry Andric      __nout_(0),
316*0b57cec5SDimitry Andric      __eout_(0)
317*0b57cec5SDimitry Andric{
318*0b57cec5SDimitry Andric}
319*0b57cec5SDimitry Andric
320*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
321*0b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::basic_streambuf(const basic_streambuf& __sb)
322*0b57cec5SDimitry Andric    : __loc_(__sb.__loc_),
323*0b57cec5SDimitry Andric      __binp_(__sb.__binp_),
324*0b57cec5SDimitry Andric      __ninp_(__sb.__ninp_),
325*0b57cec5SDimitry Andric      __einp_(__sb.__einp_),
326*0b57cec5SDimitry Andric      __bout_(__sb.__bout_),
327*0b57cec5SDimitry Andric      __nout_(__sb.__nout_),
328*0b57cec5SDimitry Andric      __eout_(__sb.__eout_)
329*0b57cec5SDimitry Andric{
330*0b57cec5SDimitry Andric}
331*0b57cec5SDimitry Andric
332*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
333*0b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>&
334*0b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::operator=(const basic_streambuf& __sb)
335*0b57cec5SDimitry Andric{
336*0b57cec5SDimitry Andric    __loc_ = __sb.__loc_;
337*0b57cec5SDimitry Andric    __binp_ = __sb.__binp_;
338*0b57cec5SDimitry Andric    __ninp_ = __sb.__ninp_;
339*0b57cec5SDimitry Andric    __einp_ = __sb.__einp_;
340*0b57cec5SDimitry Andric    __bout_ = __sb.__bout_;
341*0b57cec5SDimitry Andric    __nout_ = __sb.__nout_;
342*0b57cec5SDimitry Andric    __eout_ = __sb.__eout_;
343*0b57cec5SDimitry Andric    return *this;
344*0b57cec5SDimitry Andric}
345*0b57cec5SDimitry Andric
346*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
347*0b57cec5SDimitry Andricvoid
348*0b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::swap(basic_streambuf& __sb)
349*0b57cec5SDimitry Andric{
350*0b57cec5SDimitry Andric    _VSTD::swap(__loc_, __sb.__loc_);
351*0b57cec5SDimitry Andric    _VSTD::swap(__binp_, __sb.__binp_);
352*0b57cec5SDimitry Andric    _VSTD::swap(__ninp_, __sb.__ninp_);
353*0b57cec5SDimitry Andric    _VSTD::swap(__einp_, __sb.__einp_);
354*0b57cec5SDimitry Andric    _VSTD::swap(__bout_, __sb.__bout_);
355*0b57cec5SDimitry Andric    _VSTD::swap(__nout_, __sb.__nout_);
356*0b57cec5SDimitry Andric    _VSTD::swap(__eout_, __sb.__eout_);
357*0b57cec5SDimitry Andric}
358*0b57cec5SDimitry Andric
359*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
360*0b57cec5SDimitry Andricvoid
361*0b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::imbue(const locale&)
362*0b57cec5SDimitry Andric{
363*0b57cec5SDimitry Andric}
364*0b57cec5SDimitry Andric
365*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
366*0b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>*
367*0b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::setbuf(char_type*, streamsize)
368*0b57cec5SDimitry Andric{
369*0b57cec5SDimitry Andric    return this;
370*0b57cec5SDimitry Andric}
371*0b57cec5SDimitry Andric
372*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
373*0b57cec5SDimitry Andrictypename basic_streambuf<_CharT, _Traits>::pos_type
374*0b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::seekoff(off_type, ios_base::seekdir,
375*0b57cec5SDimitry Andric                                          ios_base::openmode)
376*0b57cec5SDimitry Andric{
377*0b57cec5SDimitry Andric    return pos_type(off_type(-1));
378*0b57cec5SDimitry Andric}
379*0b57cec5SDimitry Andric
380*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
381*0b57cec5SDimitry Andrictypename basic_streambuf<_CharT, _Traits>::pos_type
382*0b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::seekpos(pos_type, ios_base::openmode)
383*0b57cec5SDimitry Andric{
384*0b57cec5SDimitry Andric    return pos_type(off_type(-1));
385*0b57cec5SDimitry Andric}
386*0b57cec5SDimitry Andric
387*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
388*0b57cec5SDimitry Andricint
389*0b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::sync()
390*0b57cec5SDimitry Andric{
391*0b57cec5SDimitry Andric    return 0;
392*0b57cec5SDimitry Andric}
393*0b57cec5SDimitry Andric
394*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
395*0b57cec5SDimitry Andricstreamsize
396*0b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::showmanyc()
397*0b57cec5SDimitry Andric{
398*0b57cec5SDimitry Andric    return 0;
399*0b57cec5SDimitry Andric}
400*0b57cec5SDimitry Andric
401*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
402*0b57cec5SDimitry Andricstreamsize
403*0b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::xsgetn(char_type* __s, streamsize __n)
404*0b57cec5SDimitry Andric{
405*0b57cec5SDimitry Andric    const int_type __eof = traits_type::eof();
406*0b57cec5SDimitry Andric    int_type __c;
407*0b57cec5SDimitry Andric    streamsize __i = 0;
408*0b57cec5SDimitry Andric    while(__i < __n)
409*0b57cec5SDimitry Andric    {
410*0b57cec5SDimitry Andric        if (__ninp_ < __einp_)
411*0b57cec5SDimitry Andric        {
412*0b57cec5SDimitry Andric            const streamsize __len = _VSTD::min(static_cast<streamsize>(INT_MAX),
413*0b57cec5SDimitry Andric                                _VSTD::min(__einp_ - __ninp_, __n - __i));
414*0b57cec5SDimitry Andric            traits_type::copy(__s, __ninp_, __len);
415*0b57cec5SDimitry Andric            __s +=  __len;
416*0b57cec5SDimitry Andric            __i +=  __len;
417*0b57cec5SDimitry Andric            this->gbump(__len);
418*0b57cec5SDimitry Andric        }
419*0b57cec5SDimitry Andric        else if ((__c = uflow()) != __eof)
420*0b57cec5SDimitry Andric        {
421*0b57cec5SDimitry Andric            *__s = traits_type::to_char_type(__c);
422*0b57cec5SDimitry Andric            ++__s;
423*0b57cec5SDimitry Andric            ++__i;
424*0b57cec5SDimitry Andric        }
425*0b57cec5SDimitry Andric        else
426*0b57cec5SDimitry Andric            break;
427*0b57cec5SDimitry Andric    }
428*0b57cec5SDimitry Andric    return __i;
429*0b57cec5SDimitry Andric}
430*0b57cec5SDimitry Andric
431*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
432*0b57cec5SDimitry Andrictypename basic_streambuf<_CharT, _Traits>::int_type
433*0b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::underflow()
434*0b57cec5SDimitry Andric{
435*0b57cec5SDimitry Andric    return traits_type::eof();
436*0b57cec5SDimitry Andric}
437*0b57cec5SDimitry Andric
438*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
439*0b57cec5SDimitry Andrictypename basic_streambuf<_CharT, _Traits>::int_type
440*0b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::uflow()
441*0b57cec5SDimitry Andric{
442*0b57cec5SDimitry Andric    if (underflow() == traits_type::eof())
443*0b57cec5SDimitry Andric        return traits_type::eof();
444*0b57cec5SDimitry Andric    return traits_type::to_int_type(*__ninp_++);
445*0b57cec5SDimitry Andric}
446*0b57cec5SDimitry Andric
447*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
448*0b57cec5SDimitry Andrictypename basic_streambuf<_CharT, _Traits>::int_type
449*0b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::pbackfail(int_type)
450*0b57cec5SDimitry Andric{
451*0b57cec5SDimitry Andric    return traits_type::eof();
452*0b57cec5SDimitry Andric}
453*0b57cec5SDimitry Andric
454*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
455*0b57cec5SDimitry Andricstreamsize
456*0b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::xsputn(const char_type* __s, streamsize __n)
457*0b57cec5SDimitry Andric{
458*0b57cec5SDimitry Andric    streamsize __i = 0;
459*0b57cec5SDimitry Andric    int_type __eof = traits_type::eof();
460*0b57cec5SDimitry Andric    while( __i < __n)
461*0b57cec5SDimitry Andric    {
462*0b57cec5SDimitry Andric        if (__nout_ >= __eout_)
463*0b57cec5SDimitry Andric        {
464*0b57cec5SDimitry Andric            if (overflow(traits_type::to_int_type(*__s)) == __eof)
465*0b57cec5SDimitry Andric                break;
466*0b57cec5SDimitry Andric            ++__s;
467*0b57cec5SDimitry Andric            ++__i;
468*0b57cec5SDimitry Andric        }
469*0b57cec5SDimitry Andric        else
470*0b57cec5SDimitry Andric        {
471*0b57cec5SDimitry Andric            streamsize __chunk_size = _VSTD::min(__eout_ - __nout_, __n - __i);
472*0b57cec5SDimitry Andric            traits_type::copy(__nout_, __s, __chunk_size);
473*0b57cec5SDimitry Andric            __nout_ += __chunk_size;
474*0b57cec5SDimitry Andric            __s     += __chunk_size;
475*0b57cec5SDimitry Andric            __i     += __chunk_size;
476*0b57cec5SDimitry Andric        }
477*0b57cec5SDimitry Andric    }
478*0b57cec5SDimitry Andric    return __i;
479*0b57cec5SDimitry Andric}
480*0b57cec5SDimitry Andric
481*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
482*0b57cec5SDimitry Andrictypename basic_streambuf<_CharT, _Traits>::int_type
483*0b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::overflow(int_type)
484*0b57cec5SDimitry Andric{
485*0b57cec5SDimitry Andric    return traits_type::eof();
486*0b57cec5SDimitry Andric}
487*0b57cec5SDimitry Andric
488*0b57cec5SDimitry Andric#ifndef _LIBCPP_DO_NOT_ASSUME_STREAMS_EXPLICIT_INSTANTIATION_IN_DYLIB
489*0b57cec5SDimitry Andric_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_streambuf<char>)
490*0b57cec5SDimitry Andric_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_streambuf<wchar_t>)
491*0b57cec5SDimitry Andric
492*0b57cec5SDimitry Andric_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ios<char>)
493*0b57cec5SDimitry Andric_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ios<wchar_t>)
494*0b57cec5SDimitry Andric#endif
495*0b57cec5SDimitry Andric
496*0b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD
497*0b57cec5SDimitry Andric
498*0b57cec5SDimitry Andric_LIBCPP_POP_MACROS
499*0b57cec5SDimitry Andric
500*0b57cec5SDimitry Andric#endif  // _LIBCPP_STEAMBUF
501