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