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 1193e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 1203e519524SHoward Hinnant 1213e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 122*e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS basic_streambuf 1233e519524SHoward Hinnant{ 1243e519524SHoward Hinnantpublic: 1253e519524SHoward Hinnant // types: 1263e519524SHoward Hinnant typedef _CharT char_type; 1273e519524SHoward Hinnant typedef _Traits traits_type; 1283e519524SHoward Hinnant typedef typename traits_type::int_type int_type; 1293e519524SHoward Hinnant typedef typename traits_type::pos_type pos_type; 1303e519524SHoward Hinnant typedef typename traits_type::off_type off_type; 1313e519524SHoward Hinnant 1323e519524SHoward Hinnant virtual ~basic_streambuf(); 1333e519524SHoward Hinnant 1343e519524SHoward Hinnant // 27.6.2.2.1 locales: 135f8f31c49SEric Fiselier inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY 136f8f31c49SEric Fiselier locale pubimbue(const locale& __loc) { 137f8f31c49SEric Fiselier imbue(__loc); 138f8f31c49SEric Fiselier locale __r = __loc_; 139f8f31c49SEric Fiselier __loc_ = __loc; 140f8f31c49SEric Fiselier return __r; 141f8f31c49SEric Fiselier } 142f8f31c49SEric Fiselier 143f8f31c49SEric Fiselier inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY 144f8f31c49SEric Fiselier locale getloc() const { return __loc_; } 1453e519524SHoward Hinnant 1463e519524SHoward Hinnant // 27.6.2.2.2 buffer and positioning: 147f8f31c49SEric Fiselier inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY 148f8f31c49SEric Fiselier basic_streambuf* pubsetbuf(char_type* __s, streamsize __n) 149f8f31c49SEric Fiselier { return setbuf(__s, __n); } 150f8f31c49SEric Fiselier 151f8f31c49SEric Fiselier inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY 1523e519524SHoward Hinnant pos_type pubseekoff(off_type __off, ios_base::seekdir __way, 153f8f31c49SEric Fiselier ios_base::openmode __which = ios_base::in | ios_base::out) 154f8f31c49SEric Fiselier { return seekoff(__off, __way, __which); } 155f8f31c49SEric Fiselier 156f8f31c49SEric Fiselier inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY 1573e519524SHoward Hinnant pos_type pubseekpos(pos_type __sp, 158f8f31c49SEric Fiselier ios_base::openmode __which = ios_base::in | ios_base::out) 159f8f31c49SEric Fiselier { return seekpos(__sp, __which); } 160f8f31c49SEric Fiselier 161f8f31c49SEric Fiselier inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY 162f8f31c49SEric Fiselier int pubsync() { return sync(); } 1633e519524SHoward Hinnant 1643e519524SHoward Hinnant // Get and put areas: 1653e519524SHoward Hinnant // 27.6.2.2.3 Get area: 166f8f31c49SEric Fiselier inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY 167f8f31c49SEric Fiselier streamsize in_avail() { 168f8f31c49SEric Fiselier if (__ninp_ < __einp_) 169f8f31c49SEric Fiselier return static_cast<streamsize>(__einp_ - __ninp_); 170f8f31c49SEric Fiselier return showmanyc(); 171f8f31c49SEric Fiselier } 172f8f31c49SEric Fiselier 173f8f31c49SEric Fiselier inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY 174f8f31c49SEric Fiselier int_type snextc() { 175f8f31c49SEric Fiselier if (sbumpc() == traits_type::eof()) 176f8f31c49SEric Fiselier return traits_type::eof(); 177f8f31c49SEric Fiselier return sgetc(); 178f8f31c49SEric Fiselier } 179f8f31c49SEric Fiselier 180f8f31c49SEric Fiselier inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY 181f8f31c49SEric Fiselier int_type sbumpc() { 182f8f31c49SEric Fiselier if (__ninp_ == __einp_) 183f8f31c49SEric Fiselier return uflow(); 184f8f31c49SEric Fiselier return traits_type::to_int_type(*__ninp_++); 185f8f31c49SEric Fiselier } 186f8f31c49SEric Fiselier 187f8f31c49SEric Fiselier inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY 188f8f31c49SEric Fiselier int_type sgetc() { 189f8f31c49SEric Fiselier if (__ninp_ == __einp_) 190f8f31c49SEric Fiselier return underflow(); 191f8f31c49SEric Fiselier return traits_type::to_int_type(*__ninp_); 192f8f31c49SEric Fiselier } 193f8f31c49SEric Fiselier 194f8f31c49SEric Fiselier inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY 195f8f31c49SEric Fiselier streamsize sgetn(char_type* __s, streamsize __n) 196f8f31c49SEric Fiselier { return xsgetn(__s, __n); } 1973e519524SHoward Hinnant 1983e519524SHoward Hinnant // 27.6.2.2.4 Putback: 199f8f31c49SEric Fiselier inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY 200f8f31c49SEric Fiselier int_type sputbackc(char_type __c) { 201f8f31c49SEric Fiselier if (__binp_ == __ninp_ || !traits_type::eq(__c, __ninp_[-1])) 202f8f31c49SEric Fiselier return pbackfail(traits_type::to_int_type(__c)); 203f8f31c49SEric Fiselier return traits_type::to_int_type(*--__ninp_); 204f8f31c49SEric Fiselier } 205f8f31c49SEric Fiselier 206f8f31c49SEric Fiselier inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY 207f8f31c49SEric Fiselier int_type sungetc() { 208f8f31c49SEric Fiselier if (__binp_ == __ninp_) 209f8f31c49SEric Fiselier return pbackfail(); 210f8f31c49SEric Fiselier return traits_type::to_int_type(*--__ninp_); 211f8f31c49SEric Fiselier } 2123e519524SHoward Hinnant 2133e519524SHoward Hinnant // 27.6.2.2.5 Put area: 214f8f31c49SEric Fiselier inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY 215f8f31c49SEric Fiselier int_type sputc(char_type __c) { 216f8f31c49SEric Fiselier if (__nout_ == __eout_) 217f8f31c49SEric Fiselier return overflow(traits_type::to_int_type(__c)); 218f8f31c49SEric Fiselier *__nout_++ = __c; 219f8f31c49SEric Fiselier return traits_type::to_int_type(__c); 220f8f31c49SEric Fiselier } 221f8f31c49SEric Fiselier 222f8f31c49SEric Fiselier inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY 223f8f31c49SEric Fiselier streamsize sputn(const char_type* __s, streamsize __n) 224f8f31c49SEric Fiselier { return xsputn(__s, __n); } 2253e519524SHoward Hinnant 2263e519524SHoward Hinnantprotected: 2273e519524SHoward Hinnant basic_streambuf(); 2283e519524SHoward Hinnant basic_streambuf(const basic_streambuf& __rhs); 2293e519524SHoward Hinnant basic_streambuf& operator=(const basic_streambuf& __rhs); 2303e519524SHoward Hinnant void swap(basic_streambuf& __rhs); 2313e519524SHoward Hinnant 2323e519524SHoward Hinnant // 27.6.2.3.2 Get area: 2333e519524SHoward Hinnant _LIBCPP_ALWAYS_INLINE char_type* eback() const {return __binp_;} 2343e519524SHoward Hinnant _LIBCPP_ALWAYS_INLINE char_type* gptr() const {return __ninp_;} 2353e519524SHoward Hinnant _LIBCPP_ALWAYS_INLINE char_type* egptr() const {return __einp_;} 236f8f31c49SEric Fiselier 237f8f31c49SEric Fiselier inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY 238f8f31c49SEric Fiselier void gbump(int __n) { __ninp_ += __n; } 239f8f31c49SEric Fiselier 240f8f31c49SEric Fiselier inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY 241f8f31c49SEric Fiselier void setg(char_type* __gbeg, char_type* __gnext, char_type* __gend) { 242f8f31c49SEric Fiselier __binp_ = __gbeg; 243f8f31c49SEric Fiselier __ninp_ = __gnext; 244f8f31c49SEric Fiselier __einp_ = __gend; 245f8f31c49SEric Fiselier } 2463e519524SHoward Hinnant 2473e519524SHoward Hinnant // 27.6.2.3.3 Put area: 2483e519524SHoward Hinnant _LIBCPP_ALWAYS_INLINE char_type* pbase() const {return __bout_;} 2493e519524SHoward Hinnant _LIBCPP_ALWAYS_INLINE char_type* pptr() const {return __nout_;} 2503e519524SHoward Hinnant _LIBCPP_ALWAYS_INLINE char_type* epptr() const {return __eout_;} 251f8f31c49SEric Fiselier 252f8f31c49SEric Fiselier inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY 253f8f31c49SEric Fiselier void pbump(int __n) { __nout_ += __n; } 254f8f31c49SEric Fiselier 255f8f31c49SEric Fiselier inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY 256f8f31c49SEric Fiselier void setp(char_type* __pbeg, char_type* __pend) { 257f8f31c49SEric Fiselier __bout_ = __nout_ = __pbeg; 258f8f31c49SEric Fiselier __eout_ = __pend; 259f8f31c49SEric Fiselier } 2603e519524SHoward Hinnant 2613e519524SHoward Hinnant // 27.6.2.4 virtual functions: 2623e519524SHoward Hinnant // 27.6.2.4.1 Locales: 2633e519524SHoward Hinnant virtual void imbue(const locale& __loc); 2643e519524SHoward Hinnant 2653e519524SHoward Hinnant // 27.6.2.4.2 Buffer management and positioning: 2663e519524SHoward Hinnant virtual basic_streambuf* setbuf(char_type* __s, streamsize __n); 2673e519524SHoward Hinnant virtual pos_type seekoff(off_type __off, ios_base::seekdir __way, 2683e519524SHoward Hinnant ios_base::openmode __which = ios_base::in | ios_base::out); 2693e519524SHoward Hinnant virtual pos_type seekpos(pos_type __sp, 2703e519524SHoward Hinnant ios_base::openmode __which = ios_base::in | ios_base::out); 2713e519524SHoward Hinnant virtual int sync(); 2723e519524SHoward Hinnant 2733e519524SHoward Hinnant // 27.6.2.4.3 Get area: 2743e519524SHoward Hinnant virtual streamsize showmanyc(); 2753e519524SHoward Hinnant virtual streamsize xsgetn(char_type* __s, streamsize __n); 2763e519524SHoward Hinnant virtual int_type underflow(); 2773e519524SHoward Hinnant virtual int_type uflow(); 2783e519524SHoward Hinnant 2793e519524SHoward Hinnant // 27.6.2.4.4 Putback: 2803e519524SHoward Hinnant virtual int_type pbackfail(int_type __c = traits_type::eof()); 2813e519524SHoward Hinnant 2823e519524SHoward Hinnant // 27.6.2.4.5 Put area: 2833e519524SHoward Hinnant virtual streamsize xsputn(const char_type* __s, streamsize __n); 2843e519524SHoward Hinnant virtual int_type overflow(int_type __c = traits_type::eof()); 2853e519524SHoward Hinnant 2863e519524SHoward Hinnantprivate: 2873e519524SHoward Hinnant locale __loc_; 2883e519524SHoward Hinnant char_type* __binp_; 2893e519524SHoward Hinnant char_type* __ninp_; 2903e519524SHoward Hinnant char_type* __einp_; 2913e519524SHoward Hinnant char_type* __bout_; 2923e519524SHoward Hinnant char_type* __nout_; 2933e519524SHoward Hinnant char_type* __eout_; 2943e519524SHoward Hinnant}; 2953e519524SHoward Hinnant 2963e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 2973e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::~basic_streambuf() 2983e519524SHoward Hinnant{ 2993e519524SHoward Hinnant} 3003e519524SHoward Hinnant 3013e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 3023e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::basic_streambuf() 3033e519524SHoward Hinnant : __binp_(0), 3043e519524SHoward Hinnant __ninp_(0), 3053e519524SHoward Hinnant __einp_(0), 3063e519524SHoward Hinnant __bout_(0), 3073e519524SHoward Hinnant __nout_(0), 3083e519524SHoward Hinnant __eout_(0) 3093e519524SHoward Hinnant{ 3103e519524SHoward Hinnant} 3113e519524SHoward Hinnant 3123e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 3133e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::basic_streambuf(const basic_streambuf& __sb) 3143e519524SHoward Hinnant : __loc_(__sb.__loc_), 3153e519524SHoward Hinnant __binp_(__sb.__binp_), 3163e519524SHoward Hinnant __ninp_(__sb.__ninp_), 3173e519524SHoward Hinnant __einp_(__sb.__einp_), 3183e519524SHoward Hinnant __bout_(__sb.__bout_), 3193e519524SHoward Hinnant __nout_(__sb.__nout_), 3203e519524SHoward Hinnant __eout_(__sb.__eout_) 3213e519524SHoward Hinnant{ 3223e519524SHoward Hinnant} 3233e519524SHoward Hinnant 3243e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 3253e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>& 3263e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::operator=(const basic_streambuf& __sb) 3273e519524SHoward Hinnant{ 3283e519524SHoward Hinnant __loc_ = __sb.__loc_; 3293e519524SHoward Hinnant __binp_ = __sb.__binp_; 3303e519524SHoward Hinnant __ninp_ = __sb.__ninp_; 3313e519524SHoward Hinnant __einp_ = __sb.__einp_; 3323e519524SHoward Hinnant __bout_ = __sb.__bout_; 3333e519524SHoward Hinnant __nout_ = __sb.__nout_; 3343e519524SHoward Hinnant __eout_ = __sb.__eout_; 3353e519524SHoward Hinnant return *this; 3363e519524SHoward Hinnant} 3373e519524SHoward Hinnant 3383e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 3393e519524SHoward Hinnantvoid 3403e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::swap(basic_streambuf& __sb) 3413e519524SHoward Hinnant{ 342ce48a113SHoward Hinnant _VSTD::swap(__loc_, __sb.__loc_); 343ce48a113SHoward Hinnant _VSTD::swap(__binp_, __sb.__binp_); 344ce48a113SHoward Hinnant _VSTD::swap(__ninp_, __sb.__ninp_); 345ce48a113SHoward Hinnant _VSTD::swap(__einp_, __sb.__einp_); 346ce48a113SHoward Hinnant _VSTD::swap(__bout_, __sb.__bout_); 347ce48a113SHoward Hinnant _VSTD::swap(__nout_, __sb.__nout_); 348ce48a113SHoward Hinnant _VSTD::swap(__eout_, __sb.__eout_); 3493e519524SHoward Hinnant} 3503e519524SHoward Hinnant 3513e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 3523e519524SHoward Hinnantvoid 3533e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::imbue(const locale&) 3543e519524SHoward Hinnant{ 3553e519524SHoward Hinnant} 3563e519524SHoward Hinnant 3573e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 3583e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>* 3593e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::setbuf(char_type*, streamsize) 3603e519524SHoward Hinnant{ 3613e519524SHoward Hinnant return this; 3623e519524SHoward Hinnant} 3633e519524SHoward Hinnant 3643e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 3653e519524SHoward Hinnanttypename basic_streambuf<_CharT, _Traits>::pos_type 366c206366fSHoward Hinnantbasic_streambuf<_CharT, _Traits>::seekoff(off_type, ios_base::seekdir, 367c206366fSHoward Hinnant ios_base::openmode) 3683e519524SHoward Hinnant{ 3693e519524SHoward Hinnant return pos_type(off_type(-1)); 3703e519524SHoward Hinnant} 3713e519524SHoward Hinnant 3723e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 3733e519524SHoward Hinnanttypename basic_streambuf<_CharT, _Traits>::pos_type 374c206366fSHoward Hinnantbasic_streambuf<_CharT, _Traits>::seekpos(pos_type, ios_base::openmode) 3753e519524SHoward Hinnant{ 3763e519524SHoward Hinnant return pos_type(off_type(-1)); 3773e519524SHoward Hinnant} 3783e519524SHoward Hinnant 3793e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 3803e519524SHoward Hinnantint 3813e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::sync() 3823e519524SHoward Hinnant{ 3833e519524SHoward Hinnant return 0; 3843e519524SHoward Hinnant} 3853e519524SHoward Hinnant 3863e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 3873e519524SHoward Hinnantstreamsize 3883e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::showmanyc() 3893e519524SHoward Hinnant{ 3903e519524SHoward Hinnant return 0; 3913e519524SHoward Hinnant} 3923e519524SHoward Hinnant 3933e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 3943e519524SHoward Hinnantstreamsize 3953e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::xsgetn(char_type* __s, streamsize __n) 3963e519524SHoward Hinnant{ 3973e519524SHoward Hinnant const int_type __eof = traits_type::eof(); 3983e519524SHoward Hinnant int_type __c; 3993e519524SHoward Hinnant streamsize __i = 0; 40072d6a934SEvandro Menezes while(__i < __n) 4013e519524SHoward Hinnant { 4023e519524SHoward Hinnant if (__ninp_ < __einp_) 40372d6a934SEvandro Menezes { 40472d6a934SEvandro Menezes const streamsize __len = _VSTD::min(__einp_ - __ninp_, __n - __i); 40572d6a934SEvandro Menezes traits_type::copy(__s, __ninp_, __len); 40672d6a934SEvandro Menezes __s += __len; 40772d6a934SEvandro Menezes __i += __len; 40872d6a934SEvandro Menezes this->gbump(__len); 40972d6a934SEvandro Menezes } 4103e519524SHoward Hinnant else if ((__c = uflow()) != __eof) 41172d6a934SEvandro Menezes { 4123e519524SHoward Hinnant *__s = traits_type::to_char_type(__c); 41372d6a934SEvandro Menezes ++__s; 41472d6a934SEvandro Menezes ++__i; 41572d6a934SEvandro Menezes } 4163e519524SHoward Hinnant else 4173e519524SHoward Hinnant break; 4183e519524SHoward Hinnant } 4193e519524SHoward Hinnant return __i; 4203e519524SHoward Hinnant} 4213e519524SHoward Hinnant 4223e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 4233e519524SHoward Hinnanttypename basic_streambuf<_CharT, _Traits>::int_type 4243e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::underflow() 4253e519524SHoward Hinnant{ 4263e519524SHoward Hinnant return traits_type::eof(); 4273e519524SHoward Hinnant} 4283e519524SHoward Hinnant 4293e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 4303e519524SHoward Hinnanttypename basic_streambuf<_CharT, _Traits>::int_type 4313e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::uflow() 4323e519524SHoward Hinnant{ 4333e519524SHoward Hinnant if (underflow() == traits_type::eof()) 4343e519524SHoward Hinnant return traits_type::eof(); 4353e519524SHoward Hinnant return traits_type::to_int_type(*__ninp_++); 4363e519524SHoward Hinnant} 4373e519524SHoward Hinnant 4383e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 4393e519524SHoward Hinnanttypename basic_streambuf<_CharT, _Traits>::int_type 4403e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::pbackfail(int_type) 4413e519524SHoward Hinnant{ 4423e519524SHoward Hinnant return traits_type::eof(); 4433e519524SHoward Hinnant} 4443e519524SHoward Hinnant 4453e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 4463e519524SHoward Hinnantstreamsize 4473e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>::xsputn(const char_type* __s, streamsize __n) 4483e519524SHoward Hinnant{ 4493e519524SHoward Hinnant streamsize __i = 0; 4503e519524SHoward Hinnant int_type __eof = traits_type::eof(); 45109921a57SMarshall Clow while( __i < __n) 4523e519524SHoward Hinnant { 45309921a57SMarshall Clow if (__nout_ >= __eout_) 45409921a57SMarshall Clow { 45509921a57SMarshall Clow if (overflow(traits_type::to_int_type(*__s)) == __eof) 4563e519524SHoward Hinnant break; 45709921a57SMarshall Clow ++__s; 45809921a57SMarshall Clow ++__i; 45909921a57SMarshall Clow } 46009921a57SMarshall Clow else 46109921a57SMarshall Clow { 46209921a57SMarshall Clow streamsize __chunk_size = _VSTD::min(__eout_ - __nout_, __n - __i); 46309921a57SMarshall Clow traits_type::copy(__nout_, __s, __chunk_size); 46409921a57SMarshall Clow __nout_ += __chunk_size; 46509921a57SMarshall Clow __s += __chunk_size; 46609921a57SMarshall Clow __i += __chunk_size; 46709921a57SMarshall Clow } 4683e519524SHoward Hinnant } 4693e519524SHoward Hinnant return __i; 4703e519524SHoward Hinnant} 4713e519524SHoward Hinnant 4723e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 4733e519524SHoward Hinnanttypename basic_streambuf<_CharT, _Traits>::int_type 474c206366fSHoward Hinnantbasic_streambuf<_CharT, _Traits>::overflow(int_type) 4753e519524SHoward Hinnant{ 4763e519524SHoward Hinnant return traits_type::eof(); 4773e519524SHoward Hinnant} 4783e519524SHoward Hinnant 47949e2967fSEric Fiselier_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_streambuf<char>) 48049e2967fSEric Fiselier_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_streambuf<wchar_t>) 4813e519524SHoward Hinnant 48249e2967fSEric Fiselier_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ios<char>) 48349e2967fSEric Fiselier_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ios<wchar_t>) 4843e519524SHoward Hinnant 4853e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 4863e519524SHoward Hinnant 4873e519524SHoward Hinnant#endif // _LIBCPP_STEAMBUF 488