13e519524SHoward Hinnant// -*- C++ -*-
23e519524SHoward Hinnant//===------------------------- streambuf ----------------------------------===//
33e519524SHoward Hinnant//
45b08a8a4SHoward Hinnant//                     The LLVM Compiler Infrastructure
53e519524SHoward Hinnant//
6412dbebeSHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
7412dbebeSHoward Hinnant// Source Licenses. See LICENSE.TXT for details.
83e519524SHoward Hinnant//
93e519524SHoward Hinnant//===----------------------------------------------------------------------===//
103e519524SHoward Hinnant
113e519524SHoward Hinnant#ifndef _LIBCPP_STEAMBUF
123e519524SHoward Hinnant#define _LIBCPP_STEAMBUF
133e519524SHoward Hinnant
143e519524SHoward Hinnant/*
153e519524SHoward Hinnant    streambuf synopsis
163e519524SHoward Hinnant
173e519524SHoward Hinnantnamespace std
183e519524SHoward Hinnant{
193e519524SHoward Hinnant
203e519524SHoward Hinnanttemplate <class charT, class traits = char_traits<charT> >
213e519524SHoward Hinnantclass basic_streambuf
223e519524SHoward Hinnant{
233e519524SHoward Hinnantpublic:
243e519524SHoward Hinnant    // types:
253e519524SHoward Hinnant    typedef charT char_type;
263e519524SHoward Hinnant    typedef traits traits_type;
273e519524SHoward Hinnant    typedef typename traits_type::int_type int_type;
283e519524SHoward Hinnant    typedef typename traits_type::pos_type pos_type;
293e519524SHoward Hinnant    typedef typename traits_type::off_type off_type;
303e519524SHoward Hinnant
313e519524SHoward Hinnant    virtual ~basic_streambuf();
323e519524SHoward Hinnant
333e519524SHoward Hinnant    // 27.6.2.2.1 locales:
343e519524SHoward Hinnant    locale pubimbue(const locale& loc);
353e519524SHoward Hinnant    locale getloc() const;
363e519524SHoward Hinnant
373e519524SHoward Hinnant    // 27.6.2.2.2 buffer and positioning:
383e519524SHoward Hinnant    basic_streambuf* pubsetbuf(char_type* s, streamsize n);
393e519524SHoward Hinnant    pos_type pubseekoff(off_type off, ios_base::seekdir way,
403e519524SHoward Hinnant                        ios_base::openmode which = ios_base::in | ios_base::out);
413e519524SHoward Hinnant    pos_type pubseekpos(pos_type sp,
423e519524SHoward Hinnant                        ios_base::openmode which = ios_base::in | ios_base::out);
433e519524SHoward Hinnant    int pubsync();
443e519524SHoward Hinnant
453e519524SHoward Hinnant    // Get and put areas:
463e519524SHoward Hinnant    // 27.6.2.2.3 Get area:
473e519524SHoward Hinnant    streamsize in_avail();
483e519524SHoward Hinnant    int_type snextc();
493e519524SHoward Hinnant    int_type sbumpc();
503e519524SHoward Hinnant    int_type sgetc();
513e519524SHoward Hinnant    streamsize sgetn(char_type* s, streamsize n);
523e519524SHoward Hinnant
533e519524SHoward Hinnant    // 27.6.2.2.4 Putback:
543e519524SHoward Hinnant    int_type sputbackc(char_type c);
553e519524SHoward Hinnant    int_type sungetc();
563e519524SHoward Hinnant
573e519524SHoward Hinnant    // 27.6.2.2.5 Put area:
583e519524SHoward Hinnant    int_type sputc(char_type c);
593e519524SHoward Hinnant    streamsize sputn(const char_type* s, streamsize n);
603e519524SHoward Hinnant
613e519524SHoward Hinnantprotected:
623e519524SHoward Hinnant    basic_streambuf();
633e519524SHoward Hinnant    basic_streambuf(const basic_streambuf& rhs);
643e519524SHoward Hinnant    basic_streambuf& operator=(const basic_streambuf& rhs);
653e519524SHoward Hinnant    void swap(basic_streambuf& rhs);
663e519524SHoward Hinnant
673e519524SHoward Hinnant    // 27.6.2.3.2 Get area:
683e519524SHoward Hinnant    char_type* eback() const;
693e519524SHoward Hinnant    char_type* gptr() const;
703e519524SHoward Hinnant    char_type* egptr() const;
713e519524SHoward Hinnant    void gbump(int n);
723e519524SHoward Hinnant    void setg(char_type* gbeg, char_type* gnext, char_type* gend);
733e519524SHoward Hinnant
743e519524SHoward Hinnant    // 27.6.2.3.3 Put area:
753e519524SHoward Hinnant    char_type* pbase() const;
763e519524SHoward Hinnant    char_type* pptr() const;
773e519524SHoward Hinnant    char_type* epptr() const;
783e519524SHoward Hinnant    void pbump(int n);
793e519524SHoward Hinnant    void setp(char_type* pbeg, char_type* pend);
803e519524SHoward Hinnant
813e519524SHoward Hinnant    // 27.6.2.4 virtual functions:
823e519524SHoward Hinnant    // 27.6.2.4.1 Locales:
833e519524SHoward Hinnant    virtual void imbue(const locale& loc);
843e519524SHoward Hinnant
853e519524SHoward Hinnant    // 27.6.2.4.2 Buffer management and positioning:
863e519524SHoward Hinnant    virtual basic_streambuf* setbuf(char_type* s, streamsize n);
873e519524SHoward Hinnant    virtual pos_type seekoff(off_type off, ios_base::seekdir way,
883e519524SHoward Hinnant                             ios_base::openmode which = ios_base::in | ios_base::out);
893e519524SHoward Hinnant    virtual pos_type seekpos(pos_type sp,
903e519524SHoward Hinnant                             ios_base::openmode which = ios_base::in | ios_base::out);
913e519524SHoward Hinnant    virtual int sync();
923e519524SHoward Hinnant
933e519524SHoward Hinnant    // 27.6.2.4.3 Get area:
943e519524SHoward Hinnant    virtual streamsize showmanyc();
953e519524SHoward Hinnant    virtual streamsize xsgetn(char_type* s, streamsize n);
963e519524SHoward Hinnant    virtual int_type underflow();
973e519524SHoward Hinnant    virtual int_type uflow();
983e519524SHoward Hinnant
993e519524SHoward Hinnant    // 27.6.2.4.4 Putback:
1003e519524SHoward Hinnant    virtual int_type pbackfail(int_type c = traits_type::eof());
1013e519524SHoward Hinnant
1023e519524SHoward Hinnant    // 27.6.2.4.5 Put area:
1033e519524SHoward Hinnant    virtual streamsize xsputn(const char_type* s, streamsize n);
1043e519524SHoward Hinnant    virtual int_type overflow (int_type c = traits_type::eof());
1053e519524SHoward Hinnant};
1063e519524SHoward Hinnant
1073e519524SHoward Hinnant}  // std
1083e519524SHoward Hinnant
1093e519524SHoward Hinnant*/
1103e519524SHoward Hinnant
1113e519524SHoward Hinnant#include <__config>
1123e519524SHoward Hinnant#include <iosfwd>
1133e519524SHoward Hinnant#include <ios>
1143e519524SHoward Hinnant
115073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
1163e519524SHoward Hinnant#pragma GCC system_header
117073458b1SHoward Hinnant#endif
1183e519524SHoward Hinnant
1193e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
1203e519524SHoward Hinnant
1213e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
122*e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS basic_streambuf
1233e519524SHoward Hinnant{
1243e519524SHoward Hinnantpublic:
1253e519524SHoward Hinnant    // types:
1263e519524SHoward Hinnant    typedef _CharT                         char_type;
1273e519524SHoward Hinnant    typedef _Traits                        traits_type;
1283e519524SHoward Hinnant    typedef typename traits_type::int_type int_type;
1293e519524SHoward Hinnant    typedef typename traits_type::pos_type pos_type;
1303e519524SHoward Hinnant    typedef typename traits_type::off_type off_type;
1313e519524SHoward Hinnant
1323e519524SHoward Hinnant    virtual ~basic_streambuf();
1333e519524SHoward Hinnant
1343e519524SHoward Hinnant    // 27.6.2.2.1 locales:
135f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
136f8f31c49SEric Fiselier    locale pubimbue(const locale& __loc) {
137f8f31c49SEric Fiselier        imbue(__loc);
138f8f31c49SEric Fiselier        locale __r = __loc_;
139f8f31c49SEric Fiselier        __loc_ = __loc;
140f8f31c49SEric Fiselier        return __r;
141f8f31c49SEric Fiselier    }
142f8f31c49SEric Fiselier
143f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
144f8f31c49SEric Fiselier    locale getloc() const { return __loc_; }
1453e519524SHoward Hinnant
1463e519524SHoward Hinnant    // 27.6.2.2.2 buffer and positioning:
147f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
148f8f31c49SEric Fiselier    basic_streambuf* pubsetbuf(char_type* __s, streamsize __n)
149f8f31c49SEric Fiselier    { return setbuf(__s, __n); }
150f8f31c49SEric Fiselier
151f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
1523e519524SHoward Hinnant    pos_type pubseekoff(off_type __off, ios_base::seekdir __way,
153f8f31c49SEric Fiselier                        ios_base::openmode __which = ios_base::in | ios_base::out)
154f8f31c49SEric Fiselier    { return seekoff(__off, __way, __which); }
155f8f31c49SEric Fiselier
156f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
1573e519524SHoward Hinnant    pos_type pubseekpos(pos_type __sp,
158f8f31c49SEric Fiselier                        ios_base::openmode __which = ios_base::in | ios_base::out)
159f8f31c49SEric Fiselier    { return seekpos(__sp, __which); }
160f8f31c49SEric Fiselier
161f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
162f8f31c49SEric Fiselier    int pubsync() { return sync(); }
1633e519524SHoward Hinnant
1643e519524SHoward Hinnant    // Get and put areas:
1653e519524SHoward Hinnant    // 27.6.2.2.3 Get area:
166f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
167f8f31c49SEric Fiselier    streamsize in_avail() {
168f8f31c49SEric Fiselier        if (__ninp_ < __einp_)
169f8f31c49SEric Fiselier            return static_cast<streamsize>(__einp_ - __ninp_);
170f8f31c49SEric Fiselier        return showmanyc();
171f8f31c49SEric Fiselier    }
172f8f31c49SEric Fiselier
173f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
174f8f31c49SEric Fiselier    int_type snextc() {
175f8f31c49SEric Fiselier        if (sbumpc() == traits_type::eof())
176f8f31c49SEric Fiselier            return traits_type::eof();
177f8f31c49SEric Fiselier        return sgetc();
178f8f31c49SEric Fiselier    }
179f8f31c49SEric Fiselier
180f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
181f8f31c49SEric Fiselier    int_type sbumpc() {
182f8f31c49SEric Fiselier        if (__ninp_ == __einp_)
183f8f31c49SEric Fiselier            return uflow();
184f8f31c49SEric Fiselier        return traits_type::to_int_type(*__ninp_++);
185f8f31c49SEric Fiselier    }
186f8f31c49SEric Fiselier
187f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
188f8f31c49SEric Fiselier    int_type sgetc() {
189f8f31c49SEric Fiselier        if (__ninp_ == __einp_)
190f8f31c49SEric Fiselier            return underflow();
191f8f31c49SEric Fiselier        return traits_type::to_int_type(*__ninp_);
192f8f31c49SEric Fiselier    }
193f8f31c49SEric Fiselier
194f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
195f8f31c49SEric Fiselier    streamsize sgetn(char_type* __s, streamsize __n)
196f8f31c49SEric Fiselier    { return xsgetn(__s, __n); }
1973e519524SHoward Hinnant
1983e519524SHoward Hinnant    // 27.6.2.2.4 Putback:
199f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
200f8f31c49SEric Fiselier    int_type sputbackc(char_type __c) {
201f8f31c49SEric Fiselier        if (__binp_ == __ninp_ || !traits_type::eq(__c, __ninp_[-1]))
202f8f31c49SEric Fiselier            return pbackfail(traits_type::to_int_type(__c));
203f8f31c49SEric Fiselier        return traits_type::to_int_type(*--__ninp_);
204f8f31c49SEric Fiselier    }
205f8f31c49SEric Fiselier
206f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
207f8f31c49SEric Fiselier    int_type sungetc() {
208f8f31c49SEric Fiselier        if (__binp_ == __ninp_)
209f8f31c49SEric Fiselier          return pbackfail();
210f8f31c49SEric Fiselier        return traits_type::to_int_type(*--__ninp_);
211f8f31c49SEric Fiselier    }
2123e519524SHoward Hinnant
2133e519524SHoward Hinnant    // 27.6.2.2.5 Put area:
214f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
215f8f31c49SEric Fiselier    int_type sputc(char_type __c) {
216f8f31c49SEric Fiselier        if (__nout_ == __eout_)
217f8f31c49SEric Fiselier            return overflow(traits_type::to_int_type(__c));
218f8f31c49SEric Fiselier        *__nout_++ = __c;
219f8f31c49SEric Fiselier        return traits_type::to_int_type(__c);
220f8f31c49SEric Fiselier    }
221f8f31c49SEric Fiselier
222f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
223f8f31c49SEric Fiselier    streamsize sputn(const char_type* __s, streamsize __n)
224f8f31c49SEric Fiselier    { return xsputn(__s, __n); }
2253e519524SHoward Hinnant
2263e519524SHoward Hinnantprotected:
2273e519524SHoward Hinnant    basic_streambuf();
2283e519524SHoward Hinnant    basic_streambuf(const basic_streambuf& __rhs);
2293e519524SHoward Hinnant    basic_streambuf& operator=(const basic_streambuf& __rhs);
2303e519524SHoward Hinnant    void swap(basic_streambuf& __rhs);
2313e519524SHoward Hinnant
2323e519524SHoward Hinnant    // 27.6.2.3.2 Get area:
2333e519524SHoward Hinnant    _LIBCPP_ALWAYS_INLINE char_type* eback() const {return __binp_;}
2343e519524SHoward Hinnant    _LIBCPP_ALWAYS_INLINE char_type* gptr()  const {return __ninp_;}
2353e519524SHoward Hinnant    _LIBCPP_ALWAYS_INLINE char_type* egptr() const {return __einp_;}
236f8f31c49SEric Fiselier
237f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
238f8f31c49SEric Fiselier    void gbump(int __n) { __ninp_ += __n; }
239f8f31c49SEric Fiselier
240f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
241f8f31c49SEric Fiselier    void setg(char_type* __gbeg, char_type* __gnext, char_type* __gend) {
242f8f31c49SEric Fiselier        __binp_ = __gbeg;
243f8f31c49SEric Fiselier        __ninp_ = __gnext;
244f8f31c49SEric Fiselier        __einp_ = __gend;
245f8f31c49SEric Fiselier    }
2463e519524SHoward Hinnant
2473e519524SHoward Hinnant    // 27.6.2.3.3 Put area:
2483e519524SHoward Hinnant    _LIBCPP_ALWAYS_INLINE char_type* pbase() const {return __bout_;}
2493e519524SHoward Hinnant    _LIBCPP_ALWAYS_INLINE char_type* pptr()  const {return __nout_;}
2503e519524SHoward Hinnant    _LIBCPP_ALWAYS_INLINE char_type* epptr() const {return __eout_;}
251f8f31c49SEric Fiselier
252f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
253f8f31c49SEric Fiselier    void pbump(int __n) { __nout_ += __n; }
254f8f31c49SEric Fiselier
255f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
256f8f31c49SEric Fiselier    void setp(char_type* __pbeg, char_type* __pend) {
257f8f31c49SEric Fiselier        __bout_ = __nout_ = __pbeg;
258f8f31c49SEric Fiselier        __eout_ = __pend;
259f8f31c49SEric Fiselier    }
2603e519524SHoward Hinnant
2613e519524SHoward Hinnant    // 27.6.2.4 virtual functions:
2623e519524SHoward Hinnant    // 27.6.2.4.1 Locales:
2633e519524SHoward Hinnant    virtual void imbue(const locale& __loc);
2643e519524SHoward Hinnant
2653e519524SHoward Hinnant    // 27.6.2.4.2 Buffer management and positioning:
2663e519524SHoward Hinnant    virtual basic_streambuf* setbuf(char_type* __s, streamsize __n);
2673e519524SHoward Hinnant    virtual pos_type seekoff(off_type __off, ios_base::seekdir __way,
2683e519524SHoward Hinnant                             ios_base::openmode __which = ios_base::in | ios_base::out);
2693e519524SHoward Hinnant    virtual pos_type seekpos(pos_type __sp,
2703e519524SHoward Hinnant                             ios_base::openmode __which = ios_base::in | ios_base::out);
2713e519524SHoward Hinnant    virtual int sync();
2723e519524SHoward Hinnant
2733e519524SHoward Hinnant    // 27.6.2.4.3 Get area:
2743e519524SHoward Hinnant    virtual streamsize showmanyc();
2753e519524SHoward Hinnant    virtual streamsize xsgetn(char_type* __s, streamsize __n);
2763e519524SHoward Hinnant    virtual int_type underflow();
2773e519524SHoward Hinnant    virtual int_type uflow();
2783e519524SHoward Hinnant
2793e519524SHoward Hinnant    // 27.6.2.4.4 Putback:
2803e519524SHoward Hinnant    virtual int_type pbackfail(int_type __c = traits_type::eof());
2813e519524SHoward Hinnant
2823e519524SHoward Hinnant    // 27.6.2.4.5 Put area:
2833e519524SHoward Hinnant    virtual streamsize xsputn(const char_type* __s, streamsize __n);
2843e519524SHoward Hinnant    virtual int_type overflow(int_type __c = traits_type::eof());
2853e519524SHoward Hinnant
2863e519524SHoward Hinnantprivate:
2873e519524SHoward Hinnant    locale __loc_;
2883e519524SHoward Hinnant    char_type* __binp_;
2893e519524SHoward Hinnant    char_type* __ninp_;
2903e519524SHoward Hinnant    char_type* __einp_;
2913e519524SHoward Hinnant    char_type* __bout_;
2923e519524SHoward Hinnant    char_type* __nout_;
2933e519524SHoward Hinnant    char_type* __eout_;
2943e519524SHoward Hinnant};
2953e519524SHoward Hinnant
2963e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
2973e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::~basic_streambuf()
2983e519524SHoward Hinnant{
2993e519524SHoward Hinnant}
3003e519524SHoward Hinnant
3013e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3023e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::basic_streambuf()
3033e519524SHoward Hinnant    : __binp_(0),
3043e519524SHoward Hinnant      __ninp_(0),
3053e519524SHoward Hinnant      __einp_(0),
3063e519524SHoward Hinnant      __bout_(0),
3073e519524SHoward Hinnant      __nout_(0),
3083e519524SHoward Hinnant      __eout_(0)
3093e519524SHoward Hinnant{
3103e519524SHoward Hinnant}
3113e519524SHoward Hinnant
3123e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3133e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::basic_streambuf(const basic_streambuf& __sb)
3143e519524SHoward Hinnant    : __loc_(__sb.__loc_),
3153e519524SHoward Hinnant      __binp_(__sb.__binp_),
3163e519524SHoward Hinnant      __ninp_(__sb.__ninp_),
3173e519524SHoward Hinnant      __einp_(__sb.__einp_),
3183e519524SHoward Hinnant      __bout_(__sb.__bout_),
3193e519524SHoward Hinnant      __nout_(__sb.__nout_),
3203e519524SHoward Hinnant      __eout_(__sb.__eout_)
3213e519524SHoward Hinnant{
3223e519524SHoward Hinnant}
3233e519524SHoward Hinnant
3243e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3253e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>&
3263e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::operator=(const basic_streambuf& __sb)
3273e519524SHoward Hinnant{
3283e519524SHoward Hinnant    __loc_ = __sb.__loc_;
3293e519524SHoward Hinnant    __binp_ = __sb.__binp_;
3303e519524SHoward Hinnant    __ninp_ = __sb.__ninp_;
3313e519524SHoward Hinnant    __einp_ = __sb.__einp_;
3323e519524SHoward Hinnant    __bout_ = __sb.__bout_;
3333e519524SHoward Hinnant    __nout_ = __sb.__nout_;
3343e519524SHoward Hinnant    __eout_ = __sb.__eout_;
3353e519524SHoward Hinnant    return *this;
3363e519524SHoward Hinnant}
3373e519524SHoward Hinnant
3383e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3393e519524SHoward Hinnantvoid
3403e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::swap(basic_streambuf& __sb)
3413e519524SHoward Hinnant{
342ce48a113SHoward Hinnant    _VSTD::swap(__loc_, __sb.__loc_);
343ce48a113SHoward Hinnant    _VSTD::swap(__binp_, __sb.__binp_);
344ce48a113SHoward Hinnant    _VSTD::swap(__ninp_, __sb.__ninp_);
345ce48a113SHoward Hinnant    _VSTD::swap(__einp_, __sb.__einp_);
346ce48a113SHoward Hinnant    _VSTD::swap(__bout_, __sb.__bout_);
347ce48a113SHoward Hinnant    _VSTD::swap(__nout_, __sb.__nout_);
348ce48a113SHoward Hinnant    _VSTD::swap(__eout_, __sb.__eout_);
3493e519524SHoward Hinnant}
3503e519524SHoward Hinnant
3513e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3523e519524SHoward Hinnantvoid
3533e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::imbue(const locale&)
3543e519524SHoward Hinnant{
3553e519524SHoward Hinnant}
3563e519524SHoward Hinnant
3573e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3583e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>*
3593e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::setbuf(char_type*, streamsize)
3603e519524SHoward Hinnant{
3613e519524SHoward Hinnant    return this;
3623e519524SHoward Hinnant}
3633e519524SHoward Hinnant
3643e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3653e519524SHoward Hinnanttypename basic_streambuf<_CharT, _Traits>::pos_type
366c206366fSHoward Hinnantbasic_streambuf<_CharT, _Traits>::seekoff(off_type, ios_base::seekdir,
367c206366fSHoward Hinnant                                          ios_base::openmode)
3683e519524SHoward Hinnant{
3693e519524SHoward Hinnant    return pos_type(off_type(-1));
3703e519524SHoward Hinnant}
3713e519524SHoward Hinnant
3723e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3733e519524SHoward Hinnanttypename basic_streambuf<_CharT, _Traits>::pos_type
374c206366fSHoward Hinnantbasic_streambuf<_CharT, _Traits>::seekpos(pos_type, ios_base::openmode)
3753e519524SHoward Hinnant{
3763e519524SHoward Hinnant    return pos_type(off_type(-1));
3773e519524SHoward Hinnant}
3783e519524SHoward Hinnant
3793e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3803e519524SHoward Hinnantint
3813e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::sync()
3823e519524SHoward Hinnant{
3833e519524SHoward Hinnant    return 0;
3843e519524SHoward Hinnant}
3853e519524SHoward Hinnant
3863e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3873e519524SHoward Hinnantstreamsize
3883e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::showmanyc()
3893e519524SHoward Hinnant{
3903e519524SHoward Hinnant    return 0;
3913e519524SHoward Hinnant}
3923e519524SHoward Hinnant
3933e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3943e519524SHoward Hinnantstreamsize
3953e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::xsgetn(char_type* __s, streamsize __n)
3963e519524SHoward Hinnant{
3973e519524SHoward Hinnant    const int_type __eof = traits_type::eof();
3983e519524SHoward Hinnant    int_type __c;
3993e519524SHoward Hinnant    streamsize __i = 0;
40072d6a934SEvandro Menezes    while(__i < __n)
4013e519524SHoward Hinnant    {
4023e519524SHoward Hinnant        if (__ninp_ < __einp_)
40372d6a934SEvandro Menezes        {
40472d6a934SEvandro Menezes            const streamsize __len = _VSTD::min(__einp_ - __ninp_, __n - __i);
40572d6a934SEvandro Menezes            traits_type::copy(__s, __ninp_, __len);
40672d6a934SEvandro Menezes            __s +=  __len;
40772d6a934SEvandro Menezes            __i +=  __len;
40872d6a934SEvandro Menezes            this->gbump(__len);
40972d6a934SEvandro Menezes        }
4103e519524SHoward Hinnant        else if ((__c = uflow()) != __eof)
41172d6a934SEvandro Menezes        {
4123e519524SHoward Hinnant            *__s = traits_type::to_char_type(__c);
41372d6a934SEvandro Menezes            ++__s;
41472d6a934SEvandro Menezes            ++__i;
41572d6a934SEvandro Menezes        }
4163e519524SHoward Hinnant        else
4173e519524SHoward Hinnant            break;
4183e519524SHoward Hinnant    }
4193e519524SHoward Hinnant    return __i;
4203e519524SHoward Hinnant}
4213e519524SHoward Hinnant
4223e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
4233e519524SHoward Hinnanttypename basic_streambuf<_CharT, _Traits>::int_type
4243e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::underflow()
4253e519524SHoward Hinnant{
4263e519524SHoward Hinnant    return traits_type::eof();
4273e519524SHoward Hinnant}
4283e519524SHoward Hinnant
4293e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
4303e519524SHoward Hinnanttypename basic_streambuf<_CharT, _Traits>::int_type
4313e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::uflow()
4323e519524SHoward Hinnant{
4333e519524SHoward Hinnant    if (underflow() == traits_type::eof())
4343e519524SHoward Hinnant        return traits_type::eof();
4353e519524SHoward Hinnant    return traits_type::to_int_type(*__ninp_++);
4363e519524SHoward Hinnant}
4373e519524SHoward Hinnant
4383e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
4393e519524SHoward Hinnanttypename basic_streambuf<_CharT, _Traits>::int_type
4403e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::pbackfail(int_type)
4413e519524SHoward Hinnant{
4423e519524SHoward Hinnant    return traits_type::eof();
4433e519524SHoward Hinnant}
4443e519524SHoward Hinnant
4453e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
4463e519524SHoward Hinnantstreamsize
4473e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::xsputn(const char_type* __s, streamsize __n)
4483e519524SHoward Hinnant{
4493e519524SHoward Hinnant    streamsize __i = 0;
4503e519524SHoward Hinnant    int_type __eof = traits_type::eof();
45109921a57SMarshall Clow    while( __i < __n)
4523e519524SHoward Hinnant    {
45309921a57SMarshall Clow        if (__nout_ >= __eout_)
45409921a57SMarshall Clow        {
45509921a57SMarshall Clow            if (overflow(traits_type::to_int_type(*__s)) == __eof)
4563e519524SHoward Hinnant                break;
45709921a57SMarshall Clow            ++__s;
45809921a57SMarshall Clow            ++__i;
45909921a57SMarshall Clow        }
46009921a57SMarshall Clow        else
46109921a57SMarshall Clow        {
46209921a57SMarshall Clow            streamsize __chunk_size = _VSTD::min(__eout_ - __nout_, __n - __i);
46309921a57SMarshall Clow            traits_type::copy(__nout_, __s, __chunk_size);
46409921a57SMarshall Clow            __nout_ += __chunk_size;
46509921a57SMarshall Clow            __s     += __chunk_size;
46609921a57SMarshall Clow            __i     += __chunk_size;
46709921a57SMarshall Clow        }
4683e519524SHoward Hinnant    }
4693e519524SHoward Hinnant    return __i;
4703e519524SHoward Hinnant}
4713e519524SHoward Hinnant
4723e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
4733e519524SHoward Hinnanttypename basic_streambuf<_CharT, _Traits>::int_type
474c206366fSHoward Hinnantbasic_streambuf<_CharT, _Traits>::overflow(int_type)
4753e519524SHoward Hinnant{
4763e519524SHoward Hinnant    return traits_type::eof();
4773e519524SHoward Hinnant}
4783e519524SHoward Hinnant
47949e2967fSEric Fiselier_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_streambuf<char>)
48049e2967fSEric Fiselier_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_streambuf<wchar_t>)
4813e519524SHoward Hinnant
48249e2967fSEric Fiselier_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ios<char>)
48349e2967fSEric Fiselier_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ios<wchar_t>)
4843e519524SHoward Hinnant
4853e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
4863e519524SHoward Hinnant
4873e519524SHoward Hinnant#endif  // _LIBCPP_STEAMBUF
488