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
119a016efb1SEric Fiselier_LIBCPP_PUSH_MACROS
120a016efb1SEric Fiselier#include <__undef_macros>
121a016efb1SEric Fiselier
1223e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
1233e519524SHoward Hinnant
1243e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
125e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS basic_streambuf
1263e519524SHoward Hinnant{
1273e519524SHoward Hinnantpublic:
1283e519524SHoward Hinnant    // types:
1293e519524SHoward Hinnant    typedef _CharT                         char_type;
1303e519524SHoward Hinnant    typedef _Traits                        traits_type;
1313e519524SHoward Hinnant    typedef typename traits_type::int_type int_type;
1323e519524SHoward Hinnant    typedef typename traits_type::pos_type pos_type;
1333e519524SHoward Hinnant    typedef typename traits_type::off_type off_type;
1343e519524SHoward Hinnant
1353e519524SHoward Hinnant    virtual ~basic_streambuf();
1363e519524SHoward Hinnant
1373e519524SHoward Hinnant    // 27.6.2.2.1 locales:
138f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
139f8f31c49SEric Fiselier    locale pubimbue(const locale& __loc) {
140f8f31c49SEric Fiselier        imbue(__loc);
141f8f31c49SEric Fiselier        locale __r = __loc_;
142f8f31c49SEric Fiselier        __loc_ = __loc;
143f8f31c49SEric Fiselier        return __r;
144f8f31c49SEric Fiselier    }
145f8f31c49SEric Fiselier
146f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
147f8f31c49SEric Fiselier    locale getloc() const { return __loc_; }
1483e519524SHoward Hinnant
1493e519524SHoward Hinnant    // 27.6.2.2.2 buffer and positioning:
150f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
151f8f31c49SEric Fiselier    basic_streambuf* pubsetbuf(char_type* __s, streamsize __n)
152f8f31c49SEric Fiselier    { return setbuf(__s, __n); }
153f8f31c49SEric Fiselier
154f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
1553e519524SHoward Hinnant    pos_type pubseekoff(off_type __off, ios_base::seekdir __way,
156f8f31c49SEric Fiselier                        ios_base::openmode __which = ios_base::in | ios_base::out)
157f8f31c49SEric Fiselier    { return seekoff(__off, __way, __which); }
158f8f31c49SEric Fiselier
159f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
1603e519524SHoward Hinnant    pos_type pubseekpos(pos_type __sp,
161f8f31c49SEric Fiselier                        ios_base::openmode __which = ios_base::in | ios_base::out)
162f8f31c49SEric Fiselier    { return seekpos(__sp, __which); }
163f8f31c49SEric Fiselier
164f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
165f8f31c49SEric Fiselier    int pubsync() { return sync(); }
1663e519524SHoward Hinnant
1673e519524SHoward Hinnant    // Get and put areas:
1683e519524SHoward Hinnant    // 27.6.2.2.3 Get area:
169f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
170f8f31c49SEric Fiselier    streamsize in_avail() {
171f8f31c49SEric Fiselier        if (__ninp_ < __einp_)
172f8f31c49SEric Fiselier            return static_cast<streamsize>(__einp_ - __ninp_);
173f8f31c49SEric Fiselier        return showmanyc();
174f8f31c49SEric Fiselier    }
175f8f31c49SEric Fiselier
176f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
177f8f31c49SEric Fiselier    int_type snextc() {
178f8f31c49SEric Fiselier        if (sbumpc() == traits_type::eof())
179f8f31c49SEric Fiselier            return traits_type::eof();
180f8f31c49SEric Fiselier        return sgetc();
181f8f31c49SEric Fiselier    }
182f8f31c49SEric Fiselier
183f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
184f8f31c49SEric Fiselier    int_type sbumpc() {
185f8f31c49SEric Fiselier        if (__ninp_ == __einp_)
186f8f31c49SEric Fiselier            return uflow();
187f8f31c49SEric Fiselier        return traits_type::to_int_type(*__ninp_++);
188f8f31c49SEric Fiselier    }
189f8f31c49SEric Fiselier
190f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
191f8f31c49SEric Fiselier    int_type sgetc() {
192f8f31c49SEric Fiselier        if (__ninp_ == __einp_)
193f8f31c49SEric Fiselier            return underflow();
194f8f31c49SEric Fiselier        return traits_type::to_int_type(*__ninp_);
195f8f31c49SEric Fiselier    }
196f8f31c49SEric Fiselier
197f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
198f8f31c49SEric Fiselier    streamsize sgetn(char_type* __s, streamsize __n)
199f8f31c49SEric Fiselier    { return xsgetn(__s, __n); }
2003e519524SHoward Hinnant
2013e519524SHoward Hinnant    // 27.6.2.2.4 Putback:
202f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
203f8f31c49SEric Fiselier    int_type sputbackc(char_type __c) {
204f8f31c49SEric Fiselier        if (__binp_ == __ninp_ || !traits_type::eq(__c, __ninp_[-1]))
205f8f31c49SEric Fiselier            return pbackfail(traits_type::to_int_type(__c));
206f8f31c49SEric Fiselier        return traits_type::to_int_type(*--__ninp_);
207f8f31c49SEric Fiselier    }
208f8f31c49SEric Fiselier
209f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
210f8f31c49SEric Fiselier    int_type sungetc() {
211f8f31c49SEric Fiselier        if (__binp_ == __ninp_)
212f8f31c49SEric Fiselier          return pbackfail();
213f8f31c49SEric Fiselier        return traits_type::to_int_type(*--__ninp_);
214f8f31c49SEric Fiselier    }
2153e519524SHoward Hinnant
2163e519524SHoward Hinnant    // 27.6.2.2.5 Put area:
217f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
218f8f31c49SEric Fiselier    int_type sputc(char_type __c) {
219f8f31c49SEric Fiselier        if (__nout_ == __eout_)
220f8f31c49SEric Fiselier            return overflow(traits_type::to_int_type(__c));
221f8f31c49SEric Fiselier        *__nout_++ = __c;
222f8f31c49SEric Fiselier        return traits_type::to_int_type(__c);
223f8f31c49SEric Fiselier    }
224f8f31c49SEric Fiselier
225f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
226f8f31c49SEric Fiselier    streamsize sputn(const char_type* __s, streamsize __n)
227f8f31c49SEric Fiselier    { return xsputn(__s, __n); }
2283e519524SHoward Hinnant
2293e519524SHoward Hinnantprotected:
2303e519524SHoward Hinnant    basic_streambuf();
2313e519524SHoward Hinnant    basic_streambuf(const basic_streambuf& __rhs);
2323e519524SHoward Hinnant    basic_streambuf& operator=(const basic_streambuf& __rhs);
2333e519524SHoward Hinnant    void swap(basic_streambuf& __rhs);
2343e519524SHoward Hinnant
2353e519524SHoward Hinnant    // 27.6.2.3.2 Get area:
2363e519524SHoward Hinnant    _LIBCPP_ALWAYS_INLINE char_type* eback() const {return __binp_;}
2373e519524SHoward Hinnant    _LIBCPP_ALWAYS_INLINE char_type* gptr()  const {return __ninp_;}
2383e519524SHoward Hinnant    _LIBCPP_ALWAYS_INLINE char_type* egptr() const {return __einp_;}
239f8f31c49SEric Fiselier
240f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
241f8f31c49SEric Fiselier    void gbump(int __n) { __ninp_ += __n; }
242f8f31c49SEric Fiselier
243f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
244f8f31c49SEric Fiselier    void setg(char_type* __gbeg, char_type* __gnext, char_type* __gend) {
245f8f31c49SEric Fiselier        __binp_ = __gbeg;
246f8f31c49SEric Fiselier        __ninp_ = __gnext;
247f8f31c49SEric Fiselier        __einp_ = __gend;
248f8f31c49SEric Fiselier    }
2493e519524SHoward Hinnant
2503e519524SHoward Hinnant    // 27.6.2.3.3 Put area:
2513e519524SHoward Hinnant    _LIBCPP_ALWAYS_INLINE char_type* pbase() const {return __bout_;}
2523e519524SHoward Hinnant    _LIBCPP_ALWAYS_INLINE char_type* pptr()  const {return __nout_;}
2533e519524SHoward Hinnant    _LIBCPP_ALWAYS_INLINE char_type* epptr() const {return __eout_;}
254f8f31c49SEric Fiselier
255f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
256f8f31c49SEric Fiselier    void pbump(int __n) { __nout_ += __n; }
257f8f31c49SEric Fiselier
258f8f31c49SEric Fiselier    inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
259f8f31c49SEric Fiselier    void setp(char_type* __pbeg, char_type* __pend) {
260f8f31c49SEric Fiselier        __bout_ = __nout_ = __pbeg;
261f8f31c49SEric Fiselier        __eout_ = __pend;
262f8f31c49SEric Fiselier    }
2633e519524SHoward Hinnant
2643e519524SHoward Hinnant    // 27.6.2.4 virtual functions:
2653e519524SHoward Hinnant    // 27.6.2.4.1 Locales:
2663e519524SHoward Hinnant    virtual void imbue(const locale& __loc);
2673e519524SHoward Hinnant
2683e519524SHoward Hinnant    // 27.6.2.4.2 Buffer management and positioning:
2693e519524SHoward Hinnant    virtual basic_streambuf* setbuf(char_type* __s, streamsize __n);
2703e519524SHoward Hinnant    virtual pos_type seekoff(off_type __off, ios_base::seekdir __way,
2713e519524SHoward Hinnant                             ios_base::openmode __which = ios_base::in | ios_base::out);
2723e519524SHoward Hinnant    virtual pos_type seekpos(pos_type __sp,
2733e519524SHoward Hinnant                             ios_base::openmode __which = ios_base::in | ios_base::out);
2743e519524SHoward Hinnant    virtual int sync();
2753e519524SHoward Hinnant
2763e519524SHoward Hinnant    // 27.6.2.4.3 Get area:
2773e519524SHoward Hinnant    virtual streamsize showmanyc();
2783e519524SHoward Hinnant    virtual streamsize xsgetn(char_type* __s, streamsize __n);
2793e519524SHoward Hinnant    virtual int_type underflow();
2803e519524SHoward Hinnant    virtual int_type uflow();
2813e519524SHoward Hinnant
2823e519524SHoward Hinnant    // 27.6.2.4.4 Putback:
2833e519524SHoward Hinnant    virtual int_type pbackfail(int_type __c = traits_type::eof());
2843e519524SHoward Hinnant
2853e519524SHoward Hinnant    // 27.6.2.4.5 Put area:
2863e519524SHoward Hinnant    virtual streamsize xsputn(const char_type* __s, streamsize __n);
2873e519524SHoward Hinnant    virtual int_type overflow(int_type __c = traits_type::eof());
2883e519524SHoward Hinnant
2893e519524SHoward Hinnantprivate:
2903e519524SHoward Hinnant    locale __loc_;
2913e519524SHoward Hinnant    char_type* __binp_;
2923e519524SHoward Hinnant    char_type* __ninp_;
2933e519524SHoward Hinnant    char_type* __einp_;
2943e519524SHoward Hinnant    char_type* __bout_;
2953e519524SHoward Hinnant    char_type* __nout_;
2963e519524SHoward Hinnant    char_type* __eout_;
2973e519524SHoward Hinnant};
2983e519524SHoward Hinnant
2993e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3003e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::~basic_streambuf()
3013e519524SHoward Hinnant{
3023e519524SHoward Hinnant}
3033e519524SHoward Hinnant
3043e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3053e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::basic_streambuf()
3063e519524SHoward Hinnant    : __binp_(0),
3073e519524SHoward Hinnant      __ninp_(0),
3083e519524SHoward Hinnant      __einp_(0),
3093e519524SHoward Hinnant      __bout_(0),
3103e519524SHoward Hinnant      __nout_(0),
3113e519524SHoward Hinnant      __eout_(0)
3123e519524SHoward Hinnant{
3133e519524SHoward Hinnant}
3143e519524SHoward Hinnant
3153e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3163e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::basic_streambuf(const basic_streambuf& __sb)
3173e519524SHoward Hinnant    : __loc_(__sb.__loc_),
3183e519524SHoward Hinnant      __binp_(__sb.__binp_),
3193e519524SHoward Hinnant      __ninp_(__sb.__ninp_),
3203e519524SHoward Hinnant      __einp_(__sb.__einp_),
3213e519524SHoward Hinnant      __bout_(__sb.__bout_),
3223e519524SHoward Hinnant      __nout_(__sb.__nout_),
3233e519524SHoward Hinnant      __eout_(__sb.__eout_)
3243e519524SHoward Hinnant{
3253e519524SHoward Hinnant}
3263e519524SHoward Hinnant
3273e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3283e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>&
3293e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::operator=(const basic_streambuf& __sb)
3303e519524SHoward Hinnant{
3313e519524SHoward Hinnant    __loc_ = __sb.__loc_;
3323e519524SHoward Hinnant    __binp_ = __sb.__binp_;
3333e519524SHoward Hinnant    __ninp_ = __sb.__ninp_;
3343e519524SHoward Hinnant    __einp_ = __sb.__einp_;
3353e519524SHoward Hinnant    __bout_ = __sb.__bout_;
3363e519524SHoward Hinnant    __nout_ = __sb.__nout_;
3373e519524SHoward Hinnant    __eout_ = __sb.__eout_;
3383e519524SHoward Hinnant    return *this;
3393e519524SHoward Hinnant}
3403e519524SHoward Hinnant
3413e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3423e519524SHoward Hinnantvoid
3433e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::swap(basic_streambuf& __sb)
3443e519524SHoward Hinnant{
345ce48a113SHoward Hinnant    _VSTD::swap(__loc_, __sb.__loc_);
346ce48a113SHoward Hinnant    _VSTD::swap(__binp_, __sb.__binp_);
347ce48a113SHoward Hinnant    _VSTD::swap(__ninp_, __sb.__ninp_);
348ce48a113SHoward Hinnant    _VSTD::swap(__einp_, __sb.__einp_);
349ce48a113SHoward Hinnant    _VSTD::swap(__bout_, __sb.__bout_);
350ce48a113SHoward Hinnant    _VSTD::swap(__nout_, __sb.__nout_);
351ce48a113SHoward Hinnant    _VSTD::swap(__eout_, __sb.__eout_);
3523e519524SHoward Hinnant}
3533e519524SHoward Hinnant
3543e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3553e519524SHoward Hinnantvoid
3563e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::imbue(const locale&)
3573e519524SHoward Hinnant{
3583e519524SHoward Hinnant}
3593e519524SHoward Hinnant
3603e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3613e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>*
3623e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::setbuf(char_type*, streamsize)
3633e519524SHoward Hinnant{
3643e519524SHoward Hinnant    return this;
3653e519524SHoward Hinnant}
3663e519524SHoward Hinnant
3673e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3683e519524SHoward Hinnanttypename basic_streambuf<_CharT, _Traits>::pos_type
369c206366fSHoward Hinnantbasic_streambuf<_CharT, _Traits>::seekoff(off_type, ios_base::seekdir,
370c206366fSHoward Hinnant                                          ios_base::openmode)
3713e519524SHoward Hinnant{
3723e519524SHoward Hinnant    return pos_type(off_type(-1));
3733e519524SHoward Hinnant}
3743e519524SHoward Hinnant
3753e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3763e519524SHoward Hinnanttypename basic_streambuf<_CharT, _Traits>::pos_type
377c206366fSHoward Hinnantbasic_streambuf<_CharT, _Traits>::seekpos(pos_type, ios_base::openmode)
3783e519524SHoward Hinnant{
3793e519524SHoward Hinnant    return pos_type(off_type(-1));
3803e519524SHoward Hinnant}
3813e519524SHoward Hinnant
3823e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3833e519524SHoward Hinnantint
3843e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::sync()
3853e519524SHoward Hinnant{
3863e519524SHoward Hinnant    return 0;
3873e519524SHoward Hinnant}
3883e519524SHoward Hinnant
3893e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3903e519524SHoward Hinnantstreamsize
3913e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::showmanyc()
3923e519524SHoward Hinnant{
3933e519524SHoward Hinnant    return 0;
3943e519524SHoward Hinnant}
3953e519524SHoward Hinnant
3963e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3973e519524SHoward Hinnantstreamsize
3983e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::xsgetn(char_type* __s, streamsize __n)
3993e519524SHoward Hinnant{
4003e519524SHoward Hinnant    const int_type __eof = traits_type::eof();
4013e519524SHoward Hinnant    int_type __c;
4023e519524SHoward Hinnant    streamsize __i = 0;
40372d6a934SEvandro Menezes    while(__i < __n)
4043e519524SHoward Hinnant    {
4053e519524SHoward Hinnant        if (__ninp_ < __einp_)
40672d6a934SEvandro Menezes        {
407*e5cc2fccSMarshall Clow            const streamsize __len = _VSTD::min(static_cast<streamsize>(INT_MAX),
408*e5cc2fccSMarshall Clow                                _VSTD::min(__einp_ - __ninp_, __n - __i));
40972d6a934SEvandro Menezes            traits_type::copy(__s, __ninp_, __len);
41072d6a934SEvandro Menezes            __s +=  __len;
41172d6a934SEvandro Menezes            __i +=  __len;
41272d6a934SEvandro Menezes            this->gbump(__len);
41372d6a934SEvandro Menezes        }
4143e519524SHoward Hinnant        else if ((__c = uflow()) != __eof)
41572d6a934SEvandro Menezes        {
4163e519524SHoward Hinnant            *__s = traits_type::to_char_type(__c);
41772d6a934SEvandro Menezes            ++__s;
41872d6a934SEvandro Menezes            ++__i;
41972d6a934SEvandro Menezes        }
4203e519524SHoward Hinnant        else
4213e519524SHoward Hinnant            break;
4223e519524SHoward Hinnant    }
4233e519524SHoward Hinnant    return __i;
4243e519524SHoward Hinnant}
4253e519524SHoward Hinnant
4263e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
4273e519524SHoward Hinnanttypename basic_streambuf<_CharT, _Traits>::int_type
4283e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::underflow()
4293e519524SHoward Hinnant{
4303e519524SHoward Hinnant    return traits_type::eof();
4313e519524SHoward Hinnant}
4323e519524SHoward Hinnant
4333e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
4343e519524SHoward Hinnanttypename basic_streambuf<_CharT, _Traits>::int_type
4353e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::uflow()
4363e519524SHoward Hinnant{
4373e519524SHoward Hinnant    if (underflow() == traits_type::eof())
4383e519524SHoward Hinnant        return traits_type::eof();
4393e519524SHoward Hinnant    return traits_type::to_int_type(*__ninp_++);
4403e519524SHoward Hinnant}
4413e519524SHoward Hinnant
4423e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
4433e519524SHoward Hinnanttypename basic_streambuf<_CharT, _Traits>::int_type
4443e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::pbackfail(int_type)
4453e519524SHoward Hinnant{
4463e519524SHoward Hinnant    return traits_type::eof();
4473e519524SHoward Hinnant}
4483e519524SHoward Hinnant
4493e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
4503e519524SHoward Hinnantstreamsize
4513e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::xsputn(const char_type* __s, streamsize __n)
4523e519524SHoward Hinnant{
4533e519524SHoward Hinnant    streamsize __i = 0;
4543e519524SHoward Hinnant    int_type __eof = traits_type::eof();
45509921a57SMarshall Clow    while( __i < __n)
4563e519524SHoward Hinnant    {
45709921a57SMarshall Clow        if (__nout_ >= __eout_)
45809921a57SMarshall Clow        {
45909921a57SMarshall Clow            if (overflow(traits_type::to_int_type(*__s)) == __eof)
4603e519524SHoward Hinnant                break;
46109921a57SMarshall Clow            ++__s;
46209921a57SMarshall Clow            ++__i;
46309921a57SMarshall Clow        }
46409921a57SMarshall Clow        else
46509921a57SMarshall Clow        {
46609921a57SMarshall Clow            streamsize __chunk_size = _VSTD::min(__eout_ - __nout_, __n - __i);
46709921a57SMarshall Clow            traits_type::copy(__nout_, __s, __chunk_size);
46809921a57SMarshall Clow            __nout_ += __chunk_size;
46909921a57SMarshall Clow            __s     += __chunk_size;
47009921a57SMarshall Clow            __i     += __chunk_size;
47109921a57SMarshall Clow        }
4723e519524SHoward Hinnant    }
4733e519524SHoward Hinnant    return __i;
4743e519524SHoward Hinnant}
4753e519524SHoward Hinnant
4763e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
4773e519524SHoward Hinnanttypename basic_streambuf<_CharT, _Traits>::int_type
478c206366fSHoward Hinnantbasic_streambuf<_CharT, _Traits>::overflow(int_type)
4793e519524SHoward Hinnant{
4803e519524SHoward Hinnant    return traits_type::eof();
4813e519524SHoward Hinnant}
4823e519524SHoward Hinnant
483e9c66ad9SMehdi Amini#ifndef _LIBCPP_AVAILABILITY_NO_STREAMS_EXTERN_TEMPLATE
48449e2967fSEric Fiselier_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_streambuf<char>)
48549e2967fSEric Fiselier_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_streambuf<wchar_t>)
4863e519524SHoward Hinnant
48749e2967fSEric Fiselier_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ios<char>)
48849e2967fSEric Fiselier_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ios<wchar_t>)
489e9c66ad9SMehdi Amini#endif
4903e519524SHoward Hinnant
4913e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
4923e519524SHoward Hinnant
493a016efb1SEric Fiselier_LIBCPP_POP_MACROS
494a016efb1SEric Fiselier
4953e519524SHoward Hinnant#endif  // _LIBCPP_STEAMBUF
496