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