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