10b57cec5SDimitry Andric// -*- C++ -*- 2349cc55cSDimitry 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 11081ad6265SDimitry Andric#include <__assert> // all public C++ headers provide the assertion handler 1110b57cec5SDimitry Andric#include <__config> 112*06c3fb27SDimitry Andric#include <__fwd/streambuf.h> 11304eeddc0SDimitry Andric#include <cstdint> 1140b57cec5SDimitry Andric#include <ios> 115fe6060f1SDimitry Andric#include <iosfwd> 11604eeddc0SDimitry Andric#include <version> 1170b57cec5SDimitry Andric 1180b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 1190b57cec5SDimitry Andric# pragma GCC system_header 1200b57cec5SDimitry Andric#endif 1210b57cec5SDimitry Andric 1220b57cec5SDimitry Andric_LIBCPP_PUSH_MACROS 1230b57cec5SDimitry Andric#include <__undef_macros> 1240b57cec5SDimitry Andric 1250b57cec5SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD 1260b57cec5SDimitry Andric 1270b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 1280b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_streambuf 1290b57cec5SDimitry Andric{ 1300b57cec5SDimitry Andricpublic: 1310b57cec5SDimitry Andric // types: 1320b57cec5SDimitry Andric typedef _CharT char_type; 1330b57cec5SDimitry Andric typedef _Traits traits_type; 1340b57cec5SDimitry Andric typedef typename traits_type::int_type int_type; 1350b57cec5SDimitry Andric typedef typename traits_type::pos_type pos_type; 1360b57cec5SDimitry Andric typedef typename traits_type::off_type off_type; 1370b57cec5SDimitry Andric 1380b57cec5SDimitry Andric static_assert((is_same<_CharT, typename traits_type::char_type>::value), 1390b57cec5SDimitry Andric "traits_type::char_type must be the same type as CharT"); 1400b57cec5SDimitry Andric 1410b57cec5SDimitry Andric virtual ~basic_streambuf(); 1420b57cec5SDimitry Andric 1430b57cec5SDimitry Andric // 27.6.2.2.1 locales: 1440b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 1450b57cec5SDimitry Andric locale pubimbue(const locale& __loc) { 1460b57cec5SDimitry Andric imbue(__loc); 1470b57cec5SDimitry Andric locale __r = __loc_; 1480b57cec5SDimitry Andric __loc_ = __loc; 1490b57cec5SDimitry Andric return __r; 1500b57cec5SDimitry Andric } 1510b57cec5SDimitry Andric 1520b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 1530b57cec5SDimitry Andric locale getloc() const { return __loc_; } 1540b57cec5SDimitry Andric 1550b57cec5SDimitry Andric // 27.6.2.2.2 buffer and positioning: 1560b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 1570b57cec5SDimitry Andric basic_streambuf* pubsetbuf(char_type* __s, streamsize __n) 1580b57cec5SDimitry Andric { return setbuf(__s, __n); } 1590b57cec5SDimitry Andric 1600b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 1610b57cec5SDimitry Andric pos_type pubseekoff(off_type __off, ios_base::seekdir __way, 1620b57cec5SDimitry Andric ios_base::openmode __which = ios_base::in | ios_base::out) 1630b57cec5SDimitry Andric { return seekoff(__off, __way, __which); } 1640b57cec5SDimitry Andric 1650b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 1660b57cec5SDimitry Andric pos_type pubseekpos(pos_type __sp, 1670b57cec5SDimitry Andric ios_base::openmode __which = ios_base::in | ios_base::out) 1680b57cec5SDimitry Andric { return seekpos(__sp, __which); } 1690b57cec5SDimitry Andric 1700b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 1710b57cec5SDimitry Andric int pubsync() { return sync(); } 1720b57cec5SDimitry Andric 1730b57cec5SDimitry Andric // Get and put areas: 1740b57cec5SDimitry Andric // 27.6.2.2.3 Get area: 1750b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 1760b57cec5SDimitry Andric streamsize in_avail() { 1770b57cec5SDimitry Andric if (__ninp_ < __einp_) 1780b57cec5SDimitry Andric return static_cast<streamsize>(__einp_ - __ninp_); 1790b57cec5SDimitry Andric return showmanyc(); 1800b57cec5SDimitry Andric } 1810b57cec5SDimitry Andric 1820b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 1830b57cec5SDimitry Andric int_type snextc() { 1840b57cec5SDimitry Andric if (sbumpc() == traits_type::eof()) 1850b57cec5SDimitry Andric return traits_type::eof(); 1860b57cec5SDimitry Andric return sgetc(); 1870b57cec5SDimitry Andric } 1880b57cec5SDimitry Andric 1890b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 1900b57cec5SDimitry Andric int_type sbumpc() { 1910b57cec5SDimitry Andric if (__ninp_ == __einp_) 1920b57cec5SDimitry Andric return uflow(); 1930b57cec5SDimitry Andric return traits_type::to_int_type(*__ninp_++); 1940b57cec5SDimitry Andric } 1950b57cec5SDimitry Andric 1960b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 1970b57cec5SDimitry Andric int_type sgetc() { 1980b57cec5SDimitry Andric if (__ninp_ == __einp_) 1990b57cec5SDimitry Andric return underflow(); 2000b57cec5SDimitry Andric return traits_type::to_int_type(*__ninp_); 2010b57cec5SDimitry Andric } 2020b57cec5SDimitry Andric 2030b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 2040b57cec5SDimitry Andric streamsize sgetn(char_type* __s, streamsize __n) 2050b57cec5SDimitry Andric { return xsgetn(__s, __n); } 2060b57cec5SDimitry Andric 2070b57cec5SDimitry Andric // 27.6.2.2.4 Putback: 2080b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 2090b57cec5SDimitry Andric int_type sputbackc(char_type __c) { 2100b57cec5SDimitry Andric if (__binp_ == __ninp_ || !traits_type::eq(__c, __ninp_[-1])) 2110b57cec5SDimitry Andric return pbackfail(traits_type::to_int_type(__c)); 2120b57cec5SDimitry Andric return traits_type::to_int_type(*--__ninp_); 2130b57cec5SDimitry Andric } 2140b57cec5SDimitry Andric 2150b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 2160b57cec5SDimitry Andric int_type sungetc() { 2170b57cec5SDimitry Andric if (__binp_ == __ninp_) 2180b57cec5SDimitry Andric return pbackfail(); 2190b57cec5SDimitry Andric return traits_type::to_int_type(*--__ninp_); 2200b57cec5SDimitry Andric } 2210b57cec5SDimitry Andric 2220b57cec5SDimitry Andric // 27.6.2.2.5 Put area: 2230b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 2240b57cec5SDimitry Andric int_type sputc(char_type __c) { 2250b57cec5SDimitry Andric if (__nout_ == __eout_) 2260b57cec5SDimitry Andric return overflow(traits_type::to_int_type(__c)); 2270b57cec5SDimitry Andric *__nout_++ = __c; 2280b57cec5SDimitry Andric return traits_type::to_int_type(__c); 2290b57cec5SDimitry Andric } 2300b57cec5SDimitry Andric 2310b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 2320b57cec5SDimitry Andric streamsize sputn(const char_type* __s, streamsize __n) 2330b57cec5SDimitry Andric { return xsputn(__s, __n); } 2340b57cec5SDimitry Andric 2350b57cec5SDimitry Andricprotected: 2360b57cec5SDimitry Andric basic_streambuf(); 2370b57cec5SDimitry Andric basic_streambuf(const basic_streambuf& __rhs); 2380b57cec5SDimitry Andric basic_streambuf& operator=(const basic_streambuf& __rhs); 2390b57cec5SDimitry Andric void swap(basic_streambuf& __rhs); 2400b57cec5SDimitry Andric 2410b57cec5SDimitry Andric // 27.6.2.3.2 Get area: 2420b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY char_type* eback() const {return __binp_;} 2430b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY char_type* gptr() const {return __ninp_;} 2440b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY char_type* egptr() const {return __einp_;} 2450b57cec5SDimitry Andric 2460b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 2470b57cec5SDimitry Andric void gbump(int __n) { __ninp_ += __n; } 2480b57cec5SDimitry Andric 2490b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 2500b57cec5SDimitry Andric void setg(char_type* __gbeg, char_type* __gnext, char_type* __gend) { 2510b57cec5SDimitry Andric __binp_ = __gbeg; 2520b57cec5SDimitry Andric __ninp_ = __gnext; 2530b57cec5SDimitry Andric __einp_ = __gend; 2540b57cec5SDimitry Andric } 2550b57cec5SDimitry Andric 2560b57cec5SDimitry Andric // 27.6.2.3.3 Put area: 2570b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY char_type* pbase() const {return __bout_;} 2580b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY char_type* pptr() const {return __nout_;} 2590b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY char_type* epptr() const {return __eout_;} 2600b57cec5SDimitry Andric 2610b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 2620b57cec5SDimitry Andric void pbump(int __n) { __nout_ += __n; } 2630b57cec5SDimitry Andric 2640b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 2650b57cec5SDimitry Andric void __pbump(streamsize __n) { __nout_ += __n; } 2660b57cec5SDimitry Andric 2670b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 2680b57cec5SDimitry Andric void setp(char_type* __pbeg, char_type* __pend) { 2690b57cec5SDimitry Andric __bout_ = __nout_ = __pbeg; 2700b57cec5SDimitry Andric __eout_ = __pend; 2710b57cec5SDimitry Andric } 2720b57cec5SDimitry Andric 2730b57cec5SDimitry Andric // 27.6.2.4 virtual functions: 2740b57cec5SDimitry Andric // 27.6.2.4.1 Locales: 2750b57cec5SDimitry Andric virtual void imbue(const locale& __loc); 2760b57cec5SDimitry Andric 2770b57cec5SDimitry Andric // 27.6.2.4.2 Buffer management and positioning: 2780b57cec5SDimitry Andric virtual basic_streambuf* setbuf(char_type* __s, streamsize __n); 2790b57cec5SDimitry Andric virtual pos_type seekoff(off_type __off, ios_base::seekdir __way, 2800b57cec5SDimitry Andric ios_base::openmode __which = ios_base::in | ios_base::out); 2810b57cec5SDimitry Andric virtual pos_type seekpos(pos_type __sp, 2820b57cec5SDimitry Andric ios_base::openmode __which = ios_base::in | ios_base::out); 2830b57cec5SDimitry Andric virtual int sync(); 2840b57cec5SDimitry Andric 2850b57cec5SDimitry Andric // 27.6.2.4.3 Get area: 2860b57cec5SDimitry Andric virtual streamsize showmanyc(); 2870b57cec5SDimitry Andric virtual streamsize xsgetn(char_type* __s, streamsize __n); 2880b57cec5SDimitry Andric virtual int_type underflow(); 2890b57cec5SDimitry Andric virtual int_type uflow(); 2900b57cec5SDimitry Andric 2910b57cec5SDimitry Andric // 27.6.2.4.4 Putback: 2920b57cec5SDimitry Andric virtual int_type pbackfail(int_type __c = traits_type::eof()); 2930b57cec5SDimitry Andric 2940b57cec5SDimitry Andric // 27.6.2.4.5 Put area: 2950b57cec5SDimitry Andric virtual streamsize xsputn(const char_type* __s, streamsize __n); 2960b57cec5SDimitry Andric virtual int_type overflow(int_type __c = traits_type::eof()); 2970b57cec5SDimitry Andric 2980b57cec5SDimitry Andricprivate: 2990b57cec5SDimitry Andric locale __loc_; 3000b57cec5SDimitry Andric char_type* __binp_; 3010b57cec5SDimitry Andric char_type* __ninp_; 3020b57cec5SDimitry Andric char_type* __einp_; 3030b57cec5SDimitry Andric char_type* __bout_; 3040b57cec5SDimitry Andric char_type* __nout_; 3050b57cec5SDimitry Andric char_type* __eout_; 3060b57cec5SDimitry Andric}; 3070b57cec5SDimitry Andric 3080b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 3090b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::~basic_streambuf() 3100b57cec5SDimitry Andric{ 3110b57cec5SDimitry Andric} 3120b57cec5SDimitry Andric 3130b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 3140b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::basic_streambuf() 315e8d8bef9SDimitry Andric : __binp_(nullptr), 316e8d8bef9SDimitry Andric __ninp_(nullptr), 317e8d8bef9SDimitry Andric __einp_(nullptr), 318e8d8bef9SDimitry Andric __bout_(nullptr), 319e8d8bef9SDimitry Andric __nout_(nullptr), 320e8d8bef9SDimitry Andric __eout_(nullptr) 3210b57cec5SDimitry Andric{ 3220b57cec5SDimitry Andric} 3230b57cec5SDimitry Andric 3240b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 3250b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::basic_streambuf(const basic_streambuf& __sb) 3260b57cec5SDimitry Andric : __loc_(__sb.__loc_), 3270b57cec5SDimitry Andric __binp_(__sb.__binp_), 3280b57cec5SDimitry Andric __ninp_(__sb.__ninp_), 3290b57cec5SDimitry Andric __einp_(__sb.__einp_), 3300b57cec5SDimitry Andric __bout_(__sb.__bout_), 3310b57cec5SDimitry Andric __nout_(__sb.__nout_), 3320b57cec5SDimitry Andric __eout_(__sb.__eout_) 3330b57cec5SDimitry Andric{ 3340b57cec5SDimitry Andric} 3350b57cec5SDimitry Andric 3360b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 3370b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>& 3380b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::operator=(const basic_streambuf& __sb) 3390b57cec5SDimitry Andric{ 3400b57cec5SDimitry Andric __loc_ = __sb.__loc_; 3410b57cec5SDimitry Andric __binp_ = __sb.__binp_; 3420b57cec5SDimitry Andric __ninp_ = __sb.__ninp_; 3430b57cec5SDimitry Andric __einp_ = __sb.__einp_; 3440b57cec5SDimitry Andric __bout_ = __sb.__bout_; 3450b57cec5SDimitry Andric __nout_ = __sb.__nout_; 3460b57cec5SDimitry Andric __eout_ = __sb.__eout_; 3470b57cec5SDimitry Andric return *this; 3480b57cec5SDimitry Andric} 3490b57cec5SDimitry Andric 3500b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 3510b57cec5SDimitry Andricvoid 3520b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::swap(basic_streambuf& __sb) 3530b57cec5SDimitry Andric{ 3540b57cec5SDimitry Andric _VSTD::swap(__loc_, __sb.__loc_); 3550b57cec5SDimitry Andric _VSTD::swap(__binp_, __sb.__binp_); 3560b57cec5SDimitry Andric _VSTD::swap(__ninp_, __sb.__ninp_); 3570b57cec5SDimitry Andric _VSTD::swap(__einp_, __sb.__einp_); 3580b57cec5SDimitry Andric _VSTD::swap(__bout_, __sb.__bout_); 3590b57cec5SDimitry Andric _VSTD::swap(__nout_, __sb.__nout_); 3600b57cec5SDimitry Andric _VSTD::swap(__eout_, __sb.__eout_); 3610b57cec5SDimitry Andric} 3620b57cec5SDimitry Andric 3630b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 3640b57cec5SDimitry Andricvoid 3650b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::imbue(const locale&) 3660b57cec5SDimitry Andric{ 3670b57cec5SDimitry Andric} 3680b57cec5SDimitry Andric 3690b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 3700b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>* 3710b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::setbuf(char_type*, streamsize) 3720b57cec5SDimitry Andric{ 3730b57cec5SDimitry Andric return this; 3740b57cec5SDimitry Andric} 3750b57cec5SDimitry Andric 3760b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 3770b57cec5SDimitry Andrictypename basic_streambuf<_CharT, _Traits>::pos_type 3780b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::seekoff(off_type, ios_base::seekdir, 3790b57cec5SDimitry Andric ios_base::openmode) 3800b57cec5SDimitry Andric{ 3810b57cec5SDimitry Andric return pos_type(off_type(-1)); 3820b57cec5SDimitry Andric} 3830b57cec5SDimitry Andric 3840b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 3850b57cec5SDimitry Andrictypename basic_streambuf<_CharT, _Traits>::pos_type 3860b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::seekpos(pos_type, ios_base::openmode) 3870b57cec5SDimitry Andric{ 3880b57cec5SDimitry Andric return pos_type(off_type(-1)); 3890b57cec5SDimitry Andric} 3900b57cec5SDimitry Andric 3910b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 3920b57cec5SDimitry Andricint 3930b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::sync() 3940b57cec5SDimitry Andric{ 3950b57cec5SDimitry Andric return 0; 3960b57cec5SDimitry Andric} 3970b57cec5SDimitry Andric 3980b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 3990b57cec5SDimitry Andricstreamsize 4000b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::showmanyc() 4010b57cec5SDimitry Andric{ 4020b57cec5SDimitry Andric return 0; 4030b57cec5SDimitry Andric} 4040b57cec5SDimitry Andric 4050b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 4060b57cec5SDimitry Andricstreamsize 4070b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::xsgetn(char_type* __s, streamsize __n) 4080b57cec5SDimitry Andric{ 4090b57cec5SDimitry Andric const int_type __eof = traits_type::eof(); 4100b57cec5SDimitry Andric int_type __c; 4110b57cec5SDimitry Andric streamsize __i = 0; 4120b57cec5SDimitry Andric while(__i < __n) 4130b57cec5SDimitry Andric { 4140b57cec5SDimitry Andric if (__ninp_ < __einp_) 4150b57cec5SDimitry Andric { 4160b57cec5SDimitry Andric const streamsize __len = _VSTD::min(static_cast<streamsize>(INT_MAX), 4170b57cec5SDimitry Andric _VSTD::min(__einp_ - __ninp_, __n - __i)); 4180b57cec5SDimitry Andric traits_type::copy(__s, __ninp_, __len); 4190b57cec5SDimitry Andric __s += __len; 4200b57cec5SDimitry Andric __i += __len; 4210b57cec5SDimitry Andric this->gbump(__len); 4220b57cec5SDimitry Andric } 4230b57cec5SDimitry Andric else if ((__c = uflow()) != __eof) 4240b57cec5SDimitry Andric { 4250b57cec5SDimitry Andric *__s = traits_type::to_char_type(__c); 4260b57cec5SDimitry Andric ++__s; 4270b57cec5SDimitry Andric ++__i; 4280b57cec5SDimitry Andric } 4290b57cec5SDimitry Andric else 4300b57cec5SDimitry Andric break; 4310b57cec5SDimitry Andric } 4320b57cec5SDimitry Andric return __i; 4330b57cec5SDimitry Andric} 4340b57cec5SDimitry Andric 4350b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 4360b57cec5SDimitry Andrictypename basic_streambuf<_CharT, _Traits>::int_type 4370b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::underflow() 4380b57cec5SDimitry Andric{ 4390b57cec5SDimitry Andric return traits_type::eof(); 4400b57cec5SDimitry Andric} 4410b57cec5SDimitry Andric 4420b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 4430b57cec5SDimitry Andrictypename basic_streambuf<_CharT, _Traits>::int_type 4440b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::uflow() 4450b57cec5SDimitry Andric{ 4460b57cec5SDimitry Andric if (underflow() == traits_type::eof()) 4470b57cec5SDimitry Andric return traits_type::eof(); 4480b57cec5SDimitry Andric return traits_type::to_int_type(*__ninp_++); 4490b57cec5SDimitry Andric} 4500b57cec5SDimitry Andric 4510b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 4520b57cec5SDimitry Andrictypename basic_streambuf<_CharT, _Traits>::int_type 4530b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::pbackfail(int_type) 4540b57cec5SDimitry Andric{ 4550b57cec5SDimitry Andric return traits_type::eof(); 4560b57cec5SDimitry Andric} 4570b57cec5SDimitry Andric 4580b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 4590b57cec5SDimitry Andricstreamsize 4600b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::xsputn(const char_type* __s, streamsize __n) 4610b57cec5SDimitry Andric{ 4620b57cec5SDimitry Andric streamsize __i = 0; 4630b57cec5SDimitry Andric int_type __eof = traits_type::eof(); 4640b57cec5SDimitry Andric while( __i < __n) 4650b57cec5SDimitry Andric { 4660b57cec5SDimitry Andric if (__nout_ >= __eout_) 4670b57cec5SDimitry Andric { 4680b57cec5SDimitry Andric if (overflow(traits_type::to_int_type(*__s)) == __eof) 4690b57cec5SDimitry Andric break; 4700b57cec5SDimitry Andric ++__s; 4710b57cec5SDimitry Andric ++__i; 4720b57cec5SDimitry Andric } 4730b57cec5SDimitry Andric else 4740b57cec5SDimitry Andric { 4750b57cec5SDimitry Andric streamsize __chunk_size = _VSTD::min(__eout_ - __nout_, __n - __i); 4760b57cec5SDimitry Andric traits_type::copy(__nout_, __s, __chunk_size); 4770b57cec5SDimitry Andric __nout_ += __chunk_size; 4780b57cec5SDimitry Andric __s += __chunk_size; 4790b57cec5SDimitry Andric __i += __chunk_size; 4800b57cec5SDimitry Andric } 4810b57cec5SDimitry Andric } 4820b57cec5SDimitry Andric return __i; 4830b57cec5SDimitry Andric} 4840b57cec5SDimitry Andric 4850b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 4860b57cec5SDimitry Andrictypename basic_streambuf<_CharT, _Traits>::int_type 4870b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>::overflow(int_type) 4880b57cec5SDimitry Andric{ 4890b57cec5SDimitry Andric return traits_type::eof(); 4900b57cec5SDimitry Andric} 4910b57cec5SDimitry Andric 49281ad6265SDimitry Andricextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_streambuf<char>; 493bdd1243dSDimitry Andric 494bdd1243dSDimitry Andric#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS 495bdd1243dSDimitry Andricextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_streambuf<wchar_t>; 496bdd1243dSDimitry Andric#endif 4970b57cec5SDimitry Andric 4980b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD 4990b57cec5SDimitry Andric 5000b57cec5SDimitry Andric_LIBCPP_POP_MACROS 5010b57cec5SDimitry Andric 502fe6060f1SDimitry Andric#endif // _LIBCPP_STREAMBUF 503