xref: /openbsd/gnu/llvm/libcxx/include/streambuf (revision 4bdff4be)
146035553Spatrick// -*- C++ -*-
2*4bdff4beSrobert//===----------------------------------------------------------------------===//
346035553Spatrick//
446035553Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
546035553Spatrick// See https://llvm.org/LICENSE.txt for license information.
646035553Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
746035553Spatrick//
846035553Spatrick//===----------------------------------------------------------------------===//
946035553Spatrick
1076d0caaeSpatrick#ifndef _LIBCPP_STREAMBUF
1176d0caaeSpatrick#define _LIBCPP_STREAMBUF
1246035553Spatrick
1346035553Spatrick/*
1446035553Spatrick    streambuf synopsis
1546035553Spatrick
1646035553Spatricknamespace std
1746035553Spatrick{
1846035553Spatrick
1946035553Spatricktemplate <class charT, class traits = char_traits<charT> >
2046035553Spatrickclass basic_streambuf
2146035553Spatrick{
2246035553Spatrickpublic:
2346035553Spatrick    // types:
2446035553Spatrick    typedef charT char_type;
2546035553Spatrick    typedef traits traits_type;
2646035553Spatrick    typedef typename traits_type::int_type int_type;
2746035553Spatrick    typedef typename traits_type::pos_type pos_type;
2846035553Spatrick    typedef typename traits_type::off_type off_type;
2946035553Spatrick
3046035553Spatrick    virtual ~basic_streambuf();
3146035553Spatrick
3246035553Spatrick    // 27.6.2.2.1 locales:
3346035553Spatrick    locale pubimbue(const locale& loc);
3446035553Spatrick    locale getloc() const;
3546035553Spatrick
3646035553Spatrick    // 27.6.2.2.2 buffer and positioning:
3746035553Spatrick    basic_streambuf* pubsetbuf(char_type* s, streamsize n);
3846035553Spatrick    pos_type pubseekoff(off_type off, ios_base::seekdir way,
3946035553Spatrick                        ios_base::openmode which = ios_base::in | ios_base::out);
4046035553Spatrick    pos_type pubseekpos(pos_type sp,
4146035553Spatrick                        ios_base::openmode which = ios_base::in | ios_base::out);
4246035553Spatrick    int pubsync();
4346035553Spatrick
4446035553Spatrick    // Get and put areas:
4546035553Spatrick    // 27.6.2.2.3 Get area:
4646035553Spatrick    streamsize in_avail();
4746035553Spatrick    int_type snextc();
4846035553Spatrick    int_type sbumpc();
4946035553Spatrick    int_type sgetc();
5046035553Spatrick    streamsize sgetn(char_type* s, streamsize n);
5146035553Spatrick
5246035553Spatrick    // 27.6.2.2.4 Putback:
5346035553Spatrick    int_type sputbackc(char_type c);
5446035553Spatrick    int_type sungetc();
5546035553Spatrick
5646035553Spatrick    // 27.6.2.2.5 Put area:
5746035553Spatrick    int_type sputc(char_type c);
5846035553Spatrick    streamsize sputn(const char_type* s, streamsize n);
5946035553Spatrick
6046035553Spatrickprotected:
6146035553Spatrick    basic_streambuf();
6246035553Spatrick    basic_streambuf(const basic_streambuf& rhs);
6346035553Spatrick    basic_streambuf& operator=(const basic_streambuf& rhs);
6446035553Spatrick    void swap(basic_streambuf& rhs);
6546035553Spatrick
6646035553Spatrick    // 27.6.2.3.2 Get area:
6746035553Spatrick    char_type* eback() const;
6846035553Spatrick    char_type* gptr() const;
6946035553Spatrick    char_type* egptr() const;
7046035553Spatrick    void gbump(int n);
7146035553Spatrick    void setg(char_type* gbeg, char_type* gnext, char_type* gend);
7246035553Spatrick
7346035553Spatrick    // 27.6.2.3.3 Put area:
7446035553Spatrick    char_type* pbase() const;
7546035553Spatrick    char_type* pptr() const;
7646035553Spatrick    char_type* epptr() const;
7746035553Spatrick    void pbump(int n);
7846035553Spatrick    void setp(char_type* pbeg, char_type* pend);
7946035553Spatrick
8046035553Spatrick    // 27.6.2.4 virtual functions:
8146035553Spatrick    // 27.6.2.4.1 Locales:
8246035553Spatrick    virtual void imbue(const locale& loc);
8346035553Spatrick
8446035553Spatrick    // 27.6.2.4.2 Buffer management and positioning:
8546035553Spatrick    virtual basic_streambuf* setbuf(char_type* s, streamsize n);
8646035553Spatrick    virtual pos_type seekoff(off_type off, ios_base::seekdir way,
8746035553Spatrick                             ios_base::openmode which = ios_base::in | ios_base::out);
8846035553Spatrick    virtual pos_type seekpos(pos_type sp,
8946035553Spatrick                             ios_base::openmode which = ios_base::in | ios_base::out);
9046035553Spatrick    virtual int sync();
9146035553Spatrick
9246035553Spatrick    // 27.6.2.4.3 Get area:
9346035553Spatrick    virtual streamsize showmanyc();
9446035553Spatrick    virtual streamsize xsgetn(char_type* s, streamsize n);
9546035553Spatrick    virtual int_type underflow();
9646035553Spatrick    virtual int_type uflow();
9746035553Spatrick
9846035553Spatrick    // 27.6.2.4.4 Putback:
9946035553Spatrick    virtual int_type pbackfail(int_type c = traits_type::eof());
10046035553Spatrick
10146035553Spatrick    // 27.6.2.4.5 Put area:
10246035553Spatrick    virtual streamsize xsputn(const char_type* s, streamsize n);
10346035553Spatrick    virtual int_type overflow (int_type c = traits_type::eof());
10446035553Spatrick};
10546035553Spatrick
10646035553Spatrick}  // std
10746035553Spatrick
10846035553Spatrick*/
10946035553Spatrick
110*4bdff4beSrobert#include <__assert> // all public C++ headers provide the assertion handler
11146035553Spatrick#include <__config>
112*4bdff4beSrobert#include <cstdint>
11346035553Spatrick#include <ios>
11476d0caaeSpatrick#include <iosfwd>
115*4bdff4beSrobert#include <version>
11646035553Spatrick
11746035553Spatrick#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
11846035553Spatrick#  pragma GCC system_header
11946035553Spatrick#endif
12046035553Spatrick
12146035553Spatrick_LIBCPP_PUSH_MACROS
12246035553Spatrick#include <__undef_macros>
12346035553Spatrick
12446035553Spatrick_LIBCPP_BEGIN_NAMESPACE_STD
12546035553Spatrick
12646035553Spatricktemplate <class _CharT, class _Traits>
12746035553Spatrickclass _LIBCPP_TEMPLATE_VIS basic_streambuf
12846035553Spatrick{
12946035553Spatrickpublic:
13046035553Spatrick    // types:
13146035553Spatrick    typedef _CharT                         char_type;
13246035553Spatrick    typedef _Traits                        traits_type;
13346035553Spatrick    typedef typename traits_type::int_type int_type;
13446035553Spatrick    typedef typename traits_type::pos_type pos_type;
13546035553Spatrick    typedef typename traits_type::off_type off_type;
13646035553Spatrick
13746035553Spatrick    static_assert((is_same<_CharT, typename traits_type::char_type>::value),
13846035553Spatrick                  "traits_type::char_type must be the same type as CharT");
13946035553Spatrick
14046035553Spatrick    virtual ~basic_streambuf();
14146035553Spatrick
14246035553Spatrick    // 27.6.2.2.1 locales:
14346035553Spatrick    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
14446035553Spatrick    locale pubimbue(const locale& __loc) {
14546035553Spatrick        imbue(__loc);
14646035553Spatrick        locale __r = __loc_;
14746035553Spatrick        __loc_ = __loc;
14846035553Spatrick        return __r;
14946035553Spatrick    }
15046035553Spatrick
15146035553Spatrick    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
15246035553Spatrick    locale getloc() const { return __loc_; }
15346035553Spatrick
15446035553Spatrick    // 27.6.2.2.2 buffer and positioning:
15546035553Spatrick    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
15646035553Spatrick    basic_streambuf* pubsetbuf(char_type* __s, streamsize __n)
15746035553Spatrick    { return setbuf(__s, __n); }
15846035553Spatrick
15946035553Spatrick    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
16046035553Spatrick    pos_type pubseekoff(off_type __off, ios_base::seekdir __way,
16146035553Spatrick                        ios_base::openmode __which = ios_base::in | ios_base::out)
16246035553Spatrick    { return seekoff(__off, __way, __which); }
16346035553Spatrick
16446035553Spatrick    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
16546035553Spatrick    pos_type pubseekpos(pos_type __sp,
16646035553Spatrick                        ios_base::openmode __which = ios_base::in | ios_base::out)
16746035553Spatrick    { return seekpos(__sp, __which); }
16846035553Spatrick
16946035553Spatrick    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
17046035553Spatrick    int pubsync() { return sync(); }
17146035553Spatrick
17246035553Spatrick    // Get and put areas:
17346035553Spatrick    // 27.6.2.2.3 Get area:
17446035553Spatrick    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
17546035553Spatrick    streamsize in_avail() {
17646035553Spatrick        if (__ninp_ < __einp_)
17746035553Spatrick            return static_cast<streamsize>(__einp_ - __ninp_);
17846035553Spatrick        return showmanyc();
17946035553Spatrick    }
18046035553Spatrick
18146035553Spatrick    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
18246035553Spatrick    int_type snextc() {
18346035553Spatrick        if (sbumpc() == traits_type::eof())
18446035553Spatrick            return traits_type::eof();
18546035553Spatrick        return sgetc();
18646035553Spatrick    }
18746035553Spatrick
18846035553Spatrick    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
18946035553Spatrick    int_type sbumpc() {
19046035553Spatrick        if (__ninp_ == __einp_)
19146035553Spatrick            return uflow();
19246035553Spatrick        return traits_type::to_int_type(*__ninp_++);
19346035553Spatrick    }
19446035553Spatrick
19546035553Spatrick    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
19646035553Spatrick    int_type sgetc() {
19746035553Spatrick        if (__ninp_ == __einp_)
19846035553Spatrick            return underflow();
19946035553Spatrick        return traits_type::to_int_type(*__ninp_);
20046035553Spatrick    }
20146035553Spatrick
20246035553Spatrick    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
20346035553Spatrick    streamsize sgetn(char_type* __s, streamsize __n)
20446035553Spatrick    { return xsgetn(__s, __n); }
20546035553Spatrick
20646035553Spatrick    // 27.6.2.2.4 Putback:
20746035553Spatrick    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
20846035553Spatrick    int_type sputbackc(char_type __c) {
20946035553Spatrick        if (__binp_ == __ninp_ || !traits_type::eq(__c, __ninp_[-1]))
21046035553Spatrick            return pbackfail(traits_type::to_int_type(__c));
21146035553Spatrick        return traits_type::to_int_type(*--__ninp_);
21246035553Spatrick    }
21346035553Spatrick
21446035553Spatrick    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
21546035553Spatrick    int_type sungetc() {
21646035553Spatrick        if (__binp_ == __ninp_)
21746035553Spatrick          return pbackfail();
21846035553Spatrick        return traits_type::to_int_type(*--__ninp_);
21946035553Spatrick    }
22046035553Spatrick
22146035553Spatrick    // 27.6.2.2.5 Put area:
22246035553Spatrick    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
22346035553Spatrick    int_type sputc(char_type __c) {
22446035553Spatrick        if (__nout_ == __eout_)
22546035553Spatrick            return overflow(traits_type::to_int_type(__c));
22646035553Spatrick        *__nout_++ = __c;
22746035553Spatrick        return traits_type::to_int_type(__c);
22846035553Spatrick    }
22946035553Spatrick
23046035553Spatrick    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
23146035553Spatrick    streamsize sputn(const char_type* __s, streamsize __n)
23246035553Spatrick    { return xsputn(__s, __n); }
23346035553Spatrick
23446035553Spatrickprotected:
23546035553Spatrick    basic_streambuf();
23646035553Spatrick    basic_streambuf(const basic_streambuf& __rhs);
23746035553Spatrick    basic_streambuf& operator=(const basic_streambuf& __rhs);
23846035553Spatrick    void swap(basic_streambuf& __rhs);
23946035553Spatrick
24046035553Spatrick    // 27.6.2.3.2 Get area:
24146035553Spatrick    _LIBCPP_INLINE_VISIBILITY char_type* eback() const {return __binp_;}
24246035553Spatrick    _LIBCPP_INLINE_VISIBILITY char_type* gptr()  const {return __ninp_;}
24346035553Spatrick    _LIBCPP_INLINE_VISIBILITY char_type* egptr() const {return __einp_;}
24446035553Spatrick
24546035553Spatrick    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
24646035553Spatrick    void gbump(int __n) { __ninp_ += __n; }
24746035553Spatrick
24846035553Spatrick    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
24946035553Spatrick    void setg(char_type* __gbeg, char_type* __gnext, char_type* __gend) {
25046035553Spatrick        __binp_ = __gbeg;
25146035553Spatrick        __ninp_ = __gnext;
25246035553Spatrick        __einp_ = __gend;
25346035553Spatrick    }
25446035553Spatrick
25546035553Spatrick    // 27.6.2.3.3 Put area:
25646035553Spatrick    _LIBCPP_INLINE_VISIBILITY char_type* pbase() const {return __bout_;}
25746035553Spatrick    _LIBCPP_INLINE_VISIBILITY char_type* pptr()  const {return __nout_;}
25846035553Spatrick    _LIBCPP_INLINE_VISIBILITY char_type* epptr() const {return __eout_;}
25946035553Spatrick
26046035553Spatrick    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
26146035553Spatrick    void pbump(int __n) { __nout_ += __n; }
26246035553Spatrick
26346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
26446035553Spatrick    void __pbump(streamsize __n) { __nout_ += __n; }
26546035553Spatrick
26646035553Spatrick    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
26746035553Spatrick    void setp(char_type* __pbeg, char_type* __pend) {
26846035553Spatrick        __bout_ = __nout_ = __pbeg;
26946035553Spatrick        __eout_ = __pend;
27046035553Spatrick    }
27146035553Spatrick
27246035553Spatrick    // 27.6.2.4 virtual functions:
27346035553Spatrick    // 27.6.2.4.1 Locales:
27446035553Spatrick    virtual void imbue(const locale& __loc);
27546035553Spatrick
27646035553Spatrick    // 27.6.2.4.2 Buffer management and positioning:
27746035553Spatrick    virtual basic_streambuf* setbuf(char_type* __s, streamsize __n);
27846035553Spatrick    virtual pos_type seekoff(off_type __off, ios_base::seekdir __way,
27946035553Spatrick                             ios_base::openmode __which = ios_base::in | ios_base::out);
28046035553Spatrick    virtual pos_type seekpos(pos_type __sp,
28146035553Spatrick                             ios_base::openmode __which = ios_base::in | ios_base::out);
28246035553Spatrick    virtual int sync();
28346035553Spatrick
28446035553Spatrick    // 27.6.2.4.3 Get area:
28546035553Spatrick    virtual streamsize showmanyc();
28646035553Spatrick    virtual streamsize xsgetn(char_type* __s, streamsize __n);
28746035553Spatrick    virtual int_type underflow();
28846035553Spatrick    virtual int_type uflow();
28946035553Spatrick
29046035553Spatrick    // 27.6.2.4.4 Putback:
29146035553Spatrick    virtual int_type pbackfail(int_type __c = traits_type::eof());
29246035553Spatrick
29346035553Spatrick    // 27.6.2.4.5 Put area:
29446035553Spatrick    virtual streamsize xsputn(const char_type* __s, streamsize __n);
29546035553Spatrick    virtual int_type overflow(int_type __c = traits_type::eof());
29646035553Spatrick
29746035553Spatrickprivate:
29846035553Spatrick    locale __loc_;
29946035553Spatrick    char_type* __binp_;
30046035553Spatrick    char_type* __ninp_;
30146035553Spatrick    char_type* __einp_;
30246035553Spatrick    char_type* __bout_;
30346035553Spatrick    char_type* __nout_;
30446035553Spatrick    char_type* __eout_;
30546035553Spatrick};
30646035553Spatrick
30746035553Spatricktemplate <class _CharT, class _Traits>
30846035553Spatrickbasic_streambuf<_CharT, _Traits>::~basic_streambuf()
30946035553Spatrick{
31046035553Spatrick}
31146035553Spatrick
31246035553Spatricktemplate <class _CharT, class _Traits>
31346035553Spatrickbasic_streambuf<_CharT, _Traits>::basic_streambuf()
31476d0caaeSpatrick    : __binp_(nullptr),
31576d0caaeSpatrick      __ninp_(nullptr),
31676d0caaeSpatrick      __einp_(nullptr),
31776d0caaeSpatrick      __bout_(nullptr),
31876d0caaeSpatrick      __nout_(nullptr),
31976d0caaeSpatrick      __eout_(nullptr)
32046035553Spatrick{
32146035553Spatrick}
32246035553Spatrick
32346035553Spatricktemplate <class _CharT, class _Traits>
32446035553Spatrickbasic_streambuf<_CharT, _Traits>::basic_streambuf(const basic_streambuf& __sb)
32546035553Spatrick    : __loc_(__sb.__loc_),
32646035553Spatrick      __binp_(__sb.__binp_),
32746035553Spatrick      __ninp_(__sb.__ninp_),
32846035553Spatrick      __einp_(__sb.__einp_),
32946035553Spatrick      __bout_(__sb.__bout_),
33046035553Spatrick      __nout_(__sb.__nout_),
33146035553Spatrick      __eout_(__sb.__eout_)
33246035553Spatrick{
33346035553Spatrick}
33446035553Spatrick
33546035553Spatricktemplate <class _CharT, class _Traits>
33646035553Spatrickbasic_streambuf<_CharT, _Traits>&
33746035553Spatrickbasic_streambuf<_CharT, _Traits>::operator=(const basic_streambuf& __sb)
33846035553Spatrick{
33946035553Spatrick    __loc_ = __sb.__loc_;
34046035553Spatrick    __binp_ = __sb.__binp_;
34146035553Spatrick    __ninp_ = __sb.__ninp_;
34246035553Spatrick    __einp_ = __sb.__einp_;
34346035553Spatrick    __bout_ = __sb.__bout_;
34446035553Spatrick    __nout_ = __sb.__nout_;
34546035553Spatrick    __eout_ = __sb.__eout_;
34646035553Spatrick    return *this;
34746035553Spatrick}
34846035553Spatrick
34946035553Spatricktemplate <class _CharT, class _Traits>
35046035553Spatrickvoid
35146035553Spatrickbasic_streambuf<_CharT, _Traits>::swap(basic_streambuf& __sb)
35246035553Spatrick{
35346035553Spatrick    _VSTD::swap(__loc_, __sb.__loc_);
35446035553Spatrick    _VSTD::swap(__binp_, __sb.__binp_);
35546035553Spatrick    _VSTD::swap(__ninp_, __sb.__ninp_);
35646035553Spatrick    _VSTD::swap(__einp_, __sb.__einp_);
35746035553Spatrick    _VSTD::swap(__bout_, __sb.__bout_);
35846035553Spatrick    _VSTD::swap(__nout_, __sb.__nout_);
35946035553Spatrick    _VSTD::swap(__eout_, __sb.__eout_);
36046035553Spatrick}
36146035553Spatrick
36246035553Spatricktemplate <class _CharT, class _Traits>
36346035553Spatrickvoid
36446035553Spatrickbasic_streambuf<_CharT, _Traits>::imbue(const locale&)
36546035553Spatrick{
36646035553Spatrick}
36746035553Spatrick
36846035553Spatricktemplate <class _CharT, class _Traits>
36946035553Spatrickbasic_streambuf<_CharT, _Traits>*
37046035553Spatrickbasic_streambuf<_CharT, _Traits>::setbuf(char_type*, streamsize)
37146035553Spatrick{
37246035553Spatrick    return this;
37346035553Spatrick}
37446035553Spatrick
37546035553Spatricktemplate <class _CharT, class _Traits>
37646035553Spatricktypename basic_streambuf<_CharT, _Traits>::pos_type
37746035553Spatrickbasic_streambuf<_CharT, _Traits>::seekoff(off_type, ios_base::seekdir,
37846035553Spatrick                                          ios_base::openmode)
37946035553Spatrick{
38046035553Spatrick    return pos_type(off_type(-1));
38146035553Spatrick}
38246035553Spatrick
38346035553Spatricktemplate <class _CharT, class _Traits>
38446035553Spatricktypename basic_streambuf<_CharT, _Traits>::pos_type
38546035553Spatrickbasic_streambuf<_CharT, _Traits>::seekpos(pos_type, ios_base::openmode)
38646035553Spatrick{
38746035553Spatrick    return pos_type(off_type(-1));
38846035553Spatrick}
38946035553Spatrick
39046035553Spatricktemplate <class _CharT, class _Traits>
39146035553Spatrickint
39246035553Spatrickbasic_streambuf<_CharT, _Traits>::sync()
39346035553Spatrick{
39446035553Spatrick    return 0;
39546035553Spatrick}
39646035553Spatrick
39746035553Spatricktemplate <class _CharT, class _Traits>
39846035553Spatrickstreamsize
39946035553Spatrickbasic_streambuf<_CharT, _Traits>::showmanyc()
40046035553Spatrick{
40146035553Spatrick    return 0;
40246035553Spatrick}
40346035553Spatrick
40446035553Spatricktemplate <class _CharT, class _Traits>
40546035553Spatrickstreamsize
40646035553Spatrickbasic_streambuf<_CharT, _Traits>::xsgetn(char_type* __s, streamsize __n)
40746035553Spatrick{
40846035553Spatrick    const int_type __eof = traits_type::eof();
40946035553Spatrick    int_type __c;
41046035553Spatrick    streamsize __i = 0;
41146035553Spatrick    while(__i < __n)
41246035553Spatrick    {
41346035553Spatrick        if (__ninp_ < __einp_)
41446035553Spatrick        {
41546035553Spatrick            const streamsize __len = _VSTD::min(static_cast<streamsize>(INT_MAX),
41646035553Spatrick                                _VSTD::min(__einp_ - __ninp_, __n - __i));
41746035553Spatrick            traits_type::copy(__s, __ninp_, __len);
41846035553Spatrick            __s +=  __len;
41946035553Spatrick            __i +=  __len;
42046035553Spatrick            this->gbump(__len);
42146035553Spatrick        }
42246035553Spatrick        else if ((__c = uflow()) != __eof)
42346035553Spatrick        {
42446035553Spatrick            *__s = traits_type::to_char_type(__c);
42546035553Spatrick            ++__s;
42646035553Spatrick            ++__i;
42746035553Spatrick        }
42846035553Spatrick        else
42946035553Spatrick            break;
43046035553Spatrick    }
43146035553Spatrick    return __i;
43246035553Spatrick}
43346035553Spatrick
43446035553Spatricktemplate <class _CharT, class _Traits>
43546035553Spatricktypename basic_streambuf<_CharT, _Traits>::int_type
43646035553Spatrickbasic_streambuf<_CharT, _Traits>::underflow()
43746035553Spatrick{
43846035553Spatrick    return traits_type::eof();
43946035553Spatrick}
44046035553Spatrick
44146035553Spatricktemplate <class _CharT, class _Traits>
44246035553Spatricktypename basic_streambuf<_CharT, _Traits>::int_type
44346035553Spatrickbasic_streambuf<_CharT, _Traits>::uflow()
44446035553Spatrick{
44546035553Spatrick    if (underflow() == traits_type::eof())
44646035553Spatrick        return traits_type::eof();
44746035553Spatrick    return traits_type::to_int_type(*__ninp_++);
44846035553Spatrick}
44946035553Spatrick
45046035553Spatricktemplate <class _CharT, class _Traits>
45146035553Spatricktypename basic_streambuf<_CharT, _Traits>::int_type
45246035553Spatrickbasic_streambuf<_CharT, _Traits>::pbackfail(int_type)
45346035553Spatrick{
45446035553Spatrick    return traits_type::eof();
45546035553Spatrick}
45646035553Spatrick
45746035553Spatricktemplate <class _CharT, class _Traits>
45846035553Spatrickstreamsize
45946035553Spatrickbasic_streambuf<_CharT, _Traits>::xsputn(const char_type* __s, streamsize __n)
46046035553Spatrick{
46146035553Spatrick    streamsize __i = 0;
46246035553Spatrick    int_type __eof = traits_type::eof();
46346035553Spatrick    while( __i < __n)
46446035553Spatrick    {
46546035553Spatrick        if (__nout_ >= __eout_)
46646035553Spatrick        {
46746035553Spatrick            if (overflow(traits_type::to_int_type(*__s)) == __eof)
46846035553Spatrick                break;
46946035553Spatrick            ++__s;
47046035553Spatrick            ++__i;
47146035553Spatrick        }
47246035553Spatrick        else
47346035553Spatrick        {
47446035553Spatrick            streamsize __chunk_size = _VSTD::min(__eout_ - __nout_, __n - __i);
47546035553Spatrick            traits_type::copy(__nout_, __s, __chunk_size);
47646035553Spatrick            __nout_ += __chunk_size;
47746035553Spatrick            __s     += __chunk_size;
47846035553Spatrick            __i     += __chunk_size;
47946035553Spatrick        }
48046035553Spatrick    }
48146035553Spatrick    return __i;
48246035553Spatrick}
48346035553Spatrick
48446035553Spatricktemplate <class _CharT, class _Traits>
48546035553Spatricktypename basic_streambuf<_CharT, _Traits>::int_type
48646035553Spatrickbasic_streambuf<_CharT, _Traits>::overflow(int_type)
48746035553Spatrick{
48846035553Spatrick    return traits_type::eof();
48946035553Spatrick}
49046035553Spatrick
491*4bdff4beSrobertextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_streambuf<char>;
492*4bdff4beSrobertextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ios<char>;
49346035553Spatrick
494*4bdff4beSrobert#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
495*4bdff4beSrobertextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_streambuf<wchar_t>;
496*4bdff4beSrobertextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ios<wchar_t>;
497*4bdff4beSrobert#endif
49846035553Spatrick
49946035553Spatrick_LIBCPP_END_NAMESPACE_STD
50046035553Spatrick
50146035553Spatrick_LIBCPP_POP_MACROS
50246035553Spatrick
50376d0caaeSpatrick#endif // _LIBCPP_STREAMBUF
504