13e519524SHoward Hinnant// -*- C++ -*-
2eb8650a7SLouis Dionne//===----------------------------------------------------------------------===//
33e519524SHoward Hinnant//
457b08b09SChandler Carruth// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
557b08b09SChandler Carruth// See https://llvm.org/LICENSE.txt for license information.
657b08b09SChandler Carruth// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
73e519524SHoward Hinnant//
83e519524SHoward Hinnant//===----------------------------------------------------------------------===//
93e519524SHoward Hinnant
1027e5bffbSArthur O'Dwyer#ifndef _LIBCPP_STREAMBUF
1127e5bffbSArthur O'Dwyer#define _LIBCPP_STREAMBUF
123e519524SHoward Hinnant
133e519524SHoward Hinnant/*
143e519524SHoward Hinnant    streambuf synopsis
153e519524SHoward Hinnant
163e519524SHoward Hinnantnamespace std
173e519524SHoward Hinnant{
183e519524SHoward Hinnant
193e519524SHoward Hinnanttemplate <class charT, class traits = char_traits<charT> >
203e519524SHoward Hinnantclass basic_streambuf
213e519524SHoward Hinnant{
223e519524SHoward Hinnantpublic:
233e519524SHoward Hinnant    // types:
243e519524SHoward Hinnant    typedef charT char_type;
253e519524SHoward Hinnant    typedef traits traits_type;
263e519524SHoward Hinnant    typedef typename traits_type::int_type int_type;
273e519524SHoward Hinnant    typedef typename traits_type::pos_type pos_type;
283e519524SHoward Hinnant    typedef typename traits_type::off_type off_type;
293e519524SHoward Hinnant
303e519524SHoward Hinnant    virtual ~basic_streambuf();
313e519524SHoward Hinnant
323e519524SHoward Hinnant    // 27.6.2.2.1 locales:
333e519524SHoward Hinnant    locale pubimbue(const locale& loc);
343e519524SHoward Hinnant    locale getloc() const;
353e519524SHoward Hinnant
363e519524SHoward Hinnant    // 27.6.2.2.2 buffer and positioning:
373e519524SHoward Hinnant    basic_streambuf* pubsetbuf(char_type* s, streamsize n);
383e519524SHoward Hinnant    pos_type pubseekoff(off_type off, ios_base::seekdir way,
393e519524SHoward Hinnant                        ios_base::openmode which = ios_base::in | ios_base::out);
403e519524SHoward Hinnant    pos_type pubseekpos(pos_type sp,
413e519524SHoward Hinnant                        ios_base::openmode which = ios_base::in | ios_base::out);
423e519524SHoward Hinnant    int pubsync();
433e519524SHoward Hinnant
443e519524SHoward Hinnant    // Get and put areas:
453e519524SHoward Hinnant    // 27.6.2.2.3 Get area:
463e519524SHoward Hinnant    streamsize in_avail();
473e519524SHoward Hinnant    int_type snextc();
483e519524SHoward Hinnant    int_type sbumpc();
493e519524SHoward Hinnant    int_type sgetc();
503e519524SHoward Hinnant    streamsize sgetn(char_type* s, streamsize n);
513e519524SHoward Hinnant
523e519524SHoward Hinnant    // 27.6.2.2.4 Putback:
533e519524SHoward Hinnant    int_type sputbackc(char_type c);
543e519524SHoward Hinnant    int_type sungetc();
553e519524SHoward Hinnant
563e519524SHoward Hinnant    // 27.6.2.2.5 Put area:
573e519524SHoward Hinnant    int_type sputc(char_type c);
583e519524SHoward Hinnant    streamsize sputn(const char_type* s, streamsize n);
593e519524SHoward Hinnant
603e519524SHoward Hinnantprotected:
613e519524SHoward Hinnant    basic_streambuf();
623e519524SHoward Hinnant    basic_streambuf(const basic_streambuf& rhs);
633e519524SHoward Hinnant    basic_streambuf& operator=(const basic_streambuf& rhs);
643e519524SHoward Hinnant    void swap(basic_streambuf& rhs);
653e519524SHoward Hinnant
663e519524SHoward Hinnant    // 27.6.2.3.2 Get area:
673e519524SHoward Hinnant    char_type* eback() const;
683e519524SHoward Hinnant    char_type* gptr() const;
693e519524SHoward Hinnant    char_type* egptr() const;
703e519524SHoward Hinnant    void gbump(int n);
713e519524SHoward Hinnant    void setg(char_type* gbeg, char_type* gnext, char_type* gend);
723e519524SHoward Hinnant
733e519524SHoward Hinnant    // 27.6.2.3.3 Put area:
743e519524SHoward Hinnant    char_type* pbase() const;
753e519524SHoward Hinnant    char_type* pptr() const;
763e519524SHoward Hinnant    char_type* epptr() const;
773e519524SHoward Hinnant    void pbump(int n);
783e519524SHoward Hinnant    void setp(char_type* pbeg, char_type* pend);
793e519524SHoward Hinnant
803e519524SHoward Hinnant    // 27.6.2.4 virtual functions:
813e519524SHoward Hinnant    // 27.6.2.4.1 Locales:
823e519524SHoward Hinnant    virtual void imbue(const locale& loc);
833e519524SHoward Hinnant
843e519524SHoward Hinnant    // 27.6.2.4.2 Buffer management and positioning:
853e519524SHoward Hinnant    virtual basic_streambuf* setbuf(char_type* s, streamsize n);
863e519524SHoward Hinnant    virtual pos_type seekoff(off_type off, ios_base::seekdir way,
873e519524SHoward Hinnant                             ios_base::openmode which = ios_base::in | ios_base::out);
883e519524SHoward Hinnant    virtual pos_type seekpos(pos_type sp,
893e519524SHoward Hinnant                             ios_base::openmode which = ios_base::in | ios_base::out);
903e519524SHoward Hinnant    virtual int sync();
913e519524SHoward Hinnant
923e519524SHoward Hinnant    // 27.6.2.4.3 Get area:
933e519524SHoward Hinnant    virtual streamsize showmanyc();
943e519524SHoward Hinnant    virtual streamsize xsgetn(char_type* s, streamsize n);
953e519524SHoward Hinnant    virtual int_type underflow();
963e519524SHoward Hinnant    virtual int_type uflow();
973e519524SHoward Hinnant
983e519524SHoward Hinnant    // 27.6.2.4.4 Putback:
993e519524SHoward Hinnant    virtual int_type pbackfail(int_type c = traits_type::eof());
1003e519524SHoward Hinnant
1013e519524SHoward Hinnant    // 27.6.2.4.5 Put area:
1023e519524SHoward Hinnant    virtual streamsize xsputn(const char_type* s, streamsize n);
1033e519524SHoward Hinnant    virtual int_type overflow (int_type c = traits_type::eof());
1043e519524SHoward Hinnant};
1053e519524SHoward Hinnant
1063e519524SHoward Hinnant}  // std
1073e519524SHoward Hinnant
1083e519524SHoward Hinnant*/
1093e519524SHoward Hinnant
110385cc25aSLouis Dionne#include <__assert> // all public C++ headers provide the assertion handler
1113e519524SHoward Hinnant#include <__config>
1125726e559SLouis Dionne#include <cstdint>
1133e519524SHoward Hinnant#include <ios>
114bfbd73f8SArthur O'Dwyer#include <iosfwd>
115bd6e6846SMark de Wever#include <version>
1163e519524SHoward Hinnant
117073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
1183e519524SHoward Hinnant#  pragma GCC system_header
119073458b1SHoward Hinnant#endif
1203e519524SHoward Hinnant
121a016efb1SEric Fiselier_LIBCPP_PUSH_MACROS
122a016efb1SEric Fiselier#include <__undef_macros>
123a016efb1SEric Fiselier
1243e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
1253e519524SHoward Hinnant
1263e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
127e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS basic_streambuf
1283e519524SHoward Hinnant{
1293e519524SHoward Hinnantpublic:
1303e519524SHoward Hinnant    // types:
1313e519524SHoward Hinnant    typedef _CharT                         char_type;
1323e519524SHoward Hinnant    typedef _Traits                        traits_type;
1333e519524SHoward Hinnant    typedef typename traits_type::int_type int_type;
1343e519524SHoward Hinnant    typedef typename traits_type::pos_type pos_type;
1353e519524SHoward Hinnant    typedef typename traits_type::off_type off_type;
1363e519524SHoward Hinnant
1371a6493b4SMarshall Clow    static_assert((is_same<_CharT, typename traits_type::char_type>::value),
1381a6493b4SMarshall Clow                  "traits_type::char_type must be the same type as CharT");
1391a6493b4SMarshall Clow
1403e519524SHoward Hinnant    virtual ~basic_streambuf();
1413e519524SHoward Hinnant
1423e519524SHoward Hinnant    // 27.6.2.2.1 locales:
1437833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
144f8f31c49SEric Fiselier    locale pubimbue(const locale& __loc) {
145f8f31c49SEric Fiselier        imbue(__loc);
146f8f31c49SEric Fiselier        locale __r = __loc_;
147f8f31c49SEric Fiselier        __loc_ = __loc;
148f8f31c49SEric Fiselier        return __r;
149f8f31c49SEric Fiselier    }
150f8f31c49SEric Fiselier
1517833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
152f8f31c49SEric Fiselier    locale getloc() const { return __loc_; }
1533e519524SHoward Hinnant
1543e519524SHoward Hinnant    // 27.6.2.2.2 buffer and positioning:
1557833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
156f8f31c49SEric Fiselier    basic_streambuf* pubsetbuf(char_type* __s, streamsize __n)
157f8f31c49SEric Fiselier    { return setbuf(__s, __n); }
158f8f31c49SEric Fiselier
1597833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
1603e519524SHoward Hinnant    pos_type pubseekoff(off_type __off, ios_base::seekdir __way,
161f8f31c49SEric Fiselier                        ios_base::openmode __which = ios_base::in | ios_base::out)
162f8f31c49SEric Fiselier    { return seekoff(__off, __way, __which); }
163f8f31c49SEric Fiselier
1647833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
1653e519524SHoward Hinnant    pos_type pubseekpos(pos_type __sp,
166f8f31c49SEric Fiselier                        ios_base::openmode __which = ios_base::in | ios_base::out)
167f8f31c49SEric Fiselier    { return seekpos(__sp, __which); }
168f8f31c49SEric Fiselier
1697833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
170f8f31c49SEric Fiselier    int pubsync() { return sync(); }
1713e519524SHoward Hinnant
1723e519524SHoward Hinnant    // Get and put areas:
1733e519524SHoward Hinnant    // 27.6.2.2.3 Get area:
1747833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
175f8f31c49SEric Fiselier    streamsize in_avail() {
176f8f31c49SEric Fiselier        if (__ninp_ < __einp_)
177f8f31c49SEric Fiselier            return static_cast<streamsize>(__einp_ - __ninp_);
178f8f31c49SEric Fiselier        return showmanyc();
179f8f31c49SEric Fiselier    }
180f8f31c49SEric Fiselier
1817833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
182f8f31c49SEric Fiselier    int_type snextc() {
183f8f31c49SEric Fiselier        if (sbumpc() == traits_type::eof())
184f8f31c49SEric Fiselier            return traits_type::eof();
185f8f31c49SEric Fiselier        return sgetc();
186f8f31c49SEric Fiselier    }
187f8f31c49SEric Fiselier
1887833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
189f8f31c49SEric Fiselier    int_type sbumpc() {
190f8f31c49SEric Fiselier        if (__ninp_ == __einp_)
191f8f31c49SEric Fiselier            return uflow();
192f8f31c49SEric Fiselier        return traits_type::to_int_type(*__ninp_++);
193f8f31c49SEric Fiselier    }
194f8f31c49SEric Fiselier
1957833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
196f8f31c49SEric Fiselier    int_type sgetc() {
197f8f31c49SEric Fiselier        if (__ninp_ == __einp_)
198f8f31c49SEric Fiselier            return underflow();
199f8f31c49SEric Fiselier        return traits_type::to_int_type(*__ninp_);
200f8f31c49SEric Fiselier    }
201f8f31c49SEric Fiselier
2027833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
203f8f31c49SEric Fiselier    streamsize sgetn(char_type* __s, streamsize __n)
204f8f31c49SEric Fiselier    { return xsgetn(__s, __n); }
2053e519524SHoward Hinnant
2063e519524SHoward Hinnant    // 27.6.2.2.4 Putback:
2077833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
208f8f31c49SEric Fiselier    int_type sputbackc(char_type __c) {
209f8f31c49SEric Fiselier        if (__binp_ == __ninp_ || !traits_type::eq(__c, __ninp_[-1]))
210f8f31c49SEric Fiselier            return pbackfail(traits_type::to_int_type(__c));
211f8f31c49SEric Fiselier        return traits_type::to_int_type(*--__ninp_);
212f8f31c49SEric Fiselier    }
213f8f31c49SEric Fiselier
2147833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
215f8f31c49SEric Fiselier    int_type sungetc() {
216f8f31c49SEric Fiselier        if (__binp_ == __ninp_)
217f8f31c49SEric Fiselier          return pbackfail();
218f8f31c49SEric Fiselier        return traits_type::to_int_type(*--__ninp_);
219f8f31c49SEric Fiselier    }
2203e519524SHoward Hinnant
2213e519524SHoward Hinnant    // 27.6.2.2.5 Put area:
2227833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
223f8f31c49SEric Fiselier    int_type sputc(char_type __c) {
224f8f31c49SEric Fiselier        if (__nout_ == __eout_)
225f8f31c49SEric Fiselier            return overflow(traits_type::to_int_type(__c));
226f8f31c49SEric Fiselier        *__nout_++ = __c;
227f8f31c49SEric Fiselier        return traits_type::to_int_type(__c);
228f8f31c49SEric Fiselier    }
229f8f31c49SEric Fiselier
2307833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
231f8f31c49SEric Fiselier    streamsize sputn(const char_type* __s, streamsize __n)
232f8f31c49SEric Fiselier    { return xsputn(__s, __n); }
2333e519524SHoward Hinnant
2343e519524SHoward Hinnantprotected:
2353e519524SHoward Hinnant    basic_streambuf();
2363e519524SHoward Hinnant    basic_streambuf(const basic_streambuf& __rhs);
2373e519524SHoward Hinnant    basic_streambuf& operator=(const basic_streambuf& __rhs);
2383e519524SHoward Hinnant    void swap(basic_streambuf& __rhs);
2393e519524SHoward Hinnant
2403e519524SHoward Hinnant    // 27.6.2.3.2 Get area:
241dc7200b4SLouis Dionne    _LIBCPP_INLINE_VISIBILITY char_type* eback() const {return __binp_;}
242dc7200b4SLouis Dionne    _LIBCPP_INLINE_VISIBILITY char_type* gptr()  const {return __ninp_;}
243dc7200b4SLouis Dionne    _LIBCPP_INLINE_VISIBILITY char_type* egptr() const {return __einp_;}
244f8f31c49SEric Fiselier
2457833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
246f8f31c49SEric Fiselier    void gbump(int __n) { __ninp_ += __n; }
247f8f31c49SEric Fiselier
2487833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
249f8f31c49SEric Fiselier    void setg(char_type* __gbeg, char_type* __gnext, char_type* __gend) {
250f8f31c49SEric Fiselier        __binp_ = __gbeg;
251f8f31c49SEric Fiselier        __ninp_ = __gnext;
252f8f31c49SEric Fiselier        __einp_ = __gend;
253f8f31c49SEric Fiselier    }
2543e519524SHoward Hinnant
2553e519524SHoward Hinnant    // 27.6.2.3.3 Put area:
256dc7200b4SLouis Dionne    _LIBCPP_INLINE_VISIBILITY char_type* pbase() const {return __bout_;}
257dc7200b4SLouis Dionne    _LIBCPP_INLINE_VISIBILITY char_type* pptr()  const {return __nout_;}
258dc7200b4SLouis Dionne    _LIBCPP_INLINE_VISIBILITY char_type* epptr() const {return __eout_;}
259f8f31c49SEric Fiselier
2607833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
261f8f31c49SEric Fiselier    void pbump(int __n) { __nout_ += __n; }
262f8f31c49SEric Fiselier
263dc7200b4SLouis Dionne    _LIBCPP_INLINE_VISIBILITY
264d90758e2SMarshall Clow    void __pbump(streamsize __n) { __nout_ += __n; }
265d90758e2SMarshall Clow
2667833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
267f8f31c49SEric Fiselier    void setp(char_type* __pbeg, char_type* __pend) {
268f8f31c49SEric Fiselier        __bout_ = __nout_ = __pbeg;
269f8f31c49SEric Fiselier        __eout_ = __pend;
270f8f31c49SEric Fiselier    }
2713e519524SHoward Hinnant
2723e519524SHoward Hinnant    // 27.6.2.4 virtual functions:
2733e519524SHoward Hinnant    // 27.6.2.4.1 Locales:
2743e519524SHoward Hinnant    virtual void imbue(const locale& __loc);
2753e519524SHoward Hinnant
2763e519524SHoward Hinnant    // 27.6.2.4.2 Buffer management and positioning:
2773e519524SHoward Hinnant    virtual basic_streambuf* setbuf(char_type* __s, streamsize __n);
2783e519524SHoward Hinnant    virtual pos_type seekoff(off_type __off, ios_base::seekdir __way,
2793e519524SHoward Hinnant                             ios_base::openmode __which = ios_base::in | ios_base::out);
2803e519524SHoward Hinnant    virtual pos_type seekpos(pos_type __sp,
2813e519524SHoward Hinnant                             ios_base::openmode __which = ios_base::in | ios_base::out);
2823e519524SHoward Hinnant    virtual int sync();
2833e519524SHoward Hinnant
2843e519524SHoward Hinnant    // 27.6.2.4.3 Get area:
2853e519524SHoward Hinnant    virtual streamsize showmanyc();
2863e519524SHoward Hinnant    virtual streamsize xsgetn(char_type* __s, streamsize __n);
2873e519524SHoward Hinnant    virtual int_type underflow();
2883e519524SHoward Hinnant    virtual int_type uflow();
2893e519524SHoward Hinnant
2903e519524SHoward Hinnant    // 27.6.2.4.4 Putback:
2913e519524SHoward Hinnant    virtual int_type pbackfail(int_type __c = traits_type::eof());
2923e519524SHoward Hinnant
2933e519524SHoward Hinnant    // 27.6.2.4.5 Put area:
2943e519524SHoward Hinnant    virtual streamsize xsputn(const char_type* __s, streamsize __n);
2953e519524SHoward Hinnant    virtual int_type overflow(int_type __c = traits_type::eof());
2963e519524SHoward Hinnant
2973e519524SHoward Hinnantprivate:
2983e519524SHoward Hinnant    locale __loc_;
2993e519524SHoward Hinnant    char_type* __binp_;
3003e519524SHoward Hinnant    char_type* __ninp_;
3013e519524SHoward Hinnant    char_type* __einp_;
3023e519524SHoward Hinnant    char_type* __bout_;
3033e519524SHoward Hinnant    char_type* __nout_;
3043e519524SHoward Hinnant    char_type* __eout_;
3053e519524SHoward Hinnant};
3063e519524SHoward Hinnant
3073e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3083e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::~basic_streambuf()
3093e519524SHoward Hinnant{
3103e519524SHoward Hinnant}
3113e519524SHoward Hinnant
3123e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3133e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::basic_streambuf()
314527a7fdfSBruce Mitchener    : __binp_(nullptr),
315527a7fdfSBruce Mitchener      __ninp_(nullptr),
316527a7fdfSBruce Mitchener      __einp_(nullptr),
317527a7fdfSBruce Mitchener      __bout_(nullptr),
318527a7fdfSBruce Mitchener      __nout_(nullptr),
319527a7fdfSBruce Mitchener      __eout_(nullptr)
3203e519524SHoward Hinnant{
3213e519524SHoward Hinnant}
3223e519524SHoward Hinnant
3233e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3243e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::basic_streambuf(const basic_streambuf& __sb)
3253e519524SHoward Hinnant    : __loc_(__sb.__loc_),
3263e519524SHoward Hinnant      __binp_(__sb.__binp_),
3273e519524SHoward Hinnant      __ninp_(__sb.__ninp_),
3283e519524SHoward Hinnant      __einp_(__sb.__einp_),
3293e519524SHoward Hinnant      __bout_(__sb.__bout_),
3303e519524SHoward Hinnant      __nout_(__sb.__nout_),
3313e519524SHoward Hinnant      __eout_(__sb.__eout_)
3323e519524SHoward Hinnant{
3333e519524SHoward Hinnant}
3343e519524SHoward Hinnant
3353e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3363e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>&
3373e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::operator=(const basic_streambuf& __sb)
3383e519524SHoward Hinnant{
3393e519524SHoward Hinnant    __loc_ = __sb.__loc_;
3403e519524SHoward Hinnant    __binp_ = __sb.__binp_;
3413e519524SHoward Hinnant    __ninp_ = __sb.__ninp_;
3423e519524SHoward Hinnant    __einp_ = __sb.__einp_;
3433e519524SHoward Hinnant    __bout_ = __sb.__bout_;
3443e519524SHoward Hinnant    __nout_ = __sb.__nout_;
3453e519524SHoward Hinnant    __eout_ = __sb.__eout_;
3463e519524SHoward Hinnant    return *this;
3473e519524SHoward Hinnant}
3483e519524SHoward Hinnant
3493e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3503e519524SHoward Hinnantvoid
3513e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::swap(basic_streambuf& __sb)
3523e519524SHoward Hinnant{
353ce48a113SHoward Hinnant    _VSTD::swap(__loc_, __sb.__loc_);
354ce48a113SHoward Hinnant    _VSTD::swap(__binp_, __sb.__binp_);
355ce48a113SHoward Hinnant    _VSTD::swap(__ninp_, __sb.__ninp_);
356ce48a113SHoward Hinnant    _VSTD::swap(__einp_, __sb.__einp_);
357ce48a113SHoward Hinnant    _VSTD::swap(__bout_, __sb.__bout_);
358ce48a113SHoward Hinnant    _VSTD::swap(__nout_, __sb.__nout_);
359ce48a113SHoward Hinnant    _VSTD::swap(__eout_, __sb.__eout_);
3603e519524SHoward Hinnant}
3613e519524SHoward Hinnant
3623e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3633e519524SHoward Hinnantvoid
3643e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::imbue(const locale&)
3653e519524SHoward Hinnant{
3663e519524SHoward Hinnant}
3673e519524SHoward Hinnant
3683e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3693e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>*
3703e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::setbuf(char_type*, streamsize)
3713e519524SHoward Hinnant{
3723e519524SHoward Hinnant    return this;
3733e519524SHoward Hinnant}
3743e519524SHoward Hinnant
3753e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3763e519524SHoward Hinnanttypename basic_streambuf<_CharT, _Traits>::pos_type
377c206366fSHoward Hinnantbasic_streambuf<_CharT, _Traits>::seekoff(off_type, ios_base::seekdir,
378c206366fSHoward Hinnant                                          ios_base::openmode)
3793e519524SHoward Hinnant{
3803e519524SHoward Hinnant    return pos_type(off_type(-1));
3813e519524SHoward Hinnant}
3823e519524SHoward Hinnant
3833e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3843e519524SHoward Hinnanttypename basic_streambuf<_CharT, _Traits>::pos_type
385c206366fSHoward Hinnantbasic_streambuf<_CharT, _Traits>::seekpos(pos_type, ios_base::openmode)
3863e519524SHoward Hinnant{
3873e519524SHoward Hinnant    return pos_type(off_type(-1));
3883e519524SHoward Hinnant}
3893e519524SHoward Hinnant
3903e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3913e519524SHoward Hinnantint
3923e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::sync()
3933e519524SHoward Hinnant{
3943e519524SHoward Hinnant    return 0;
3953e519524SHoward Hinnant}
3963e519524SHoward Hinnant
3973e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3983e519524SHoward Hinnantstreamsize
3993e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::showmanyc()
4003e519524SHoward Hinnant{
4013e519524SHoward Hinnant    return 0;
4023e519524SHoward Hinnant}
4033e519524SHoward Hinnant
4043e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
4053e519524SHoward Hinnantstreamsize
4063e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::xsgetn(char_type* __s, streamsize __n)
4073e519524SHoward Hinnant{
4083e519524SHoward Hinnant    const int_type __eof = traits_type::eof();
4093e519524SHoward Hinnant    int_type __c;
4103e519524SHoward Hinnant    streamsize __i = 0;
41172d6a934SEvandro Menezes    while(__i < __n)
4123e519524SHoward Hinnant    {
4133e519524SHoward Hinnant        if (__ninp_ < __einp_)
41472d6a934SEvandro Menezes        {
415e5cc2fccSMarshall Clow            const streamsize __len = _VSTD::min(static_cast<streamsize>(INT_MAX),
416e5cc2fccSMarshall Clow                                _VSTD::min(__einp_ - __ninp_, __n - __i));
41772d6a934SEvandro Menezes            traits_type::copy(__s, __ninp_, __len);
41872d6a934SEvandro Menezes            __s +=  __len;
41972d6a934SEvandro Menezes            __i +=  __len;
42072d6a934SEvandro Menezes            this->gbump(__len);
42172d6a934SEvandro Menezes        }
4223e519524SHoward Hinnant        else if ((__c = uflow()) != __eof)
42372d6a934SEvandro Menezes        {
4243e519524SHoward Hinnant            *__s = traits_type::to_char_type(__c);
42572d6a934SEvandro Menezes            ++__s;
42672d6a934SEvandro Menezes            ++__i;
42772d6a934SEvandro Menezes        }
4283e519524SHoward Hinnant        else
4293e519524SHoward Hinnant            break;
4303e519524SHoward Hinnant    }
4313e519524SHoward Hinnant    return __i;
4323e519524SHoward Hinnant}
4333e519524SHoward Hinnant
4343e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
4353e519524SHoward Hinnanttypename basic_streambuf<_CharT, _Traits>::int_type
4363e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::underflow()
4373e519524SHoward Hinnant{
4383e519524SHoward Hinnant    return traits_type::eof();
4393e519524SHoward Hinnant}
4403e519524SHoward Hinnant
4413e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
4423e519524SHoward Hinnanttypename basic_streambuf<_CharT, _Traits>::int_type
4433e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::uflow()
4443e519524SHoward Hinnant{
4453e519524SHoward Hinnant    if (underflow() == traits_type::eof())
4463e519524SHoward Hinnant        return traits_type::eof();
4473e519524SHoward Hinnant    return traits_type::to_int_type(*__ninp_++);
4483e519524SHoward Hinnant}
4493e519524SHoward Hinnant
4503e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
4513e519524SHoward Hinnanttypename basic_streambuf<_CharT, _Traits>::int_type
4523e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::pbackfail(int_type)
4533e519524SHoward Hinnant{
4543e519524SHoward Hinnant    return traits_type::eof();
4553e519524SHoward Hinnant}
4563e519524SHoward Hinnant
4573e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
4583e519524SHoward Hinnantstreamsize
4593e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::xsputn(const char_type* __s, streamsize __n)
4603e519524SHoward Hinnant{
4613e519524SHoward Hinnant    streamsize __i = 0;
4623e519524SHoward Hinnant    int_type __eof = traits_type::eof();
46309921a57SMarshall Clow    while( __i < __n)
4643e519524SHoward Hinnant    {
46509921a57SMarshall Clow        if (__nout_ >= __eout_)
46609921a57SMarshall Clow        {
46709921a57SMarshall Clow            if (overflow(traits_type::to_int_type(*__s)) == __eof)
4683e519524SHoward Hinnant                break;
46909921a57SMarshall Clow            ++__s;
47009921a57SMarshall Clow            ++__i;
47109921a57SMarshall Clow        }
47209921a57SMarshall Clow        else
47309921a57SMarshall Clow        {
47409921a57SMarshall Clow            streamsize __chunk_size = _VSTD::min(__eout_ - __nout_, __n - __i);
47509921a57SMarshall Clow            traits_type::copy(__nout_, __s, __chunk_size);
47609921a57SMarshall Clow            __nout_ += __chunk_size;
47709921a57SMarshall Clow            __s     += __chunk_size;
47809921a57SMarshall Clow            __i     += __chunk_size;
47909921a57SMarshall Clow        }
4803e519524SHoward Hinnant    }
4813e519524SHoward Hinnant    return __i;
4823e519524SHoward Hinnant}
4833e519524SHoward Hinnant
4843e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
4853e519524SHoward Hinnanttypename basic_streambuf<_CharT, _Traits>::int_type
486c206366fSHoward Hinnantbasic_streambuf<_CharT, _Traits>::overflow(int_type)
4873e519524SHoward Hinnant{
4883e519524SHoward Hinnant    return traits_type::eof();
4893e519524SHoward Hinnant}
4903e519524SHoward Hinnant
491*2ae52326SLouis Dionneextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_streambuf<char>;
492*2ae52326SLouis Dionneextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_streambuf<wchar_t>;
4933e519524SHoward Hinnant
494*2ae52326SLouis Dionneextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ios<char>;
495*2ae52326SLouis Dionneextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ios<wchar_t>;
4963e519524SHoward Hinnant
4973e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
4983e519524SHoward Hinnant
499a016efb1SEric Fiselier_LIBCPP_POP_MACROS
500a016efb1SEric Fiselier
50127e5bffbSArthur O'Dwyer#endif // _LIBCPP_STREAMBUF
502