codekingpro/portable-devtools
114k
1// -*- C++ -*-2//===------------------------- streambuf ----------------------------------===//3//4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.5// See https://llvm.org/LICENSE.txt for license information.6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception7//8//===----------------------------------------------------------------------===//9 10#ifndef _LIBCUDACXX_STEAMBUF11#define _LIBCUDACXX_STEAMBUF12 13/*14 streambuf synopsis15 16namespace std17{18 19template <class charT, class traits = char_traits<charT> >20class basic_streambuf21{22public:23 // types:24 typedef charT char_type;25 typedef traits traits_type;26 typedef typename traits_type::int_type int_type;27 typedef typename traits_type::pos_type pos_type;28 typedef typename traits_type::off_type off_type;29 30 virtual ~basic_streambuf();31 32 // 27.6.2.2.1 locales:33 locale pubimbue(const locale& loc);34 locale getloc() const;35 36 // 27.6.2.2.2 buffer and positioning:37 basic_streambuf* pubsetbuf(char_type* s, streamsize n);38 pos_type pubseekoff(off_type off, ios_base::seekdir way,39 ios_base::openmode which = ios_base::in | ios_base::out);40 pos_type pubseekpos(pos_type sp,41 ios_base::openmode which = ios_base::in | ios_base::out);42 int pubsync();43 44 // Get and put areas:45 // 27.6.2.2.3 Get area:46 streamsize in_avail();47 int_type snextc();48 int_type sbumpc();49 int_type sgetc();50 streamsize sgetn(char_type* s, streamsize n);51 52 // 27.6.2.2.4 Putback:53 int_type sputbackc(char_type c);54 int_type sungetc();55 56 // 27.6.2.2.5 Put area:57 int_type sputc(char_type c);58 streamsize sputn(const char_type* s, streamsize n);59 60protected:61 basic_streambuf();62 basic_streambuf(const basic_streambuf& rhs);63 basic_streambuf& operator=(const basic_streambuf& rhs);64 void swap(basic_streambuf& rhs);65 66 // 27.6.2.3.2 Get area:67 char_type* eback() const;68 char_type* gptr() const;69 char_type* egptr() const;70 void gbump(int n);71 void setg(char_type* gbeg, char_type* gnext, char_type* gend);72 73 // 27.6.2.3.3 Put area:74 char_type* pbase() const;75 char_type* pptr() const;76 char_type* epptr() const;77 void pbump(int n);78 void setp(char_type* pbeg, char_type* pend);79 80 // 27.6.2.4 virtual functions:81 // 27.6.2.4.1 Locales:82 virtual void imbue(const locale& loc);83 84 // 27.6.2.4.2 Buffer management and positioning:85 virtual basic_streambuf* setbuf(char_type* s, streamsize n);86 virtual pos_type seekoff(off_type off, ios_base::seekdir way,87 ios_base::openmode which = ios_base::in | ios_base::out);88 virtual pos_type seekpos(pos_type sp,89 ios_base::openmode which = ios_base::in | ios_base::out);90 virtual int sync();91 92 // 27.6.2.4.3 Get area:93 virtual streamsize showmanyc();94 virtual streamsize xsgetn(char_type* s, streamsize n);95 virtual int_type underflow();96 virtual int_type uflow();97 98 // 27.6.2.4.4 Putback:99 virtual int_type pbackfail(int_type c = traits_type::eof());100 101 // 27.6.2.4.5 Put area:102 virtual streamsize xsputn(const char_type* s, streamsize n);103 virtual int_type overflow (int_type c = traits_type::eof());104};105 106} // std107 108*/109 110#include <__config>111#include <iosfwd>112#include <ios>113 114#if defined(_CCCL_IMPLICIT_SYSTEM_HEADER_GCC)115# pragma GCC system_header116#elif defined(_CCCL_IMPLICIT_SYSTEM_HEADER_CLANG)117# pragma clang system_header118#elif defined(_CCCL_IMPLICIT_SYSTEM_HEADER_MSVC)119# pragma system_header120#endif // no system header121 122_LIBCUDACXX_PUSH_MACROS123#include <__undef_macros>124 125_LIBCUDACXX_BEGIN_NAMESPACE_STD126 127template <class _CharT, class _Traits>128class _LIBCUDACXX_TEMPLATE_VIS basic_streambuf129{130public:131 // types:132 typedef _CharT char_type;133 typedef _Traits traits_type;134 typedef typename traits_type::int_type int_type;135 typedef typename traits_type::pos_type pos_type;136 typedef typename traits_type::off_type off_type;137 138 static_assert((is_same<_CharT, typename traits_type::char_type>::value),139 "traits_type::char_type must be the same type as CharT");140 141 virtual ~basic_streambuf();142 143 // 27.6.2.2.1 locales:144 inline _LIBCUDACXX_HIDE_FROM_ABI_AFTER_V1145 locale pubimbue(const locale& __loc) {146 imbue(__loc);147 locale __r = __loc_;148 __loc_ = __loc;149 return __r;150 }151 152 inline _LIBCUDACXX_HIDE_FROM_ABI_AFTER_V1153 locale getloc() const { return __loc_; }154 155 // 27.6.2.2.2 buffer and positioning:156 inline _LIBCUDACXX_HIDE_FROM_ABI_AFTER_V1157 basic_streambuf* pubsetbuf(char_type* __s, streamsize __n)158 { return setbuf(__s, __n); }159 160 inline _LIBCUDACXX_HIDE_FROM_ABI_AFTER_V1161 pos_type pubseekoff(off_type __off, ios_base::seekdir __way,162 ios_base::openmode __which = ios_base::in | ios_base::out)163 { return seekoff(__off, __way, __which); }164 165 inline _LIBCUDACXX_HIDE_FROM_ABI_AFTER_V1166 pos_type pubseekpos(pos_type __sp,167 ios_base::openmode __which = ios_base::in | ios_base::out)168 { return seekpos(__sp, __which); }169 170 inline _LIBCUDACXX_HIDE_FROM_ABI_AFTER_V1171 int pubsync() { return sync(); }172 173 // Get and put areas:174 // 27.6.2.2.3 Get area:175 inline _LIBCUDACXX_HIDE_FROM_ABI_AFTER_V1176 streamsize in_avail() {177 if (__ninp_ < __einp_)178 return static_cast<streamsize>(__einp_ - __ninp_);179 return showmanyc();180 }181 182 inline _LIBCUDACXX_HIDE_FROM_ABI_AFTER_V1183 int_type snextc() {184 if (sbumpc() == traits_type::eof())185 return traits_type::eof();186 return sgetc();187 }188 189 inline _LIBCUDACXX_HIDE_FROM_ABI_AFTER_V1190 int_type sbumpc() {191 if (__ninp_ == __einp_)192 return uflow();193 return traits_type::to_int_type(*__ninp_++);194 }195 196 inline _LIBCUDACXX_HIDE_FROM_ABI_AFTER_V1197 int_type sgetc() {198 if (__ninp_ == __einp_)199 return underflow();200 return traits_type::to_int_type(*__ninp_);201 }202 203 inline _LIBCUDACXX_HIDE_FROM_ABI_AFTER_V1204 streamsize sgetn(char_type* __s, streamsize __n)205 { return xsgetn(__s, __n); }206 207 // 27.6.2.2.4 Putback:208 inline _LIBCUDACXX_HIDE_FROM_ABI_AFTER_V1209 int_type sputbackc(char_type __c) {210 if (__binp_ == __ninp_ || !traits_type::eq(__c, __ninp_[-1]))211 return pbackfail(traits_type::to_int_type(__c));212 return traits_type::to_int_type(*--__ninp_);213 }214 215 inline _LIBCUDACXX_HIDE_FROM_ABI_AFTER_V1216 int_type sungetc() {217 if (__binp_ == __ninp_)218 return pbackfail();219 return traits_type::to_int_type(*--__ninp_);220 }221 222 // 27.6.2.2.5 Put area:223 inline _LIBCUDACXX_HIDE_FROM_ABI_AFTER_V1224 int_type sputc(char_type __c) {225 if (__nout_ == __eout_)226 return overflow(traits_type::to_int_type(__c));227 *__nout_++ = __c;228 return traits_type::to_int_type(__c);229 }230 231 inline _LIBCUDACXX_HIDE_FROM_ABI_AFTER_V1232 streamsize sputn(const char_type* __s, streamsize __n)233 { return xsputn(__s, __n); }234 235protected:236 basic_streambuf();237 basic_streambuf(const basic_streambuf& __rhs);238 basic_streambuf& operator=(const basic_streambuf& __rhs);239 void swap(basic_streambuf& __rhs);240 241 // 27.6.2.3.2 Get area:242 _LIBCUDACXX_INLINE_VISIBILITY char_type* eback() const {return __binp_;}243 _LIBCUDACXX_INLINE_VISIBILITY char_type* gptr() const {return __ninp_;}244 _LIBCUDACXX_INLINE_VISIBILITY char_type* egptr() const {return __einp_;}245 246 inline _LIBCUDACXX_HIDE_FROM_ABI_AFTER_V1247 void gbump(int __n) { __ninp_ += __n; }248 249 inline _LIBCUDACXX_HIDE_FROM_ABI_AFTER_V1250 void setg(char_type* __gbeg, char_type* __gnext, char_type* __gend) {251 __binp_ = __gbeg;252 __ninp_ = __gnext;253 __einp_ = __gend;254 }255 256 // 27.6.2.3.3 Put area:257 _LIBCUDACXX_INLINE_VISIBILITY char_type* pbase() const {return __bout_;}258 _LIBCUDACXX_INLINE_VISIBILITY char_type* pptr() const {return __nout_;}259 _LIBCUDACXX_INLINE_VISIBILITY char_type* epptr() const {return __eout_;}260 261 inline _LIBCUDACXX_HIDE_FROM_ABI_AFTER_V1262 void pbump(int __n) { __nout_ += __n; }263 264 _LIBCUDACXX_INLINE_VISIBILITY265 void __pbump(streamsize __n) { __nout_ += __n; }266 267 inline _LIBCUDACXX_HIDE_FROM_ABI_AFTER_V1268 void setp(char_type* __pbeg, char_type* __pend) {269 __bout_ = __nout_ = __pbeg;270 __eout_ = __pend;271 }272 273 // 27.6.2.4 virtual functions:274 // 27.6.2.4.1 Locales:275 virtual void imbue(const locale& __loc);276 277 // 27.6.2.4.2 Buffer management and positioning:278 virtual basic_streambuf* setbuf(char_type* __s, streamsize __n);279 virtual pos_type seekoff(off_type __off, ios_base::seekdir __way,280 ios_base::openmode __which = ios_base::in | ios_base::out);281 virtual pos_type seekpos(pos_type __sp,282 ios_base::openmode __which = ios_base::in | ios_base::out);283 virtual int sync();284 285 // 27.6.2.4.3 Get area:286 virtual streamsize showmanyc();287 virtual streamsize xsgetn(char_type* __s, streamsize __n);288 virtual int_type underflow();289 virtual int_type uflow();290 291 // 27.6.2.4.4 Putback:292 virtual int_type pbackfail(int_type __c = traits_type::eof());293 294 // 27.6.2.4.5 Put area:295 virtual streamsize xsputn(const char_type* __s, streamsize __n);296 virtual int_type overflow(int_type __c = traits_type::eof());297 298private:299 locale __loc_;300 char_type* __binp_;301 char_type* __ninp_;302 char_type* __einp_;303 char_type* __bout_;304 char_type* __nout_;305 char_type* __eout_;306};307 308template <class _CharT, class _Traits>309basic_streambuf<_CharT, _Traits>::~basic_streambuf()310{311}312 313template <class _CharT, class _Traits>314basic_streambuf<_CharT, _Traits>::basic_streambuf()315 : __binp_(0),316 __ninp_(0),317 __einp_(0),318 __bout_(0),319 __nout_(0),320 __eout_(0)321{322}323 324template <class _CharT, class _Traits>325basic_streambuf<_CharT, _Traits>::basic_streambuf(const basic_streambuf& __sb)326 : __loc_(__sb.__loc_),327 __binp_(__sb.__binp_),328 __ninp_(__sb.__ninp_),329 __einp_(__sb.__einp_),330 __bout_(__sb.__bout_),331 __nout_(__sb.__nout_),332 __eout_(__sb.__eout_)333{334}335 336template <class _CharT, class _Traits>337basic_streambuf<_CharT, _Traits>&338basic_streambuf<_CharT, _Traits>::operator=(const basic_streambuf& __sb)339{340 __loc_ = __sb.__loc_;341 __binp_ = __sb.__binp_;342 __ninp_ = __sb.__ninp_;343 __einp_ = __sb.__einp_;344 __bout_ = __sb.__bout_;345 __nout_ = __sb.__nout_;346 __eout_ = __sb.__eout_;347 return *this;348}349 350template <class _CharT, class _Traits>351void352basic_streambuf<_CharT, _Traits>::swap(basic_streambuf& __sb)353{354 _CUDA_VSTD::swap(__loc_, __sb.__loc_);355 _CUDA_VSTD::swap(__binp_, __sb.__binp_);356 _CUDA_VSTD::swap(__ninp_, __sb.__ninp_);357 _CUDA_VSTD::swap(__einp_, __sb.__einp_);358 _CUDA_VSTD::swap(__bout_, __sb.__bout_);359 _CUDA_VSTD::swap(__nout_, __sb.__nout_);360 _CUDA_VSTD::swap(__eout_, __sb.__eout_);361}362 363template <class _CharT, class _Traits>364void365basic_streambuf<_CharT, _Traits>::imbue(const locale&)366{367}368 369template <class _CharT, class _Traits>370basic_streambuf<_CharT, _Traits>*371basic_streambuf<_CharT, _Traits>::setbuf(char_type*, streamsize)372{373 return this;374}375 376template <class _CharT, class _Traits>377typename basic_streambuf<_CharT, _Traits>::pos_type378basic_streambuf<_CharT, _Traits>::seekoff(off_type, ios_base::seekdir,379 ios_base::openmode)380{381 return pos_type(off_type(-1));382}383 384template <class _CharT, class _Traits>385typename basic_streambuf<_CharT, _Traits>::pos_type386basic_streambuf<_CharT, _Traits>::seekpos(pos_type, ios_base::openmode)387{388 return pos_type(off_type(-1));389}390 391template <class _CharT, class _Traits>392int393basic_streambuf<_CharT, _Traits>::sync()394{395 return 0;396}397 398template <class _CharT, class _Traits>399streamsize400basic_streambuf<_CharT, _Traits>::showmanyc()401{402 return 0;403}404 405template <class _CharT, class _Traits>406streamsize407basic_streambuf<_CharT, _Traits>::xsgetn(char_type* __s, streamsize __n)408{409 const int_type __eof = traits_type::eof();410 int_type __c;411 streamsize __i = 0;412 while(__i < __n)413 {414 if (__ninp_ < __einp_)415 {416 const streamsize __len = _CUDA_VSTD::min(static_cast<streamsize>(INT_MAX),417 _CUDA_VSTD::min(__einp_ - __ninp_, __n - __i));418 traits_type::copy(__s, __ninp_, __len);419 __s += __len;420 __i += __len;421 this->gbump(__len);422 }423 else if ((__c = uflow()) != __eof)424 {425 *__s = traits_type::to_char_type(__c);426 ++__s;427 ++__i;428 }429 else430 break;431 }432 return __i;433}434 435template <class _CharT, class _Traits>436typename basic_streambuf<_CharT, _Traits>::int_type437basic_streambuf<_CharT, _Traits>::underflow()438{439 return traits_type::eof();440}441 442template <class _CharT, class _Traits>443typename basic_streambuf<_CharT, _Traits>::int_type444basic_streambuf<_CharT, _Traits>::uflow()445{446 if (underflow() == traits_type::eof())447 return traits_type::eof();448 return traits_type::to_int_type(*__ninp_++);449}450 451template <class _CharT, class _Traits>452typename basic_streambuf<_CharT, _Traits>::int_type453basic_streambuf<_CharT, _Traits>::pbackfail(int_type)454{455 return traits_type::eof();456}457 458template <class _CharT, class _Traits>459streamsize460basic_streambuf<_CharT, _Traits>::xsputn(const char_type* __s, streamsize __n)461{462 streamsize __i = 0;463 int_type __eof = traits_type::eof();464 while( __i < __n)465 {466 if (__nout_ >= __eout_)467 {468 if (overflow(traits_type::to_int_type(*__s)) == __eof)469 break;470 ++__s;471 ++__i;472 }473 else474 {475 streamsize __chunk_size = _CUDA_VSTD::min(__eout_ - __nout_, __n - __i);476 traits_type::copy(__nout_, __s, __chunk_size);477 __nout_ += __chunk_size;478 __s += __chunk_size;479 __i += __chunk_size;480 }481 }482 return __i;483}484 485template <class _CharT, class _Traits>486typename basic_streambuf<_CharT, _Traits>::int_type487basic_streambuf<_CharT, _Traits>::overflow(int_type)488{489 return traits_type::eof();490}491 492#ifndef _LIBCUDACXX_DO_NOT_ASSUME_STREAMS_EXPLICIT_INSTANTIATION_IN_DYLIB493_LIBCUDACXX_EXTERN_TEMPLATE(class _LIBCUDACXX_EXTERN_TEMPLATE_TYPE_VIS basic_streambuf<char>)494_LIBCUDACXX_EXTERN_TEMPLATE(class _LIBCUDACXX_EXTERN_TEMPLATE_TYPE_VIS basic_streambuf<wchar_t>)495 496_LIBCUDACXX_EXTERN_TEMPLATE(class _LIBCUDACXX_EXTERN_TEMPLATE_TYPE_VIS basic_ios<char>)497_LIBCUDACXX_EXTERN_TEMPLATE(class _LIBCUDACXX_EXTERN_TEMPLATE_TYPE_VIS basic_ios<wchar_t>)498#endif499 500_LIBCUDACXX_END_NAMESPACE_STD501 502_LIBCUDACXX_POP_MACROS503 504#endif // _LIBCUDACXX_STEAMBUF505 