10b57cec5SDimitry Andric// -*- C++ -*- 2*349cc55cSDimitry Andric//===----------------------------------------------------------------------===// 30b57cec5SDimitry Andric// 40b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 50b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 60b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 70b57cec5SDimitry Andric// 80b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 90b57cec5SDimitry Andric 10fe6060f1SDimitry Andric#ifndef _LIBCPP_STREAMBUF 11fe6060f1SDimitry Andric#define _LIBCPP_STREAMBUF 120b57cec5SDimitry Andric 130b57cec5SDimitry Andric/* 140b57cec5SDimitry Andric streambuf synopsis 150b57cec5SDimitry Andric 160b57cec5SDimitry Andricnamespace std 170b57cec5SDimitry Andric{ 180b57cec5SDimitry Andric 190b57cec5SDimitry Andrictemplate <class charT, class traits = char_traits<charT> > 200b57cec5SDimitry Andricclass basic_streambuf 210b57cec5SDimitry Andric{ 220b57cec5SDimitry Andricpublic: 230b57cec5SDimitry Andric // types: 240b57cec5SDimitry Andric typedef charT char_type; 250b57cec5SDimitry Andric typedef traits traits_type; 260b57cec5SDimitry Andric typedef typename traits_type::int_type int_type; 270b57cec5SDimitry Andric typedef typename traits_type::pos_type pos_type; 280b57cec5SDimitry Andric typedef typename traits_type::off_type off_type; 290b57cec5SDimitry Andric 300b57cec5SDimitry Andric virtual ~basic_streambuf(); 310b57cec5SDimitry Andric 320b57cec5SDimitry Andric // 27.6.2.2.1 locales: 330b57cec5SDimitry Andric locale pubimbue(const locale& loc); 340b57cec5SDimitry Andric locale getloc() const; 350b57cec5SDimitry Andric 360b57cec5SDimitry Andric // 27.6.2.2.2 buffer and positioning: 370b57cec5SDimitry Andric basic_streambuf* pubsetbuf(char_type* s, streamsize n); 380b57cec5SDimitry Andric pos_type pubseekoff(off_type off, ios_base::seekdir way, 390b57cec5SDimitry Andric ios_base::openmode which = ios_base::in | ios_base::out); 400b57cec5SDimitry Andric pos_type pubseekpos(pos_type sp, 410b57cec5SDimitry Andric ios_base::openmode which = ios_base::in | ios_base::out); 420b57cec5SDimitry Andric int pubsync(); 430b57cec5SDimitry Andric 440b57cec5SDimitry Andric // Get and put areas: 450b57cec5SDimitry Andric // 27.6.2.2.3 Get area: 460b57cec5SDimitry Andric streamsize in_avail(); 470b57cec5SDimitry Andric int_type snextc(); 480b57cec5SDimitry Andric int_type sbumpc(); 490b57cec5SDimitry Andric int_type sgetc(); 500b57cec5SDimitry Andric streamsize sgetn(char_type* s, streamsize n); 510b57cec5SDimitry Andric 520b57cec5SDimitry Andric // 27.6.2.2.4 Putback: 530b57cec5SDimitry Andric int_type sputbackc(char_type c); 540b57cec5SDimitry Andric int_type sungetc(); 550b57cec5SDimitry Andric 560b57cec5SDimitry Andric // 27.6.2.2.5 Put area: 570b57cec5SDimitry Andric int_type sputc(char_type c); 580b57cec5SDimitry Andric streamsize sputn(const char_type* s, streamsize n); 590b57cec5SDimitry Andric 600b57cec5SDimitry Andricprotected: 610b57cec5SDimitry Andric basic_streambuf(); 620b57cec5SDimitry Andric basic_streambuf(const basic_streambuf& rhs); 630b57cec5SDimitry Andric basic_streambuf& operator=(const basic_streambuf& rhs); 640b57cec5SDimitry Andric void swap(basic_streambuf& rhs); 650b57cec5SDimitry Andric 660b57cec5SDimitry Andric // 27.6.2.3.2 Get area: 670b57cec5SDimitry Andric char_type* eback() const; 680b57cec5SDimitry Andric char_type* gptr() const; 690b57cec5SDimitry Andric char_type* egptr() const; 700b57cec5SDimitry Andric void gbump(int n); 710b57cec5SDimitry Andric void setg(char_type* gbeg, char_type* gnext, char_type* gend); 720b57cec5SDimitry Andric 730b57cec5SDimitry Andric // 27.6.2.3.3 Put area: 740b57cec5SDimitry Andric char_type* pbase() const; 750b57cec5SDimitry Andric char_type* pptr() const; 760b57cec5SDimitry Andric char_type* epptr() const; 770b57cec5SDimitry Andric void pbump(int n); 780b57cec5SDimitry Andric void setp(char_type* pbeg, char_type* pend); 790b57cec5SDimitry Andric 800b57cec5SDimitry Andric // 27.6.2.4 virtual functions: 810b57cec5SDimitry Andric // 27.6.2.4.1 Locales: 820b57cec5SDimitry Andric virtual void imbue(const locale& loc); 830b57cec5SDimitry Andric 840b57cec5SDimitry Andric // 27.6.2.4.2 Buffer management and positioning: 850b57cec5SDimitry Andric virtual basic_streambuf* setbuf(char_type* s, streamsize n); 860b57cec5SDimitry Andric virtual pos_type seekoff(off_type off, ios_base::seekdir way, 870b57cec5SDimitry Andric ios_base::openmode which = ios_base::in | ios_base::out); 880b57cec5SDimitry Andric virtual pos_type seekpos(pos_type sp, 890b57cec5SDimitry Andric ios_base::openmode which = ios_base::in | ios_base::out); 900b57cec5SDimitry Andric virtual int sync(); 910b57cec5SDimitry Andric 920b57cec5SDimitry Andric // 27.6.2.4.3 Get area: 930b57cec5SDimitry Andric virtual streamsize showmanyc(); 940b57cec5SDimitry Andric virtual streamsize xsgetn(char_type* s, streamsize n); 950b57cec5SDimitry Andric virtual int_type underflow(); 960b57cec5SDimitry Andric virtual int_type uflow(); 970b57cec5SDimitry Andric 980b57cec5SDimitry Andric // 27.6.2.4.4 Putback: 990b57cec5SDimitry Andric virtual int_type pbackfail(int_type c = traits_type::eof()); 1000b57cec5SDimitry Andric 1010b57cec5SDimitry Andric // 27.6.2.4.5 Put area: 1020b57cec5SDimitry Andric virtual streamsize xsputn(const char_type* s, streamsize n); 1030b57cec5SDimitry Andric virtual int_type overflow (int_type c = traits_type::eof()); 1040b57cec5SDimitry Andric}; 1050b57cec5SDimitry Andric 1060b57cec5SDimitry Andric} // std 1070b57cec5SDimitry Andric 1080b57cec5SDimitry Andric*/ 1090b57cec5SDimitry Andric 1100b57cec5SDimitry Andric#include <__config> 1110b57cec5SDimitry Andric#include <ios> 112fe6060f1SDimitry Andric#include <iosfwd> 1130b57cec5SDimitry Andric 1140b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 1150b57cec5SDimitry Andric#pragma GCC system_header 1160b57cec5SDimitry Andric#endif 1170b57cec5SDimitry Andric 1180b57cec5SDimitry Andric_LIBCPP_PUSH_MACROS 1190b57cec5SDimitry Andric#include <__undef_macros> 1200b57cec5SDimitry Andric 1210b57cec5SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD 1220b57cec5SDimitry Andric 1230b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 1240b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_streambuf 1250b57cec5SDimitry Andric{ 1260b57cec5SDimitry Andricpublic: 1270b57cec5SDimitry Andric // types: 1280b57cec5SDimitry Andric typedef _CharT char_type; 1290b57cec5SDimitry Andric typedef _Traits traits_type; 1300b57cec5SDimitry Andric typedef typename traits_type::int_type int_type; 1310b57cec5SDimitry Andric typedef typename traits_type::pos_type pos_type; 1320b57cec5SDimitry Andric typedef typename traits_type::off_type off_type; 1330b57cec5SDimitry Andric 1340b57cec5SDimitry Andric static_assert((is_same<_CharT, typename traits_type::char_type>::value), 1350b57cec5SDimitry Andric "traits_type::char_type must be the same type as CharT"); 1360b57cec5SDimitry Andric 1370b57cec5SDimitry Andric virtual ~basic_streambuf(); 1380b57cec5SDimitry Andric 1390b57cec5SDimitry Andric // 27.6.2.2.1 locales: 1400b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 1410b57cec5SDimitry Andric locale pubimbue(const locale& __loc) { 1420b57cec5SDimitry Andric imbue(__loc); 1430b57cec5SDimitry Andric locale __r = __loc_; 1440b57cec5SDimitry Andric __loc_ = __loc; 1450b57cec5SDimitry Andric return __r; 1460b57cec5SDimitry Andric } 1470b57cec5SDimitry Andric 1480b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 1490b57cec5SDimitry Andric locale getloc() const { return __loc_; } 1500b57cec5SDimitry Andric 1510b57cec5SDimitry Andric // 27.6.2.2.2 buffer and positioning: 1520b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 1530b57cec5SDimitry Andric basic_streambuf* pubsetbuf(char_type* __s, streamsize __n) 1540b57cec5SDimitry Andric { return setbuf(__s, __n); } 1550b57cec5SDimitry Andric 1560b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 1570b57cec5SDimitry Andric pos_type pubseekoff(off_type __off, ios_base::seekdir __way, 1580b57cec5SDimitry Andric ios_base::openmode __which = ios_base::in | ios_base::out) 1590b57cec5SDimitry Andric { return seekoff(__off, __way, __which); } 1600b57cec5SDimitry Andric 1610b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 1620b57cec5SDimitry Andric pos_type pubseekpos(pos_type __sp, 1630b57cec5SDimitry Andric ios_base::openmode __which = ios_base::in | ios_base::out) 1640b57cec5SDimitry Andric { return seekpos(__sp, __which); } 1650b57cec5SDimitry Andric 1660b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 1670b57cec5SDimitry Andric int pubsync() { return sync(); } 1680b57cec5SDimitry Andric 1690b57cec5SDimitry Andric // Get and put areas: 1700b57cec5SDimitry Andric // 27.6.2.2.3 Get area: 1710b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 1720b57cec5SDimitry Andric streamsize in_avail() { 1730b57cec5SDimitry Andric if (__ninp_ < __einp_) 1740b57cec5SDimitry Andric return static_cast<streamsize>(__einp_ - __ninp_); 1750b57cec5SDimitry Andric return showmanyc(); 1760b57cec5SDimitry Andric } 1770b57cec5SDimitry Andric 1780b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 1790b57cec5SDimitry Andric int_type snextc() { 1800b57cec5SDimitry Andric if (sbumpc() == traits_type::eof()) 1810b57cec5SDimitry Andric return traits_type::eof(); 1820b57cec5SDimitry Andric return sgetc(); 1830b57cec5SDimitry Andric } 1840b57cec5SDimitry Andric 1850b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 1860b57cec5SDimitry Andric int_type sbumpc() { 1870b57cec5SDimitry Andric if (__ninp_ == __einp_) 1880b57cec5SDimitry Andric return uflow(); 1890b57cec5SDimitry Andric return traits_type::to_int_type(*__ninp_++); 1900b57cec5SDimitry Andric } 1910b57cec5SDimitry Andric 1920b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 1930b57cec5SDimitry Andric int_type sgetc() { 1940b57cec5SDimitry Andric if (__ninp_ == __einp_) 1950b57cec5SDimitry Andric return underflow(); 1960b57cec5SDimitry Andric return traits_type::to_int_type(*__ninp_); 1970b57cec5SDimitry Andric } 1980b57cec5SDimitry Andric 1990b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 2000b57cec5SDimitry Andric streamsize sgetn(char_type* __s, streamsize __n) 2010b57cec5SDimitry Andric { return xsgetn(__s, __n); } 2020b57cec5SDimitry Andric 2030b57cec5SDimitry Andric // 27.6.2.2.4 Putback: 2040b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 2050b57cec5SDimitry Andric int_type sputbackc(char_type __c) { 2060b57cec5SDimitry Andric if (__binp_ == __ninp_ || !traits_type::eq(__c, __ninp_[-1])) 2070b57cec5SDimitry Andric return pbackfail(traits_type::to_int_type(__c)); 2080b57cec5SDimitry Andric return traits_type::to_int_type(*--__ninp_); 2090b57cec5SDimitry Andric } 2100b57cec5SDimitry Andric 2110b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 2120b57cec5SDimitry Andric int_type sungetc() { 2130b57cec5SDimitry Andric if (__binp_ == __ninp_) 2140b57cec5SDimitry Andric return pbackfail(); 2150b57cec5SDimitry Andric return traits_type::to_int_type(*--__ninp_); 2160b57cec5SDimitry Andric } 2170b57cec5SDimitry Andric 2180b57cec5SDimitry Andric // 27.6.2.2.5 Put area: 2190b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 2200b57cec5SDimitry Andric int_type sputc(char_type __c) { 2210b57cec5SDimitry Andric if (__nout_ == __eout_) 2220b57cec5SDimitry Andric return overflow(traits_type::to_int_type(__c)); 2230b57cec5SDimitry Andric *__nout_++ = __c; 2240b57cec5SDimitry Andric return traits_type::to_int_type(__c); 2250b57cec5SDimitry Andric } 2260b57cec5SDimitry Andric 2270b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 2280b57cec5SDimitry Andric streamsize sputn(const char_type* __s, streamsize __n) 2290b57cec5SDimitry Andric { return xsputn(__s, __n); } 2300b57cec5SDimitry Andric 2310b57cec5SDimitry Andricprotected: 2320b57cec5SDimitry Andric basic_streambuf(); 2330b57cec5SDimitry Andric basic_streambuf(const basic_streambuf& __rhs); 2340b57cec5SDimitry Andric basic_streambuf& operator=(const basic_streambuf& __rhs); 2350b57cec5SDimitry Andric void swap(basic_streambuf& __rhs); 2360b57cec5SDimitry Andric 2370b57cec5SDimitry Andric // 27.6.2.3.2 Get area: 2380b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY char_type* eback() const {return __binp_;} 2390b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY char_type* gptr() const {return __ninp_;} 2400b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY char_type* egptr() const {return __einp_;} 2410b57cec5SDimitry Andric 2420b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 2430b57cec5SDimitry Andric void gbump(int __n) { __ninp_ += __n; } 2440b57cec5SDimitry Andric 2450b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 2460b57cec5SDimitry Andric void setg(char_type* __gbeg, char_type* __gnext, char_type* __gend) { 2470b57cec5SDimitry Andric __binp_ = __gbeg; 2480b57cec5SDimitry Andric __ninp_ = __gnext; 2490b57cec5SDimitry Andric __einp_ = __gend; 2500b57cec5SDimitry Andric } 2510b57cec5SDimitry Andric 2520b57cec5SDimitry Andric // 27.6.2.3.3 Put area: 2530b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY char_type* pbase() const {return __bout_;} 2540b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY char_type* pptr() const {return __nout_;} 2550b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY char_type* epptr() const {return __eout_;} 2560b57cec5SDimitry Andric 2570b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 2580b57cec5SDimitry Andric void pbump(int __n) { __nout_ += __n; } 2590b57cec5SDimitry Andric 2600b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 2610b57cec5SDimitry Andric void __pbump(streamsize __n) { __nout_ += __n; } 2620b57cec5SDimitry Andric 2630b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 2640b57cec5SDimitry Andric void setp(char_type* __pbeg, char_type* __pend) { 2650b57cec5SDimitry Andric __bout_ = __nout_ = __pbeg; 2660b57cec5SDimitry Andric __eout_ = __pend; 2670b57cec5SDimitry Andric } 2680b57cec5SDimitry Andric 2690b57cec5SDimitry Andric // 27.6.2.4 virtual functions: 2700b57cec5SDimitry Andric // 27.6.2.4.1 Locales: 2710b57cec5SDimitry Andric virtual void imbue(const locale& __loc); 2720b57cec5SDimitry Andric 2730b57cec5SDimitry Andric // 27.6.2.4.2 Buffer management and positioning: 2740b57cec5SDimitry Andric virtual basic_streambuf* setbuf(char_type* __s, streamsize __n); 2750b57cec5SDimitry Andric virtual pos_type seekoff(off_type __off, ios_base::seekdir __way, 2760b57cec5SDimitry Andric ios_base::openmode __which = ios_base::in | ios_base::out); 2770b57cec5SDimitry Andric virtual pos_type seekpos(pos_type __sp, 2780b57cec5SDimitry Andric ios_base::openmode __which = ios_base::in | ios_base::out); 2790b57cec5SDimitry Andric virtual int sync(); 2800b57cec5SDimitry Andric 2810b57cec5SDimitry Andric // 27.6.2.4.3 Get area: 2820b57cec5SDimitry Andric virtual streamsize showmanyc(); 2830b57cec5SDimitry Andric virtual streamsize xsgetn(char_type* __s, streamsize __n); 2840b57cec5SDimitry Andric virtual int_type underflow(); 2850b57cec5SDimitry Andric virtual int_type uflow(); 2860b57cec5SDimitry Andric 2870b57cec5SDimitry Andric // 27.6.2.4.4 Putback: 2880b57cec5SDimitry Andric virtual int_type pbackfail(int_type __c = traits_type::eof()); 2890b57cec5SDimitry Andric 2900b57cec5SDimitry Andric // 27.6.2.4.5 Put area: 2910b57cec5SDimitry Andric virtual streamsize xsputn(const char_type* __s, streamsize __n); 2920b57cec5SDimitry Andric virtual int_type overflow(int_type __c = traits_type::eof()); 2930b57cec5SDimitry Andric 2940b57cec5SDimitry Andricprivate: 2950b57cec5SDimitry Andric locale __loc_; 2960b57cec5SDimitry Andric char_type* __binp_; 2970b57cec5SDimitry Andric char_type* __ninp_; 2980b57cec5SDimitry Andric char_type* __einp_; 2990b57cec5SDimitry Andric char_type* __bout_; 3000b57cec5SDimitry Andric char_type* __nout_; 3010b57cec5SDimitry Andric char_type* __eout_; 3020b57cec5SDimitry Andric}; 3030b57cec5SDimitry Andric 3040b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 3050b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::~basic_streambuf() 3060b57cec5SDimitry Andric{ 3070b57cec5SDimitry Andric} 3080b57cec5SDimitry Andric 3090b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 3100b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::basic_streambuf() 311e8d8bef9SDimitry Andric : __binp_(nullptr), 312e8d8bef9SDimitry Andric __ninp_(nullptr), 313e8d8bef9SDimitry Andric __einp_(nullptr), 314e8d8bef9SDimitry Andric __bout_(nullptr), 315e8d8bef9SDimitry Andric __nout_(nullptr), 316e8d8bef9SDimitry Andric __eout_(nullptr) 3170b57cec5SDimitry Andric{ 3180b57cec5SDimitry Andric} 3190b57cec5SDimitry Andric 3200b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 3210b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::basic_streambuf(const basic_streambuf& __sb) 3220b57cec5SDimitry Andric : __loc_(__sb.__loc_), 3230b57cec5SDimitry Andric __binp_(__sb.__binp_), 3240b57cec5SDimitry Andric __ninp_(__sb.__ninp_), 3250b57cec5SDimitry Andric __einp_(__sb.__einp_), 3260b57cec5SDimitry Andric __bout_(__sb.__bout_), 3270b57cec5SDimitry Andric __nout_(__sb.__nout_), 3280b57cec5SDimitry Andric __eout_(__sb.__eout_) 3290b57cec5SDimitry Andric{ 3300b57cec5SDimitry Andric} 3310b57cec5SDimitry Andric 3320b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 3330b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>& 3340b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::operator=(const basic_streambuf& __sb) 3350b57cec5SDimitry Andric{ 3360b57cec5SDimitry Andric __loc_ = __sb.__loc_; 3370b57cec5SDimitry Andric __binp_ = __sb.__binp_; 3380b57cec5SDimitry Andric __ninp_ = __sb.__ninp_; 3390b57cec5SDimitry Andric __einp_ = __sb.__einp_; 3400b57cec5SDimitry Andric __bout_ = __sb.__bout_; 3410b57cec5SDimitry Andric __nout_ = __sb.__nout_; 3420b57cec5SDimitry Andric __eout_ = __sb.__eout_; 3430b57cec5SDimitry Andric return *this; 3440b57cec5SDimitry Andric} 3450b57cec5SDimitry Andric 3460b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 3470b57cec5SDimitry Andricvoid 3480b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::swap(basic_streambuf& __sb) 3490b57cec5SDimitry Andric{ 3500b57cec5SDimitry Andric _VSTD::swap(__loc_, __sb.__loc_); 3510b57cec5SDimitry Andric _VSTD::swap(__binp_, __sb.__binp_); 3520b57cec5SDimitry Andric _VSTD::swap(__ninp_, __sb.__ninp_); 3530b57cec5SDimitry Andric _VSTD::swap(__einp_, __sb.__einp_); 3540b57cec5SDimitry Andric _VSTD::swap(__bout_, __sb.__bout_); 3550b57cec5SDimitry Andric _VSTD::swap(__nout_, __sb.__nout_); 3560b57cec5SDimitry Andric _VSTD::swap(__eout_, __sb.__eout_); 3570b57cec5SDimitry Andric} 3580b57cec5SDimitry Andric 3590b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 3600b57cec5SDimitry Andricvoid 3610b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::imbue(const locale&) 3620b57cec5SDimitry Andric{ 3630b57cec5SDimitry Andric} 3640b57cec5SDimitry Andric 3650b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 3660b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>* 3670b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::setbuf(char_type*, streamsize) 3680b57cec5SDimitry Andric{ 3690b57cec5SDimitry Andric return this; 3700b57cec5SDimitry Andric} 3710b57cec5SDimitry Andric 3720b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 3730b57cec5SDimitry Andrictypename basic_streambuf<_CharT, _Traits>::pos_type 3740b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::seekoff(off_type, ios_base::seekdir, 3750b57cec5SDimitry Andric ios_base::openmode) 3760b57cec5SDimitry Andric{ 3770b57cec5SDimitry Andric return pos_type(off_type(-1)); 3780b57cec5SDimitry Andric} 3790b57cec5SDimitry Andric 3800b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 3810b57cec5SDimitry Andrictypename basic_streambuf<_CharT, _Traits>::pos_type 3820b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::seekpos(pos_type, ios_base::openmode) 3830b57cec5SDimitry Andric{ 3840b57cec5SDimitry Andric return pos_type(off_type(-1)); 3850b57cec5SDimitry Andric} 3860b57cec5SDimitry Andric 3870b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 3880b57cec5SDimitry Andricint 3890b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::sync() 3900b57cec5SDimitry Andric{ 3910b57cec5SDimitry Andric return 0; 3920b57cec5SDimitry Andric} 3930b57cec5SDimitry Andric 3940b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 3950b57cec5SDimitry Andricstreamsize 3960b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::showmanyc() 3970b57cec5SDimitry Andric{ 3980b57cec5SDimitry Andric return 0; 3990b57cec5SDimitry Andric} 4000b57cec5SDimitry Andric 4010b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 4020b57cec5SDimitry Andricstreamsize 4030b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::xsgetn(char_type* __s, streamsize __n) 4040b57cec5SDimitry Andric{ 4050b57cec5SDimitry Andric const int_type __eof = traits_type::eof(); 4060b57cec5SDimitry Andric int_type __c; 4070b57cec5SDimitry Andric streamsize __i = 0; 4080b57cec5SDimitry Andric while(__i < __n) 4090b57cec5SDimitry Andric { 4100b57cec5SDimitry Andric if (__ninp_ < __einp_) 4110b57cec5SDimitry Andric { 4120b57cec5SDimitry Andric const streamsize __len = _VSTD::min(static_cast<streamsize>(INT_MAX), 4130b57cec5SDimitry Andric _VSTD::min(__einp_ - __ninp_, __n - __i)); 4140b57cec5SDimitry Andric traits_type::copy(__s, __ninp_, __len); 4150b57cec5SDimitry Andric __s += __len; 4160b57cec5SDimitry Andric __i += __len; 4170b57cec5SDimitry Andric this->gbump(__len); 4180b57cec5SDimitry Andric } 4190b57cec5SDimitry Andric else if ((__c = uflow()) != __eof) 4200b57cec5SDimitry Andric { 4210b57cec5SDimitry Andric *__s = traits_type::to_char_type(__c); 4220b57cec5SDimitry Andric ++__s; 4230b57cec5SDimitry Andric ++__i; 4240b57cec5SDimitry Andric } 4250b57cec5SDimitry Andric else 4260b57cec5SDimitry Andric break; 4270b57cec5SDimitry Andric } 4280b57cec5SDimitry Andric return __i; 4290b57cec5SDimitry Andric} 4300b57cec5SDimitry Andric 4310b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 4320b57cec5SDimitry Andrictypename basic_streambuf<_CharT, _Traits>::int_type 4330b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::underflow() 4340b57cec5SDimitry Andric{ 4350b57cec5SDimitry Andric return traits_type::eof(); 4360b57cec5SDimitry Andric} 4370b57cec5SDimitry Andric 4380b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 4390b57cec5SDimitry Andrictypename basic_streambuf<_CharT, _Traits>::int_type 4400b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::uflow() 4410b57cec5SDimitry Andric{ 4420b57cec5SDimitry Andric if (underflow() == traits_type::eof()) 4430b57cec5SDimitry Andric return traits_type::eof(); 4440b57cec5SDimitry Andric return traits_type::to_int_type(*__ninp_++); 4450b57cec5SDimitry Andric} 4460b57cec5SDimitry Andric 4470b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 4480b57cec5SDimitry Andrictypename basic_streambuf<_CharT, _Traits>::int_type 4490b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::pbackfail(int_type) 4500b57cec5SDimitry Andric{ 4510b57cec5SDimitry Andric return traits_type::eof(); 4520b57cec5SDimitry Andric} 4530b57cec5SDimitry Andric 4540b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 4550b57cec5SDimitry Andricstreamsize 4560b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::xsputn(const char_type* __s, streamsize __n) 4570b57cec5SDimitry Andric{ 4580b57cec5SDimitry Andric streamsize __i = 0; 4590b57cec5SDimitry Andric int_type __eof = traits_type::eof(); 4600b57cec5SDimitry Andric while( __i < __n) 4610b57cec5SDimitry Andric { 4620b57cec5SDimitry Andric if (__nout_ >= __eout_) 4630b57cec5SDimitry Andric { 4640b57cec5SDimitry Andric if (overflow(traits_type::to_int_type(*__s)) == __eof) 4650b57cec5SDimitry Andric break; 4660b57cec5SDimitry Andric ++__s; 4670b57cec5SDimitry Andric ++__i; 4680b57cec5SDimitry Andric } 4690b57cec5SDimitry Andric else 4700b57cec5SDimitry Andric { 4710b57cec5SDimitry Andric streamsize __chunk_size = _VSTD::min(__eout_ - __nout_, __n - __i); 4720b57cec5SDimitry Andric traits_type::copy(__nout_, __s, __chunk_size); 4730b57cec5SDimitry Andric __nout_ += __chunk_size; 4740b57cec5SDimitry Andric __s += __chunk_size; 4750b57cec5SDimitry Andric __i += __chunk_size; 4760b57cec5SDimitry Andric } 4770b57cec5SDimitry Andric } 4780b57cec5SDimitry Andric return __i; 4790b57cec5SDimitry Andric} 4800b57cec5SDimitry Andric 4810b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 4820b57cec5SDimitry Andrictypename basic_streambuf<_CharT, _Traits>::int_type 4830b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::overflow(int_type) 4840b57cec5SDimitry Andric{ 4850b57cec5SDimitry Andric return traits_type::eof(); 4860b57cec5SDimitry Andric} 4870b57cec5SDimitry Andric 4880b57cec5SDimitry Andric_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_streambuf<char>) 4890b57cec5SDimitry Andric_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_streambuf<wchar_t>) 4900b57cec5SDimitry Andric 4910b57cec5SDimitry Andric_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ios<char>) 4920b57cec5SDimitry Andric_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ios<wchar_t>) 4930b57cec5SDimitry Andric 4940b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD 4950b57cec5SDimitry Andric 4960b57cec5SDimitry Andric_LIBCPP_POP_MACROS 4970b57cec5SDimitry Andric 498fe6060f1SDimitry Andric#endif // _LIBCPP_STREAMBUF 499