brintos

brintos / llvm-project-archived public Read only

0
0
Text · 38.6 KiB · 741158a Raw
907 lines · plain
1// -*- C++ -*-2//===----------------------------------------------------------------------===//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 _LIBCPP___CXX03_SSTREAM11#define _LIBCPP___CXX03_SSTREAM12 13// clang-format off14 15/*16    sstream synopsis [sstream.syn]17 18// Class template basic_stringbuf [stringbuf]19template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >20class basic_stringbuf21    : public basic_streambuf<charT, traits>22{23public: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    typedef Allocator                      allocator_type;30 31    // [stringbuf.cons] constructors:32    explicit basic_stringbuf(ios_base::openmode which = ios_base::in | ios_base::out); // before C++2033    basic_stringbuf() : basic_stringbuf(ios_base::in | ios_base::out) {}               // C++2034    explicit basic_stringbuf(ios_base::openmode which);                                // C++2035    explicit basic_stringbuf(const basic_string<char_type, traits_type, allocator_type>& s,36                             ios_base::openmode which = ios_base::in | ios_base::out);37    explicit basic_stringbuf(const allocator_type& a)38        : basic_stringbuf(ios_base::in | ios_base::out, a) {}                          // C++2039    basic_stringbuf(ios_base::openmode which, const allocator_type& a);                // C++2040    explicit basic_stringbuf(basic_string<char_type, traits_type, allocator_type>&& s,41                             ios_base::openmode which = ios_base::in | ios_base::out); // C++2042    template <class SAlloc>43    basic_stringbuf(const basic_string<char_type, traits_type, SAlloc>& s, const allocator_type& a)44        : basic_stringbuf(s, ios_base::in | ios_base::out, a) {}                       // C++2045    template <class SAlloc>46    basic_stringbuf(const basic_string<char_type, traits_type, SAlloc>& s,47                    ios_base::openmode which, const allocator_type& a);                // C++2048    template <class SAlloc>49    explicit basic_stringbuf(const basic_string<char_type, traits_type, SAlloc>& s,50                             ios_base::openmode which = ios_base::in | ios_base::out); // C++2051    template<class T>52      explicit basic_stringbuf(const T& t,53                               ios_base::openmode which = ios_base::in | ios_base::out); // Since C++2654    template<class T>55      basic_stringbuf(const T& t, const Allocator& a);                                   // Since C++2656    template<class T>57      basic_stringbuf(const T& t, ios_base::openmode which, const Allocator& a);         // Since C++2658    basic_stringbuf(const basic_stringbuf&) = delete;59    basic_stringbuf(basic_stringbuf&& rhs);60    basic_stringbuf(basic_stringbuf&& rhs, const allocator_type& a);                   // C++2061 62    // [stringbuf.assign] Assign and swap:63    basic_stringbuf& operator=(const basic_stringbuf&) = delete;64    basic_stringbuf& operator=(basic_stringbuf&& rhs);65    void swap(basic_stringbuf& rhs) noexcept(see below);                               // conditionally noexcept since C++2066 67    // [stringbuf.members] Member functions:68    allocator_type get_allocator() const noexcept;                                     // C++2069    basic_string<char_type, traits_type, allocator_type> str() const;                  // before C++2070    basic_string<char_type, traits_type, allocator_type> str() const &;                // C++2071    template <class SAlloc>72    basic_string<char_type, traits_type, SAlloc> str(const SAlloc& sa) const;          // C++2073    basic_string<char_type, traits_type, allocator_type> str() &&;                     // C++2074    basic_string_view<char_type, traits_type> view() const noexcept;                   // C++2075    void str(const basic_string<char_type, traits_type, allocator_type>& s);76    template <class SAlloc>77    void str(const basic_string<char_type, traits_type, SAlloc>& s);                   // C++2078    void str(basic_string<char_type, traits_type, allocator_type>&& s);                // C++2079    template<class T>80      void str(const T& t);                                                            // Since C++2681 82protected:83    // [stringbuf.virtuals] Overridden virtual functions:84    virtual int_type underflow();85    virtual int_type pbackfail(int_type c = traits_type::eof());86    virtual int_type overflow (int_type c = traits_type::eof());87    virtual basic_streambuf<char_type, traits_type>* setbuf(char_type*, streamsize);88    virtual pos_type seekoff(off_type off, ios_base::seekdir way,89                             ios_base::openmode which = ios_base::in | ios_base::out);90    virtual pos_type seekpos(pos_type sp,91                             ios_base::openmode which = ios_base::in | ios_base::out);92};93 94// [stringbuf.assign] non member swap95template <class charT, class traits, class Allocator>96void swap(basic_stringbuf<charT, traits, Allocator>& x,97          basic_stringbuf<charT, traits, Allocator>& y); // conditionally noexcept since C++2098 99typedef basic_stringbuf<char>    stringbuf;100typedef basic_stringbuf<wchar_t> wstringbuf;101 102// Class template basic_istringstream [istringstream]103template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >104class basic_istringstream105    : public basic_istream<charT, traits>106{107public:108    typedef charT                          char_type;109    typedef traits                         traits_type;110    typedef typename traits_type::int_type int_type;111    typedef typename traits_type::pos_type pos_type;112    typedef typename traits_type::off_type off_type;113    typedef Allocator                      allocator_type;114 115    // [istringstream.cons] Constructors:116    explicit basic_istringstream(ios_base::openmode which = ios_base::in);             // before C++20117    basic_istringstream() : basic_istringstream(ios_base::in) {}                       // C++20118    explicit basic_istringstream(ios_base::openmode which);                            // C++20119    explicit basic_istringstream(const basic_string<char_type, traits_type, allocator_type>& s,120                                 ios_base::openmode which = ios_base::in);121    basic_istringstream(ios_base::openmode which, const allocator_type& a);            // C++20122    explicit basic_istringstream(basic_string<char_type, traits_type, allocator_type>&& s,123                                 ios_base::openmode which = ios_base::in);             // C++20124    template <class SAlloc>125    basic_istringstream(const basic_string<char_type, traits_type, SAlloc>& s, const allocator_type& a)126        : basic_istringstream(s, ios_base::in, a) {}                                   // C++20127    template <class SAlloc>128    basic_istringstream(const basic_string<char_type, traits_type, SAlloc>& s,129                        ios_base::openmode which, const allocator_type& a);            // C++20130    template <class SAlloc>131    explicit basic_istringstream(const basic_string<char_type, traits_type, SAlloc>& s,132                                 ios_base::openmode which = ios_base::in);             // C++20133    template<class T>134      explicit basic_istringstream(const T& t, ios_base::openmode which = ios_base::in); // Since C++26135    template<class T>136      basic_istringstream(const T& t, const Allocator& a);                               // Since C++26137    template<class T>138      basic_istringstream(const T& t, ios_base::openmode which, const Allocator& a);     // Since C++26139    basic_istringstream(const basic_istringstream&) = delete;140    basic_istringstream(basic_istringstream&& rhs);141 142    // [istringstream.assign] Assign and swap:143    basic_istringstream& operator=(const basic_istringstream&) = delete;144    basic_istringstream& operator=(basic_istringstream&& rhs);145    void swap(basic_istringstream& rhs);146 147    // [istringstream.members] Member functions:148    basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const;149    basic_string<char_type, traits_type, allocator_type> str() const;                  // before C++20150    basic_string<char_type, traits_type, allocator_type> str() const &;                // C++20151    template <class SAlloc>152    basic_string<char_type, traits_type, SAlloc> str(const SAlloc& sa) const;          // C++20153    basic_string<char_type, traits_type, allocator_type> str() &&;                     // C++20154    basic_string_view<char_type, traits_type> view() const noexcept;                   // C++20155    void str(const basic_string<char_type, traits_type, allocator_type>& s);156    template <class SAlloc>157    void str(const basic_string<char_type, traits_type, SAlloc>& s);                   // C++20158    void str(basic_string<char_type, traits_type, allocator_type>&& s);                // C++20159    template<class T>160      void str(const T& t);                                                            // Since C++26161};162 163template <class charT, class traits, class Allocator>164void swap(basic_istringstream<charT, traits, Allocator>& x,165          basic_istringstream<charT, traits, Allocator>& y);166 167typedef basic_istringstream<char>    istringstream;168typedef basic_istringstream<wchar_t> wistringstream;169 170// Class template basic_ostringstream [ostringstream]171template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >172class basic_ostringstream173    : public basic_ostream<charT, traits>174{175public:176    // types:177    typedef charT                          char_type;178    typedef traits                         traits_type;179    typedef typename traits_type::int_type int_type;180    typedef typename traits_type::pos_type pos_type;181    typedef typename traits_type::off_type off_type;182    typedef Allocator                      allocator_type;183 184    // [ostringstream.cons] Constructors:185    explicit basic_ostringstream(ios_base::openmode which = ios_base::out);            // before C++20186    basic_ostringstream() : basic_ostringstream(ios_base::out) {}                      // C++20187    explicit basic_ostringstream(ios_base::openmode which);                            // C++20188    explicit basic_ostringstream(const basic_string<char_type, traits_type, allocator_type>& s,189                                 ios_base::openmode which = ios_base::out);190    basic_ostringstream(ios_base::openmode which, const allocator_type& a);            // C++20191    explicit basic_ostringstream(basic_string<char_type, traits_type, allocator_type>&& s,192                                 ios_base::openmode which = ios_base::out);            // C++20193    template <class SAlloc>194    basic_ostringstream(const basic_string<char_type, traits_type, SAlloc>& s, const allocator_type& a)195        : basic_ostringstream(s, ios_base::out, a) {}                                  // C++20196    template <class SAlloc>197    basic_ostringstream(const basic_string<char_type, traits_type, SAlloc>& s,198                        ios_base::openmode which, const allocator_type& a);            // C++20199    template <class SAlloc>200    explicit basic_ostringstream(const basic_string<char_type, traits_type, SAlloc>& s,201                                 ios_base::openmode which = ios_base::out);            // C++20202    template<class T>203      explicit basic_ostringstream(const T& t, ios_base::openmode which = ios_base::out); // Since C++26204    template<class T>205      basic_ostringstream(const T& t, const Allocator& a);                                // Since C++26206    template<class T>207      basic_ostringstream(const T& t, ios_base::openmode which, const Allocator& a);      // Since C++26208    basic_ostringstream(const basic_ostringstream&) = delete;209    basic_ostringstream(basic_ostringstream&& rhs);210 211    // [ostringstream.assign] Assign and swap:212    basic_ostringstream& operator=(const basic_ostringstream&) = delete;213    basic_ostringstream& operator=(basic_ostringstream&& rhs);214    void swap(basic_ostringstream& rhs);215 216    // [ostringstream.members] Member functions:217    basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const;218    basic_string<char_type, traits_type, allocator_type> str() const;                  // before C++20219    basic_string<char_type, traits_type, allocator_type> str() const &;                // C++20220    template <class SAlloc>221    basic_string<char_type, traits_type, SAlloc> str(const SAlloc& sa) const;          // C++20222    basic_string<char_type, traits_type, allocator_type> str() &&;                     // C++20223    basic_string_view<char_type, traits_type> view() const noexcept;                   // C++20224    void str(const basic_string<char_type, traits_type, allocator_type>& s);225    template <class SAlloc>226    void str(const basic_string<char_type, traits_type, SAlloc>& s);                   // C++20227    void str(basic_string<char_type, traits_type, allocator_type>&& s);                // C++20228    template<class T>229      void str(const T& t);                                                            // Since C++26230};231 232template <class charT, class traits, class Allocator>233void swap(basic_ostringstream<charT, traits, Allocator>& x,234          basic_ostringstream<charT, traits, Allocator>& y);235 236typedef basic_ostringstream<char>    ostringstream;237typedef basic_ostringstream<wchar_t> wostringstream;238 239// Class template basic_stringstream [stringstream]240template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >241class basic_stringstream242    : public basic_iostream<charT, traits>243{244public:245    // types:246    typedef charT                          char_type;247    typedef traits                         traits_type;248    typedef typename traits_type::int_type int_type;249    typedef typename traits_type::pos_type pos_type;250    typedef typename traits_type::off_type off_type;251    typedef Allocator                      allocator_type;252 253    // [stringstream.cons] constructors254    explicit basic_stringstream(ios_base::openmode which = ios_base::out | ios_base::in); // before C++20255    basic_stringstream() : basic_stringstream(ios_base::out | ios_base::in) {}            // C++20256    explicit basic_stringstream(ios_base::openmode which);                                // C++20257    explicit basic_stringstream(const basic_string<char_type, traits_type, allocator_type>& s,258                                ios_base::openmode which = ios_base::out | ios_base::in);259    basic_stringstream(ios_base::openmode which, const allocator_type& a);                // C++20260    explicit basic_stringstream(basic_string<char_type, traits_type, allocator_type>&& s,261                                ios_base::openmode which = ios_base::out | ios_base::in); // C++20262    template <class SAlloc>263    basic_stringstream(const basic_string<char_type, traits_type, SAlloc>& s, const allocator_type& a)264        : basic_stringstream(s, ios_base::out | ios_base::in, a) {}                       // C++20265    template <class SAlloc>266    basic_stringstream(const basic_string<char_type, traits_type, SAlloc>& s,267                       ios_base::openmode which, const allocator_type& a);                // C++20268    template <class SAlloc>269    explicit basic_stringstream(const basic_string<char_type, traits_type, SAlloc>& s,270                                ios_base::openmode which = ios_base::out | ios_base::in); // C++20271    template<class T>272      explicit basic_stringstream(const T& t,273                                  ios_base::openmode which = ios_base::out | ios_base::in); // Since C++26274    template<class T>275      basic_stringstream(const T& t, const Allocator& a);                                   // Since C++26276    template<class T>277      basic_stringstream(const T& t, ios_base::openmode which, const Allocator& a);         // Since C++26278    basic_stringstream(const basic_stringstream&) = delete;279    basic_stringstream(basic_stringstream&& rhs);280 281    // [stringstream.assign] Assign and swap:282    basic_stringstream& operator=(const basic_stringstream&) = delete;283    basic_stringstream& operator=(basic_stringstream&& rhs);284    void swap(basic_stringstream& rhs);285 286    // [stringstream.members] Member functions:287    basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const;288    basic_string<char_type, traits_type, allocator_type> str() const;                     // before C++20289    basic_string<char_type, traits_type, allocator_type> str() const &;                   // C++20290    template <class SAlloc>291    basic_string<char_type, traits_type, SAlloc> str(const SAlloc& sa) const;             // C++20292    basic_string<char_type, traits_type, allocator_type> str() &&;                        // C++20293    basic_string_view<char_type, traits_type> view() const noexcept;                      // C++20294    void str(const basic_string<char_type, traits_type, allocator_type>& s);295    template <class SAlloc>296    void str(const basic_string<char_type, traits_type, SAlloc>& s);                      // C++20297    void str(basic_string<char_type, traits_type, allocator_type>&& s);                   // C++20298    template<class T>299      void str(const T& t);                                                               // Since C++26300};301 302template <class charT, class traits, class Allocator>303void swap(basic_stringstream<charT, traits, Allocator>& x,304          basic_stringstream<charT, traits, Allocator>& y);305 306typedef basic_stringstream<char>    stringstream;307typedef basic_stringstream<wchar_t> wstringstream;308 309}  // std310 311*/312 313// clang-format on314 315#include <__cxx03/__config>316#include <__cxx03/__fwd/sstream.h>317#include <__cxx03/__ostream/basic_ostream.h>318#include <__cxx03/__type_traits/is_convertible.h>319#include <__cxx03/__utility/swap.h>320#include <__cxx03/istream>321#include <__cxx03/string>322#include <__cxx03/string_view>323#include <__cxx03/version>324 325#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)326#  pragma GCC system_header327#endif328 329_LIBCPP_PUSH_MACROS330#include <__cxx03/__undef_macros>331 332_LIBCPP_BEGIN_NAMESPACE_STD333 334// Class template basic_stringbuf [stringbuf]335 336template <class _CharT, class _Traits, class _Allocator>337class _LIBCPP_TEMPLATE_VIS basic_stringbuf : public basic_streambuf<_CharT, _Traits> {338public:339  typedef _CharT char_type;340  typedef _Traits traits_type;341  typedef typename traits_type::int_type int_type;342  typedef typename traits_type::pos_type pos_type;343  typedef typename traits_type::off_type off_type;344  typedef _Allocator allocator_type;345 346  typedef basic_string<char_type, traits_type, allocator_type> string_type;347 348private:349  string_type __str_;350  mutable char_type* __hm_;351  ios_base::openmode __mode_;352  _LIBCPP_HIDE_FROM_ABI void __init_buf_ptrs();353  _LIBCPP_HIDE_FROM_ABI void __move_init(basic_stringbuf&& __rhs);354 355public:356  // [stringbuf.cons] constructors:357  _LIBCPP_HIDE_FROM_ABI basic_stringbuf() : __hm_(nullptr), __mode_(ios_base::in | ios_base::out) {358    // it is implementation-defined whether we initialize eback() & friends to nullptr, and libc++ doesn't359    __init_buf_ptrs();360  }361 362  _LIBCPP_HIDE_FROM_ABI explicit basic_stringbuf(ios_base::openmode __wch) : __hm_(nullptr), __mode_(__wch) {363    // it is implementation-defined whether we initialize eback() & friends to nullptr, and libc++ doesn't364    __init_buf_ptrs();365  }366 367  _LIBCPP_HIDE_FROM_ABI explicit basic_stringbuf(const string_type& __s,368                                                 ios_base::openmode __wch = ios_base::in | ios_base::out)369      : __str_(__s.get_allocator()), __hm_(nullptr), __mode_(__wch) {370    str(__s);371  }372 373  basic_stringbuf(const basic_stringbuf&) = delete;374  basic_stringbuf(basic_stringbuf&& __rhs) : __mode_(__rhs.__mode_) { __move_init(std::move(__rhs)); }375 376  // [stringbuf.assign] Assign and swap:377  basic_stringbuf& operator=(const basic_stringbuf&) = delete;378  basic_stringbuf& operator=(basic_stringbuf&& __rhs);379  void swap(basic_stringbuf& __rhs);380 381  // [stringbuf.members] Member functions:382 383  string_type str() const;384 385  void str(const string_type& __s) {386    __str_ = __s;387    __init_buf_ptrs();388  }389 390protected:391  // [stringbuf.virtuals] Overridden virtual functions:392  int_type underflow() override;393  int_type pbackfail(int_type __c = traits_type::eof()) override;394  int_type overflow(int_type __c = traits_type::eof()) override;395  pos_type396  seekoff(off_type __off, ios_base::seekdir __way, ios_base::openmode __wch = ios_base::in | ios_base::out) override;397  _LIBCPP_HIDE_FROM_ABI_VIRTUAL398  pos_type seekpos(pos_type __sp, ios_base::openmode __wch = ios_base::in | ios_base::out) override {399    return seekoff(__sp, ios_base::beg, __wch);400  }401};402 403template <class _CharT, class _Traits, class _Allocator>404_LIBCPP_HIDE_FROM_ABI void basic_stringbuf<_CharT, _Traits, _Allocator>::__move_init(basic_stringbuf&& __rhs) {405  char_type* __p   = const_cast<char_type*>(__rhs.__str_.data());406  ptrdiff_t __binp = -1;407  ptrdiff_t __ninp = -1;408  ptrdiff_t __einp = -1;409  if (__rhs.eback() != nullptr) {410    __binp = __rhs.eback() - __p;411    __ninp = __rhs.gptr() - __p;412    __einp = __rhs.egptr() - __p;413  }414  ptrdiff_t __bout = -1;415  ptrdiff_t __nout = -1;416  ptrdiff_t __eout = -1;417  if (__rhs.pbase() != nullptr) {418    __bout = __rhs.pbase() - __p;419    __nout = __rhs.pptr() - __p;420    __eout = __rhs.epptr() - __p;421  }422  ptrdiff_t __hm = __rhs.__hm_ == nullptr ? -1 : __rhs.__hm_ - __p;423  __str_         = std::move(__rhs.__str_);424  __p            = const_cast<char_type*>(__str_.data());425  if (__binp != -1)426    this->setg(__p + __binp, __p + __ninp, __p + __einp);427  if (__bout != -1) {428    this->setp(__p + __bout, __p + __eout);429    this->__pbump(__nout);430  }431  __hm_ = __hm == -1 ? nullptr : __p + __hm;432  __p   = const_cast<char_type*>(__rhs.__str_.data());433  __rhs.setg(__p, __p, __p);434  __rhs.setp(__p, __p);435  __rhs.__hm_ = __p;436  this->pubimbue(__rhs.getloc());437}438 439template <class _CharT, class _Traits, class _Allocator>440basic_stringbuf<_CharT, _Traits, _Allocator>&441basic_stringbuf<_CharT, _Traits, _Allocator>::operator=(basic_stringbuf&& __rhs) {442  char_type* __p   = const_cast<char_type*>(__rhs.__str_.data());443  ptrdiff_t __binp = -1;444  ptrdiff_t __ninp = -1;445  ptrdiff_t __einp = -1;446  if (__rhs.eback() != nullptr) {447    __binp = __rhs.eback() - __p;448    __ninp = __rhs.gptr() - __p;449    __einp = __rhs.egptr() - __p;450  }451  ptrdiff_t __bout = -1;452  ptrdiff_t __nout = -1;453  ptrdiff_t __eout = -1;454  if (__rhs.pbase() != nullptr) {455    __bout = __rhs.pbase() - __p;456    __nout = __rhs.pptr() - __p;457    __eout = __rhs.epptr() - __p;458  }459  ptrdiff_t __hm = __rhs.__hm_ == nullptr ? -1 : __rhs.__hm_ - __p;460  __str_         = std::move(__rhs.__str_);461  __p            = const_cast<char_type*>(__str_.data());462  if (__binp != -1)463    this->setg(__p + __binp, __p + __ninp, __p + __einp);464  else465    this->setg(nullptr, nullptr, nullptr);466  if (__bout != -1) {467    this->setp(__p + __bout, __p + __eout);468    this->__pbump(__nout);469  } else470    this->setp(nullptr, nullptr);471 472  __hm_   = __hm == -1 ? nullptr : __p + __hm;473  __mode_ = __rhs.__mode_;474  __p     = const_cast<char_type*>(__rhs.__str_.data());475  __rhs.setg(__p, __p, __p);476  __rhs.setp(__p, __p);477  __rhs.__hm_ = __p;478  this->pubimbue(__rhs.getloc());479  return *this;480}481 482template <class _CharT, class _Traits, class _Allocator>483void basic_stringbuf<_CharT, _Traits, _Allocator>::swap(basic_stringbuf& __rhs) {484  char_type* __p    = const_cast<char_type*>(__rhs.__str_.data());485  ptrdiff_t __rbinp = -1;486  ptrdiff_t __rninp = -1;487  ptrdiff_t __reinp = -1;488  if (__rhs.eback() != nullptr) {489    __rbinp = __rhs.eback() - __p;490    __rninp = __rhs.gptr() - __p;491    __reinp = __rhs.egptr() - __p;492  }493  ptrdiff_t __rbout = -1;494  ptrdiff_t __rnout = -1;495  ptrdiff_t __reout = -1;496  if (__rhs.pbase() != nullptr) {497    __rbout = __rhs.pbase() - __p;498    __rnout = __rhs.pptr() - __p;499    __reout = __rhs.epptr() - __p;500  }501  ptrdiff_t __rhm   = __rhs.__hm_ == nullptr ? -1 : __rhs.__hm_ - __p;502  __p               = const_cast<char_type*>(__str_.data());503  ptrdiff_t __lbinp = -1;504  ptrdiff_t __lninp = -1;505  ptrdiff_t __leinp = -1;506  if (this->eback() != nullptr) {507    __lbinp = this->eback() - __p;508    __lninp = this->gptr() - __p;509    __leinp = this->egptr() - __p;510  }511  ptrdiff_t __lbout = -1;512  ptrdiff_t __lnout = -1;513  ptrdiff_t __leout = -1;514  if (this->pbase() != nullptr) {515    __lbout = this->pbase() - __p;516    __lnout = this->pptr() - __p;517    __leout = this->epptr() - __p;518  }519  ptrdiff_t __lhm = __hm_ == nullptr ? -1 : __hm_ - __p;520  std::swap(__mode_, __rhs.__mode_);521  __str_.swap(__rhs.__str_);522  __p = const_cast<char_type*>(__str_.data());523  if (__rbinp != -1)524    this->setg(__p + __rbinp, __p + __rninp, __p + __reinp);525  else526    this->setg(nullptr, nullptr, nullptr);527  if (__rbout != -1) {528    this->setp(__p + __rbout, __p + __reout);529    this->__pbump(__rnout);530  } else531    this->setp(nullptr, nullptr);532  __hm_ = __rhm == -1 ? nullptr : __p + __rhm;533  __p   = const_cast<char_type*>(__rhs.__str_.data());534  if (__lbinp != -1)535    __rhs.setg(__p + __lbinp, __p + __lninp, __p + __leinp);536  else537    __rhs.setg(nullptr, nullptr, nullptr);538  if (__lbout != -1) {539    __rhs.setp(__p + __lbout, __p + __leout);540    __rhs.__pbump(__lnout);541  } else542    __rhs.setp(nullptr, nullptr);543  __rhs.__hm_ = __lhm == -1 ? nullptr : __p + __lhm;544  locale __tl = __rhs.getloc();545  __rhs.pubimbue(this->getloc());546  this->pubimbue(__tl);547}548 549template <class _CharT, class _Traits, class _Allocator>550inline _LIBCPP_HIDE_FROM_ABI void551swap(basic_stringbuf<_CharT, _Traits, _Allocator>& __x, basic_stringbuf<_CharT, _Traits, _Allocator>& __y) {552  __x.swap(__y);553}554 555template <class _CharT, class _Traits, class _Allocator>556basic_string<_CharT, _Traits, _Allocator> basic_stringbuf<_CharT, _Traits, _Allocator>::str() const {557  if (__mode_ & ios_base::out) {558    if (__hm_ < this->pptr())559      __hm_ = this->pptr();560    return string_type(this->pbase(), __hm_, __str_.get_allocator());561  } else if (__mode_ & ios_base::in)562    return string_type(this->eback(), this->egptr(), __str_.get_allocator());563  return string_type(__str_.get_allocator());564}565 566template <class _CharT, class _Traits, class _Allocator>567_LIBCPP_HIDE_FROM_ABI void basic_stringbuf<_CharT, _Traits, _Allocator>::__init_buf_ptrs() {568  __hm_                                = nullptr;569  char_type* __data                    = const_cast<char_type*>(__str_.data());570  typename string_type::size_type __sz = __str_.size();571  if (__mode_ & ios_base::in) {572    __hm_ = __data + __sz;573    this->setg(__data, __data, __hm_);574  }575  if (__mode_ & ios_base::out) {576    __hm_ = __data + __sz;577    __str_.resize(__str_.capacity());578    this->setp(__data, __data + __str_.size());579    if (__mode_ & (ios_base::app | ios_base::ate)) {580      while (__sz > INT_MAX) {581        this->pbump(INT_MAX);582        __sz -= INT_MAX;583      }584      if (__sz > 0)585        this->pbump(__sz);586    }587  }588}589 590template <class _CharT, class _Traits, class _Allocator>591typename basic_stringbuf<_CharT, _Traits, _Allocator>::int_type592basic_stringbuf<_CharT, _Traits, _Allocator>::underflow() {593  if (__hm_ < this->pptr())594    __hm_ = this->pptr();595  if (__mode_ & ios_base::in) {596    if (this->egptr() < __hm_)597      this->setg(this->eback(), this->gptr(), __hm_);598    if (this->gptr() < this->egptr())599      return traits_type::to_int_type(*this->gptr());600  }601  return traits_type::eof();602}603 604template <class _CharT, class _Traits, class _Allocator>605typename basic_stringbuf<_CharT, _Traits, _Allocator>::int_type606basic_stringbuf<_CharT, _Traits, _Allocator>::pbackfail(int_type __c) {607  if (__hm_ < this->pptr())608    __hm_ = this->pptr();609  if (this->eback() < this->gptr()) {610    if (traits_type::eq_int_type(__c, traits_type::eof())) {611      this->setg(this->eback(), this->gptr() - 1, __hm_);612      return traits_type::not_eof(__c);613    }614    if ((__mode_ & ios_base::out) || traits_type::eq(traits_type::to_char_type(__c), this->gptr()[-1])) {615      this->setg(this->eback(), this->gptr() - 1, __hm_);616      *this->gptr() = traits_type::to_char_type(__c);617      return __c;618    }619  }620  return traits_type::eof();621}622 623template <class _CharT, class _Traits, class _Allocator>624typename basic_stringbuf<_CharT, _Traits, _Allocator>::int_type625basic_stringbuf<_CharT, _Traits, _Allocator>::overflow(int_type __c) {626  if (!traits_type::eq_int_type(__c, traits_type::eof())) {627    ptrdiff_t __ninp = this->gptr() - this->eback();628    if (this->pptr() == this->epptr()) {629      if (!(__mode_ & ios_base::out))630        return traits_type::eof();631#ifndef _LIBCPP_HAS_NO_EXCEPTIONS632      try {633#endif // _LIBCPP_HAS_NO_EXCEPTIONS634        ptrdiff_t __nout = this->pptr() - this->pbase();635        ptrdiff_t __hm   = __hm_ - this->pbase();636        __str_.push_back(char_type());637        __str_.resize(__str_.capacity());638        char_type* __p = const_cast<char_type*>(__str_.data());639        this->setp(__p, __p + __str_.size());640        this->__pbump(__nout);641        __hm_ = this->pbase() + __hm;642#ifndef _LIBCPP_HAS_NO_EXCEPTIONS643      } catch (...) {644        return traits_type::eof();645      }646#endif // _LIBCPP_HAS_NO_EXCEPTIONS647    }648    __hm_ = std::max(this->pptr() + 1, __hm_);649    if (__mode_ & ios_base::in) {650      char_type* __p = const_cast<char_type*>(__str_.data());651      this->setg(__p, __p + __ninp, __hm_);652    }653    return this->sputc(traits_type::to_char_type(__c));654  }655  return traits_type::not_eof(__c);656}657 658template <class _CharT, class _Traits, class _Allocator>659typename basic_stringbuf<_CharT, _Traits, _Allocator>::pos_type basic_stringbuf<_CharT, _Traits, _Allocator>::seekoff(660    off_type __off, ios_base::seekdir __way, ios_base::openmode __wch) {661  if (__hm_ < this->pptr())662    __hm_ = this->pptr();663  if ((__wch & (ios_base::in | ios_base::out)) == 0)664    return pos_type(-1);665  if ((__wch & (ios_base::in | ios_base::out)) == (ios_base::in | ios_base::out) && __way == ios_base::cur)666    return pos_type(-1);667  const ptrdiff_t __hm = __hm_ == nullptr ? 0 : __hm_ - __str_.data();668  off_type __noff;669  switch (__way) {670  case ios_base::beg:671    __noff = 0;672    break;673  case ios_base::cur:674    if (__wch & ios_base::in)675      __noff = this->gptr() - this->eback();676    else677      __noff = this->pptr() - this->pbase();678    break;679  case ios_base::end:680    __noff = __hm;681    break;682  default:683    return pos_type(-1);684  }685  __noff += __off;686  if (__noff < 0 || __hm < __noff)687    return pos_type(-1);688  if (__noff != 0) {689    if ((__wch & ios_base::in) && this->gptr() == nullptr)690      return pos_type(-1);691    if ((__wch & ios_base::out) && this->pptr() == nullptr)692      return pos_type(-1);693  }694  if (__wch & ios_base::in)695    this->setg(this->eback(), this->eback() + __noff, __hm_);696  if (__wch & ios_base::out) {697    this->setp(this->pbase(), this->epptr());698    this->__pbump(__noff);699  }700  return pos_type(__noff);701}702 703// Class template basic_istringstream [istringstream]704 705template <class _CharT, class _Traits, class _Allocator>706class _LIBCPP_TEMPLATE_VIS basic_istringstream : public basic_istream<_CharT, _Traits> {707public:708  typedef _CharT char_type;709  typedef _Traits traits_type;710  typedef typename traits_type::int_type int_type;711  typedef typename traits_type::pos_type pos_type;712  typedef typename traits_type::off_type off_type;713  typedef _Allocator allocator_type;714 715  typedef basic_string<char_type, traits_type, allocator_type> string_type;716 717private:718  basic_stringbuf<char_type, traits_type, allocator_type> __sb_;719 720public:721  // [istringstream.cons] Constructors:722  _LIBCPP_HIDE_FROM_ABI basic_istringstream()723      : basic_istream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(ios_base::in) {}724 725  _LIBCPP_HIDE_FROM_ABI explicit basic_istringstream(ios_base::openmode __wch)726      : basic_istream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__wch | ios_base::in) {}727 728  _LIBCPP_HIDE_FROM_ABI explicit basic_istringstream(const string_type& __s, ios_base::openmode __wch = ios_base::in)729      : basic_istream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__s, __wch | ios_base::in) {}730 731  basic_istringstream(const basic_istringstream&) = delete;732  _LIBCPP_HIDE_FROM_ABI basic_istringstream(basic_istringstream&& __rhs)733      : basic_istream<_CharT, _Traits>(std::move(__rhs)), __sb_(std::move(__rhs.__sb_)) {734    basic_istream<_CharT, _Traits>::set_rdbuf(std::addressof(__sb_));735  }736 737  // [istringstream.assign] Assign and swap:738  basic_istringstream& operator=(const basic_istringstream&) = delete;739  basic_istringstream& operator=(basic_istringstream&& __rhs) {740    basic_istream<char_type, traits_type>::operator=(std::move(__rhs));741    __sb_ = std::move(__rhs.__sb_);742    return *this;743  }744  _LIBCPP_HIDE_FROM_ABI void swap(basic_istringstream& __rhs) {745    basic_istream<char_type, traits_type>::swap(__rhs);746    __sb_.swap(__rhs.__sb_);747  }748 749  // [istringstream.members] Member functions:750  _LIBCPP_HIDE_FROM_ABI basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const {751    return const_cast<basic_stringbuf<char_type, traits_type, allocator_type>*>(std::addressof(__sb_));752  }753 754  _LIBCPP_HIDE_FROM_ABI string_type str() const { return __sb_.str(); }755 756  _LIBCPP_HIDE_FROM_ABI void str(const string_type& __s) { __sb_.str(__s); }757};758 759template <class _CharT, class _Traits, class _Allocator>760inline _LIBCPP_HIDE_FROM_ABI void761swap(basic_istringstream<_CharT, _Traits, _Allocator>& __x, basic_istringstream<_CharT, _Traits, _Allocator>& __y) {762  __x.swap(__y);763}764 765// Class template basic_ostringstream [ostringstream]766 767template <class _CharT, class _Traits, class _Allocator>768class _LIBCPP_TEMPLATE_VIS basic_ostringstream : public basic_ostream<_CharT, _Traits> {769public:770  typedef _CharT char_type;771  typedef _Traits traits_type;772  typedef typename traits_type::int_type int_type;773  typedef typename traits_type::pos_type pos_type;774  typedef typename traits_type::off_type off_type;775  typedef _Allocator allocator_type;776 777  typedef basic_string<char_type, traits_type, allocator_type> string_type;778 779private:780  basic_stringbuf<char_type, traits_type, allocator_type> __sb_;781 782public:783  // [ostringstream.cons] Constructors:784  _LIBCPP_HIDE_FROM_ABI basic_ostringstream()785      : basic_ostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(ios_base::out) {}786 787  _LIBCPP_HIDE_FROM_ABI explicit basic_ostringstream(ios_base::openmode __wch)788      : basic_ostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__wch | ios_base::out) {}789 790  _LIBCPP_HIDE_FROM_ABI explicit basic_ostringstream(const string_type& __s, ios_base::openmode __wch = ios_base::out)791      : basic_ostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__s, __wch | ios_base::out) {}792 793  basic_ostringstream(const basic_ostringstream&) = delete;794  _LIBCPP_HIDE_FROM_ABI basic_ostringstream(basic_ostringstream&& __rhs)795      : basic_ostream<_CharT, _Traits>(std::move(__rhs)), __sb_(std::move(__rhs.__sb_)) {796    basic_ostream<_CharT, _Traits>::set_rdbuf(std::addressof(__sb_));797  }798 799  // [ostringstream.assign] Assign and swap:800  basic_ostringstream& operator=(const basic_ostringstream&) = delete;801  basic_ostringstream& operator=(basic_ostringstream&& __rhs) {802    basic_ostream<char_type, traits_type>::operator=(std::move(__rhs));803    __sb_ = std::move(__rhs.__sb_);804    return *this;805  }806 807  _LIBCPP_HIDE_FROM_ABI void swap(basic_ostringstream& __rhs) {808    basic_ostream<char_type, traits_type>::swap(__rhs);809    __sb_.swap(__rhs.__sb_);810  }811 812  // [ostringstream.members] Member functions:813  _LIBCPP_HIDE_FROM_ABI basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const {814    return const_cast<basic_stringbuf<char_type, traits_type, allocator_type>*>(std::addressof(__sb_));815  }816 817  _LIBCPP_HIDE_FROM_ABI string_type str() const { return __sb_.str(); }818  _LIBCPP_HIDE_FROM_ABI void str(const string_type& __s) { __sb_.str(__s); }819};820 821template <class _CharT, class _Traits, class _Allocator>822inline _LIBCPP_HIDE_FROM_ABI void823swap(basic_ostringstream<_CharT, _Traits, _Allocator>& __x, basic_ostringstream<_CharT, _Traits, _Allocator>& __y) {824  __x.swap(__y);825}826 827// Class template basic_stringstream [stringstream]828 829template <class _CharT, class _Traits, class _Allocator>830class _LIBCPP_TEMPLATE_VIS basic_stringstream : public basic_iostream<_CharT, _Traits> {831public:832  typedef _CharT char_type;833  typedef _Traits traits_type;834  typedef typename traits_type::int_type int_type;835  typedef typename traits_type::pos_type pos_type;836  typedef typename traits_type::off_type off_type;837  typedef _Allocator allocator_type;838 839  typedef basic_string<char_type, traits_type, allocator_type> string_type;840 841private:842  basic_stringbuf<char_type, traits_type, allocator_type> __sb_;843 844public:845  // [stringstream.cons] constructors846  _LIBCPP_HIDE_FROM_ABI basic_stringstream()847      : basic_iostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(ios_base::in | ios_base::out) {}848 849  _LIBCPP_HIDE_FROM_ABI explicit basic_stringstream(ios_base::openmode __wch)850      : basic_iostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__wch) {}851 852  _LIBCPP_HIDE_FROM_ABI explicit basic_stringstream(const string_type& __s,853                                                    ios_base::openmode __wch = ios_base::in | ios_base::out)854      : basic_iostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__s, __wch) {}855 856  basic_stringstream(const basic_stringstream&) = delete;857  _LIBCPP_HIDE_FROM_ABI basic_stringstream(basic_stringstream&& __rhs)858      : basic_iostream<_CharT, _Traits>(std::move(__rhs)), __sb_(std::move(__rhs.__sb_)) {859    basic_istream<_CharT, _Traits>::set_rdbuf(std::addressof(__sb_));860  }861 862  // [stringstream.assign] Assign and swap:863  basic_stringstream& operator=(const basic_stringstream&) = delete;864  basic_stringstream& operator=(basic_stringstream&& __rhs) {865    basic_iostream<char_type, traits_type>::operator=(std::move(__rhs));866    __sb_ = std::move(__rhs.__sb_);867    return *this;868  }869  _LIBCPP_HIDE_FROM_ABI void swap(basic_stringstream& __rhs) {870    basic_iostream<char_type, traits_type>::swap(__rhs);871    __sb_.swap(__rhs.__sb_);872  }873 874  // [stringstream.members] Member functions:875  _LIBCPP_HIDE_FROM_ABI basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const {876    return const_cast<basic_stringbuf<char_type, traits_type, allocator_type>*>(std::addressof(__sb_));877  }878 879  _LIBCPP_HIDE_FROM_ABI string_type str() const { return __sb_.str(); }880 881  _LIBCPP_HIDE_FROM_ABI void str(const string_type& __s) { __sb_.str(__s); }882};883 884template <class _CharT, class _Traits, class _Allocator>885inline _LIBCPP_HIDE_FROM_ABI void886swap(basic_stringstream<_CharT, _Traits, _Allocator>& __x, basic_stringstream<_CharT, _Traits, _Allocator>& __y) {887  __x.swap(__y);888}889 890#if _LIBCPP_AVAILABILITY_HAS_ADDITIONAL_IOSTREAM_EXPLICIT_INSTANTIATIONS_1891extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_stringbuf<char>;892extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_stringstream<char>;893extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ostringstream<char>;894extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istringstream<char>;895#endif896 897_LIBCPP_END_NAMESPACE_STD898 899_LIBCPP_POP_MACROS900 901#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES)902#  include <__cxx03/ostream>903#  include <__cxx03/type_traits>904#endif905 906#endif // _LIBCPP___CXX03_SSTREAM907