brintos

brintos / llvm-project-archived public Read only

0
0
Text · 54.8 KiB · c42dbff Raw
1298 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_SSTREAM11#define _LIBCPP_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#if __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)316#  include <__cxx03/sstream>317#else318#  include <__config>319 320#  if _LIBCPP_HAS_LOCALIZATION321 322#    include <__fwd/sstream.h>323#    include <__ostream/basic_ostream.h>324#    include <__type_traits/is_convertible.h>325#    include <__utility/swap.h>326#    include <ios>327#    include <istream>328#    include <streambuf>329#    include <string>330#    include <string_view>331#    include <version>332 333#    if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)334#      pragma GCC system_header335#    endif336 337_LIBCPP_PUSH_MACROS338#    include <__undef_macros>339 340_LIBCPP_BEGIN_NAMESPACE_STD341 342// Class template basic_stringbuf [stringbuf]343 344template <class _CharT, class _Traits, class _Allocator>345class basic_stringbuf : public basic_streambuf<_CharT, _Traits> {346public:347  typedef _CharT char_type;348  typedef _Traits traits_type;349  typedef typename traits_type::int_type int_type;350  typedef typename traits_type::pos_type pos_type;351  typedef typename traits_type::off_type off_type;352  typedef _Allocator allocator_type;353 354  typedef basic_string<char_type, traits_type, allocator_type> string_type;355 356private:357  string_type __str_;358  mutable char_type* __hm_;359  ios_base::openmode __mode_;360  _LIBCPP_HIDE_FROM_ABI void __init_buf_ptrs();361  _LIBCPP_HIDE_FROM_ABI void __move_init(basic_stringbuf&& __rhs);362 363public:364  // [stringbuf.cons] constructors:365  _LIBCPP_HIDE_FROM_ABI basic_stringbuf() : __hm_(nullptr), __mode_(ios_base::in | ios_base::out) {366    // it is implementation-defined whether we initialize eback() & friends to nullptr, and libc++ doesn't367    __init_buf_ptrs();368  }369 370  _LIBCPP_HIDE_FROM_ABI explicit basic_stringbuf(ios_base::openmode __wch) : __hm_(nullptr), __mode_(__wch) {371    // it is implementation-defined whether we initialize eback() & friends to nullptr, and libc++ doesn't372    __init_buf_ptrs();373  }374 375  _LIBCPP_HIDE_FROM_ABI explicit basic_stringbuf(const string_type& __s,376                                                 ios_base::openmode __wch = ios_base::in | ios_base::out)377      : __str_(__s.get_allocator()), __hm_(nullptr), __mode_(__wch) {378    str(__s);379  }380 381#    if _LIBCPP_STD_VER >= 20382  _LIBCPP_HIDE_FROM_ABI explicit basic_stringbuf(const allocator_type& __a)383      : basic_stringbuf(ios_base::in | ios_base::out, __a) {}384 385  _LIBCPP_HIDE_FROM_ABI basic_stringbuf(ios_base::openmode __wch, const allocator_type& __a)386      : __str_(__a), __hm_(nullptr), __mode_(__wch) {387    __init_buf_ptrs();388  }389 390  _LIBCPP_HIDE_FROM_ABI explicit basic_stringbuf(string_type&& __s,391                                                 ios_base::openmode __wch = ios_base::in | ios_base::out)392      : __str_(std::move(__s)), __hm_(nullptr), __mode_(__wch) {393    __init_buf_ptrs();394  }395 396  template <class _SAlloc>397  _LIBCPP_HIDE_FROM_ABI398  basic_stringbuf(const basic_string<char_type, traits_type, _SAlloc>& __s, const allocator_type& __a)399      : basic_stringbuf(__s, ios_base::in | ios_base::out, __a) {}400 401  template <class _SAlloc>402  _LIBCPP_HIDE_FROM_ABI basic_stringbuf(403      const basic_string<char_type, traits_type, _SAlloc>& __s, ios_base::openmode __wch, const allocator_type& __a)404      : __str_(__s, __a), __hm_(nullptr), __mode_(__wch) {405    __init_buf_ptrs();406  }407 408  template <class _SAlloc>409    requires(!is_same_v<_SAlloc, allocator_type>)410  _LIBCPP_HIDE_FROM_ABI explicit basic_stringbuf(const basic_string<char_type, traits_type, _SAlloc>& __s,411                                                 ios_base::openmode __wch = ios_base::in | ios_base::out)412      : __str_(__s), __hm_(nullptr), __mode_(__wch) {413    __init_buf_ptrs();414  }415#    endif // _LIBCPP_STD_VER >= 20416 417#    if _LIBCPP_STD_VER >= 26418 419  template <class _Tp>420    requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>421  _LIBCPP_HIDE_FROM_ABI explicit basic_stringbuf(const _Tp& __t,422                                                 ios_base::openmode __which = ios_base::in | ios_base::out)423      : basic_stringbuf(__t, __which, _Allocator()) {}424 425  template <class _Tp>426    requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>427  _LIBCPP_HIDE_FROM_ABI basic_stringbuf(const _Tp& __t, const _Allocator& __a)428      : basic_stringbuf(__t, ios_base::in | ios_base::out, __a) {}429 430  template <class _Tp>431    requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>432  _LIBCPP_HIDE_FROM_ABI basic_stringbuf(const _Tp& __t, ios_base::openmode __which, const _Allocator& __a)433      : __hm_(nullptr), __mode_(__which) {434    basic_string_view<_CharT, _Traits> __sv = __t;435    __str_                                  = string_type(__sv, __a);436    __init_buf_ptrs();437  }438 439#    endif //  _LIBCPP_STD_VER >= 26440 441  basic_stringbuf(const basic_stringbuf&) = delete;442  basic_stringbuf(basic_stringbuf&& __rhs) : __mode_(__rhs.__mode_) { __move_init(std::move(__rhs)); }443 444#    if _LIBCPP_STD_VER >= 20445  _LIBCPP_HIDE_FROM_ABI basic_stringbuf(basic_stringbuf&& __rhs, const allocator_type& __a)446      : basic_stringbuf(__rhs.__mode_, __a) {447    __move_init(std::move(__rhs));448  }449#    endif450 451  // [stringbuf.assign] Assign and swap:452  basic_stringbuf& operator=(const basic_stringbuf&) = delete;453  basic_stringbuf& operator=(basic_stringbuf&& __rhs);454  void swap(basic_stringbuf& __rhs)455#    if _LIBCPP_STD_VER >= 20456      noexcept(allocator_traits<allocator_type>::propagate_on_container_swap::value ||457               allocator_traits<allocator_type>::is_always_equal::value)458#    endif459          ;460 461  // [stringbuf.members] Member functions:462 463#    if _LIBCPP_STD_VER >= 20464  _LIBCPP_HIDE_FROM_ABI allocator_type get_allocator() const noexcept { return __str_.get_allocator(); }465#    endif466 467#    if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_BUILDING_LIBRARY)468  string_type str() const;469#    else470  _LIBCPP_HIDE_FROM_ABI string_type str() const& { return str(__str_.get_allocator()); }471 472  _LIBCPP_HIDE_FROM_ABI string_type str() && {473    const basic_string_view<_CharT, _Traits> __view = view();474    typename string_type::size_type __pos           = __view.empty() ? 0 : __view.data() - __str_.data();475    // In C++23, this is just string_type(std::move(__str_), __pos, __view.size(), __str_.get_allocator());476    // But we need something that works in C++20 also.477    string_type __result(std::move(__str_), __str_.get_allocator());478    __result.resize(__pos + __view.size());479    __result.erase(0, __pos);480    __init_buf_ptrs();481    return __result;482  }483#    endif // _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_BUILDING_LIBRARY)484 485#    if _LIBCPP_STD_VER >= 20486  template <class _SAlloc>487    requires __is_allocator_v<_SAlloc>488  _LIBCPP_HIDE_FROM_ABI basic_string<char_type, traits_type, _SAlloc> str(const _SAlloc& __sa) const {489    return basic_string<_CharT, _Traits, _SAlloc>(view(), __sa);490  }491 492  _LIBCPP_HIDE_FROM_ABI basic_string_view<char_type, traits_type> view() const noexcept;493#    endif // _LIBCPP_STD_VER >= 20494 495  void str(const string_type& __s) {496    __str_ = __s;497    __init_buf_ptrs();498  }499 500#    if _LIBCPP_STD_VER >= 20501  template <class _SAlloc>502    requires(!is_same_v<_SAlloc, allocator_type>)503  _LIBCPP_HIDE_FROM_ABI void str(const basic_string<char_type, traits_type, _SAlloc>& __s) {504    __str_ = __s;505    __init_buf_ptrs();506  }507 508  _LIBCPP_HIDE_FROM_ABI void str(string_type&& __s) {509    __str_ = std::move(__s);510    __init_buf_ptrs();511  }512#    endif // _LIBCPP_STD_VER >= 20513 514#    if _LIBCPP_STD_VER >= 26515 516  template <class _Tp>517    requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>518  _LIBCPP_HIDE_FROM_ABI void str(const _Tp& __t) {519    basic_string_view<_CharT, _Traits> __sv = __t;520    __str_                                  = __sv;521    __init_buf_ptrs();522  }523 524#    endif //  _LIBCPP_STD_VER >= 26525 526protected:527  // [stringbuf.virtuals] Overridden virtual functions:528  int_type underflow() override;529  int_type pbackfail(int_type __c = traits_type::eof()) override;530  int_type overflow(int_type __c = traits_type::eof()) override;531  pos_type532  seekoff(off_type __off, ios_base::seekdir __way, ios_base::openmode __wch = ios_base::in | ios_base::out) override;533  _LIBCPP_HIDE_FROM_ABI_VIRTUAL534  pos_type seekpos(pos_type __sp, ios_base::openmode __wch = ios_base::in | ios_base::out) override {535    return seekoff(__sp, ios_base::beg, __wch);536  }537};538 539template <class _CharT, class _Traits, class _Allocator>540_LIBCPP_HIDE_FROM_ABI void basic_stringbuf<_CharT, _Traits, _Allocator>::__move_init(basic_stringbuf&& __rhs) {541  char_type* __p   = const_cast<char_type*>(__rhs.__str_.data());542  ptrdiff_t __binp = -1;543  ptrdiff_t __ninp = -1;544  ptrdiff_t __einp = -1;545  if (__rhs.eback() != nullptr) {546    __binp = __rhs.eback() - __p;547    __ninp = __rhs.gptr() - __p;548    __einp = __rhs.egptr() - __p;549  }550  ptrdiff_t __bout = -1;551  ptrdiff_t __nout = -1;552  ptrdiff_t __eout = -1;553  if (__rhs.pbase() != nullptr) {554    __bout = __rhs.pbase() - __p;555    __nout = __rhs.pptr() - __p;556    __eout = __rhs.epptr() - __p;557  }558  ptrdiff_t __hm = __rhs.__hm_ == nullptr ? -1 : __rhs.__hm_ - __p;559  __str_         = std::move(__rhs.__str_);560  __p            = const_cast<char_type*>(__str_.data());561  if (__binp != -1)562    this->setg(__p + __binp, __p + __ninp, __p + __einp);563  if (__bout != -1) {564    this->setp(__p + __bout, __p + __eout);565    this->__pbump(__nout);566  }567  __hm_ = __hm == -1 ? nullptr : __p + __hm;568  __p   = const_cast<char_type*>(__rhs.__str_.data());569  __rhs.setg(__p, __p, __p);570  __rhs.setp(__p, __p);571  __rhs.__hm_ = __p;572  this->pubimbue(__rhs.getloc());573}574 575template <class _CharT, class _Traits, class _Allocator>576basic_stringbuf<_CharT, _Traits, _Allocator>&577basic_stringbuf<_CharT, _Traits, _Allocator>::operator=(basic_stringbuf&& __rhs) {578  char_type* __p   = const_cast<char_type*>(__rhs.__str_.data());579  ptrdiff_t __binp = -1;580  ptrdiff_t __ninp = -1;581  ptrdiff_t __einp = -1;582  if (__rhs.eback() != nullptr) {583    __binp = __rhs.eback() - __p;584    __ninp = __rhs.gptr() - __p;585    __einp = __rhs.egptr() - __p;586  }587  ptrdiff_t __bout = -1;588  ptrdiff_t __nout = -1;589  ptrdiff_t __eout = -1;590  if (__rhs.pbase() != nullptr) {591    __bout = __rhs.pbase() - __p;592    __nout = __rhs.pptr() - __p;593    __eout = __rhs.epptr() - __p;594  }595  ptrdiff_t __hm = __rhs.__hm_ == nullptr ? -1 : __rhs.__hm_ - __p;596  __str_         = std::move(__rhs.__str_);597  __p            = const_cast<char_type*>(__str_.data());598  if (__binp != -1)599    this->setg(__p + __binp, __p + __ninp, __p + __einp);600  else601    this->setg(nullptr, nullptr, nullptr);602  if (__bout != -1) {603    this->setp(__p + __bout, __p + __eout);604    this->__pbump(__nout);605  } else606    this->setp(nullptr, nullptr);607 608  __hm_   = __hm == -1 ? nullptr : __p + __hm;609  __mode_ = __rhs.__mode_;610  __p     = const_cast<char_type*>(__rhs.__str_.data());611  __rhs.setg(__p, __p, __p);612  __rhs.setp(__p, __p);613  __rhs.__hm_ = __p;614  this->pubimbue(__rhs.getloc());615  return *this;616}617 618template <class _CharT, class _Traits, class _Allocator>619void basic_stringbuf<_CharT, _Traits, _Allocator>::swap(basic_stringbuf& __rhs)620#    if _LIBCPP_STD_VER >= 20621    noexcept(allocator_traits<_Allocator>::propagate_on_container_swap::value ||622             allocator_traits<_Allocator>::is_always_equal::value)623#    endif624{625  char_type* __p    = const_cast<char_type*>(__rhs.__str_.data());626  ptrdiff_t __rbinp = -1;627  ptrdiff_t __rninp = -1;628  ptrdiff_t __reinp = -1;629  if (__rhs.eback() != nullptr) {630    __rbinp = __rhs.eback() - __p;631    __rninp = __rhs.gptr() - __p;632    __reinp = __rhs.egptr() - __p;633  }634  ptrdiff_t __rbout = -1;635  ptrdiff_t __rnout = -1;636  ptrdiff_t __reout = -1;637  if (__rhs.pbase() != nullptr) {638    __rbout = __rhs.pbase() - __p;639    __rnout = __rhs.pptr() - __p;640    __reout = __rhs.epptr() - __p;641  }642  ptrdiff_t __rhm   = __rhs.__hm_ == nullptr ? -1 : __rhs.__hm_ - __p;643  __p               = const_cast<char_type*>(__str_.data());644  ptrdiff_t __lbinp = -1;645  ptrdiff_t __lninp = -1;646  ptrdiff_t __leinp = -1;647  if (this->eback() != nullptr) {648    __lbinp = this->eback() - __p;649    __lninp = this->gptr() - __p;650    __leinp = this->egptr() - __p;651  }652  ptrdiff_t __lbout = -1;653  ptrdiff_t __lnout = -1;654  ptrdiff_t __leout = -1;655  if (this->pbase() != nullptr) {656    __lbout = this->pbase() - __p;657    __lnout = this->pptr() - __p;658    __leout = this->epptr() - __p;659  }660  ptrdiff_t __lhm = __hm_ == nullptr ? -1 : __hm_ - __p;661  std::swap(__mode_, __rhs.__mode_);662  __str_.swap(__rhs.__str_);663  __p = const_cast<char_type*>(__str_.data());664  if (__rbinp != -1)665    this->setg(__p + __rbinp, __p + __rninp, __p + __reinp);666  else667    this->setg(nullptr, nullptr, nullptr);668  if (__rbout != -1) {669    this->setp(__p + __rbout, __p + __reout);670    this->__pbump(__rnout);671  } else672    this->setp(nullptr, nullptr);673  __hm_ = __rhm == -1 ? nullptr : __p + __rhm;674  __p   = const_cast<char_type*>(__rhs.__str_.data());675  if (__lbinp != -1)676    __rhs.setg(__p + __lbinp, __p + __lninp, __p + __leinp);677  else678    __rhs.setg(nullptr, nullptr, nullptr);679  if (__lbout != -1) {680    __rhs.setp(__p + __lbout, __p + __leout);681    __rhs.__pbump(__lnout);682  } else683    __rhs.setp(nullptr, nullptr);684  __rhs.__hm_ = __lhm == -1 ? nullptr : __p + __lhm;685  locale __tl = __rhs.getloc();686  __rhs.pubimbue(this->getloc());687  this->pubimbue(__tl);688}689 690template <class _CharT, class _Traits, class _Allocator>691inline _LIBCPP_HIDE_FROM_ABI void692swap(basic_stringbuf<_CharT, _Traits, _Allocator>& __x, basic_stringbuf<_CharT, _Traits, _Allocator>& __y)693#    if _LIBCPP_STD_VER >= 20694    noexcept(noexcept(__x.swap(__y)))695#    endif696{697  __x.swap(__y);698}699 700#    if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_BUILDING_LIBRARY)701template <class _CharT, class _Traits, class _Allocator>702basic_string<_CharT, _Traits, _Allocator> basic_stringbuf<_CharT, _Traits, _Allocator>::str() const {703  if (__mode_ & ios_base::out) {704    if (__hm_ < this->pptr())705      __hm_ = this->pptr();706    return string_type(this->pbase(), __hm_, __str_.get_allocator());707  } else if (__mode_ & ios_base::in)708    return string_type(this->eback(), this->egptr(), __str_.get_allocator());709  return string_type(__str_.get_allocator());710}711#    endif // _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_BUILDING_LIBRARY)712 713template <class _CharT, class _Traits, class _Allocator>714_LIBCPP_HIDE_FROM_ABI void basic_stringbuf<_CharT, _Traits, _Allocator>::__init_buf_ptrs() {715  __hm_                                = nullptr;716  char_type* __data                    = const_cast<char_type*>(__str_.data());717  typename string_type::size_type __sz = __str_.size();718  if (__mode_ & ios_base::in) {719    __hm_ = __data + __sz;720    this->setg(__data, __data, __hm_);721  }722  if (__mode_ & ios_base::out) {723    __hm_ = __data + __sz;724    __str_.resize(__str_.capacity());725    this->setp(__data, __data + __str_.size());726    if (__mode_ & (ios_base::app | ios_base::ate)) {727      while (__sz > INT_MAX) {728        this->pbump(INT_MAX);729        __sz -= INT_MAX;730      }731      if (__sz > 0)732        this->pbump(__sz);733    }734  }735}736 737#    if _LIBCPP_STD_VER >= 20738template <class _CharT, class _Traits, class _Allocator>739_LIBCPP_HIDE_FROM_ABI basic_string_view<_CharT, _Traits>740basic_stringbuf<_CharT, _Traits, _Allocator>::view() const noexcept {741  if (__mode_ & ios_base::out) {742    if (__hm_ < this->pptr())743      __hm_ = this->pptr();744    return basic_string_view<_CharT, _Traits>(this->pbase(), __hm_);745  } else if (__mode_ & ios_base::in)746    return basic_string_view<_CharT, _Traits>(this->eback(), this->egptr());747  return basic_string_view<_CharT, _Traits>();748}749#    endif // _LIBCPP_STD_VER >= 20750 751template <class _CharT, class _Traits, class _Allocator>752typename basic_stringbuf<_CharT, _Traits, _Allocator>::int_type753basic_stringbuf<_CharT, _Traits, _Allocator>::underflow() {754  if (__hm_ < this->pptr())755    __hm_ = this->pptr();756  if (__mode_ & ios_base::in) {757    if (this->egptr() < __hm_)758      this->setg(this->eback(), this->gptr(), __hm_);759    if (this->gptr() < this->egptr())760      return traits_type::to_int_type(*this->gptr());761  }762  return traits_type::eof();763}764 765template <class _CharT, class _Traits, class _Allocator>766typename basic_stringbuf<_CharT, _Traits, _Allocator>::int_type767basic_stringbuf<_CharT, _Traits, _Allocator>::pbackfail(int_type __c) {768  if (__hm_ < this->pptr())769    __hm_ = this->pptr();770  if (this->eback() < this->gptr()) {771    if (traits_type::eq_int_type(__c, traits_type::eof())) {772      this->setg(this->eback(), this->gptr() - 1, __hm_);773      return traits_type::not_eof(__c);774    }775    if ((__mode_ & ios_base::out) || traits_type::eq(traits_type::to_char_type(__c), this->gptr()[-1])) {776      this->setg(this->eback(), this->gptr() - 1, __hm_);777      *this->gptr() = traits_type::to_char_type(__c);778      return __c;779    }780  }781  return traits_type::eof();782}783 784template <class _CharT, class _Traits, class _Allocator>785typename basic_stringbuf<_CharT, _Traits, _Allocator>::int_type786basic_stringbuf<_CharT, _Traits, _Allocator>::overflow(int_type __c) {787  if (!traits_type::eq_int_type(__c, traits_type::eof())) {788    ptrdiff_t __ninp = this->gptr() - this->eback();789    if (this->pptr() == this->epptr()) {790      if (!(__mode_ & ios_base::out))791        return traits_type::eof();792#    if _LIBCPP_HAS_EXCEPTIONS793      try {794#    endif // _LIBCPP_HAS_EXCEPTIONS795        ptrdiff_t __nout = this->pptr() - this->pbase();796        ptrdiff_t __hm   = __hm_ - this->pbase();797        __str_.push_back(char_type());798        __str_.resize(__str_.capacity());799        char_type* __p = const_cast<char_type*>(__str_.data());800        this->setp(__p, __p + __str_.size());801        this->__pbump(__nout);802        __hm_ = this->pbase() + __hm;803#    if _LIBCPP_HAS_EXCEPTIONS804      } catch (...) {805        return traits_type::eof();806      }807#    endif // _LIBCPP_HAS_EXCEPTIONS808    }809    __hm_ = std::max(this->pptr() + 1, __hm_);810    if (__mode_ & ios_base::in) {811      char_type* __p = const_cast<char_type*>(__str_.data());812      this->setg(__p, __p + __ninp, __hm_);813    }814    return this->sputc(traits_type::to_char_type(__c));815  }816  return traits_type::not_eof(__c);817}818 819template <class _CharT, class _Traits, class _Allocator>820typename basic_stringbuf<_CharT, _Traits, _Allocator>::pos_type basic_stringbuf<_CharT, _Traits, _Allocator>::seekoff(821    off_type __off, ios_base::seekdir __way, ios_base::openmode __wch) {822  if (__hm_ < this->pptr())823    __hm_ = this->pptr();824  if ((__wch & (ios_base::in | ios_base::out)) == 0)825    return pos_type(-1);826  if ((__wch & (ios_base::in | ios_base::out)) == (ios_base::in | ios_base::out) && __way == ios_base::cur)827    return pos_type(-1);828  const ptrdiff_t __hm = __hm_ == nullptr ? 0 : __hm_ - __str_.data();829  off_type __noff;830  switch (__way) {831  case ios_base::beg:832    __noff = 0;833    break;834  case ios_base::cur:835    if (__wch & ios_base::in)836      __noff = this->gptr() - this->eback();837    else838      __noff = this->pptr() - this->pbase();839    break;840  case ios_base::end:841    __noff = __hm;842    break;843  default:844    return pos_type(-1);845  }846  __noff += __off;847  if (__noff < 0 || __hm < __noff)848    return pos_type(-1);849  if (__noff != 0) {850    if ((__wch & ios_base::in) && this->gptr() == nullptr)851      return pos_type(-1);852    if ((__wch & ios_base::out) && this->pptr() == nullptr)853      return pos_type(-1);854  }855  if (__wch & ios_base::in)856    this->setg(this->eback(), this->eback() + __noff, __hm_);857  if (__wch & ios_base::out) {858    this->setp(this->pbase(), this->epptr());859    this->__pbump(__noff);860  }861  return pos_type(__noff);862}863 864// Class template basic_istringstream [istringstream]865 866template <class _CharT, class _Traits, class _Allocator>867class basic_istringstream : public basic_istream<_CharT, _Traits> {868public:869  typedef _CharT char_type;870  typedef _Traits traits_type;871  typedef typename traits_type::int_type int_type;872  typedef typename traits_type::pos_type pos_type;873  typedef typename traits_type::off_type off_type;874  typedef _Allocator allocator_type;875 876  typedef basic_string<char_type, traits_type, allocator_type> string_type;877 878private:879  basic_stringbuf<char_type, traits_type, allocator_type> __sb_;880 881public:882  // [istringstream.cons] Constructors:883  _LIBCPP_HIDE_FROM_ABI basic_istringstream()884      : basic_istream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(ios_base::in) {}885 886  _LIBCPP_HIDE_FROM_ABI explicit basic_istringstream(ios_base::openmode __wch)887      : basic_istream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__wch | ios_base::in) {}888 889  _LIBCPP_HIDE_FROM_ABI explicit basic_istringstream(const string_type& __s, ios_base::openmode __wch = ios_base::in)890      : basic_istream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__s, __wch | ios_base::in) {}891 892#    if _LIBCPP_STD_VER >= 20893  _LIBCPP_HIDE_FROM_ABI basic_istringstream(ios_base::openmode __wch, const _Allocator& __a)894      : basic_istream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__wch | ios_base::in, __a) {}895 896  _LIBCPP_HIDE_FROM_ABI explicit basic_istringstream(string_type&& __s, ios_base::openmode __wch = ios_base::in)897      : basic_istream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(std::move(__s), __wch | ios_base::in) {}898 899  template <class _SAlloc>900  _LIBCPP_HIDE_FROM_ABI basic_istringstream(const basic_string<_CharT, _Traits, _SAlloc>& __s, const _Allocator& __a)901      : basic_istringstream(__s, ios_base::in, __a) {}902 903  template <class _SAlloc>904  _LIBCPP_HIDE_FROM_ABI basic_istringstream(905      const basic_string<_CharT, _Traits, _SAlloc>& __s, ios_base::openmode __wch, const _Allocator& __a)906      : basic_istream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__s, __wch | ios_base::in, __a) {}907 908  template <class _SAlloc>909  _LIBCPP_HIDE_FROM_ABI explicit basic_istringstream(const basic_string<_CharT, _Traits, _SAlloc>& __s,910                                                     ios_base::openmode __wch = ios_base::in)911      : basic_istream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__s, __wch | ios_base::in) {}912#    endif // _LIBCPP_STD_VER >= 20913 914#    if _LIBCPP_STD_VER >= 26915 916  template <class _Tp>917    requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>918  _LIBCPP_HIDE_FROM_ABI explicit basic_istringstream(const _Tp& __t, ios_base::openmode __which = ios_base::in)919      : basic_istringstream(__t, __which, _Allocator()) {}920 921  template <class _Tp>922    requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>923  _LIBCPP_HIDE_FROM_ABI basic_istringstream(const _Tp& __t, const _Allocator& __a)924      : basic_istringstream(__t, ios_base::in, __a) {}925 926  template <class _Tp>927    requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>928  _LIBCPP_HIDE_FROM_ABI basic_istringstream(const _Tp& __t, ios_base::openmode __which, const _Allocator& __a)929      : basic_istream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__t, __which | ios_base::in, __a) {}930 931#    endif //  _LIBCPP_STD_VER >= 26932 933  basic_istringstream(const basic_istringstream&) = delete;934  _LIBCPP_HIDE_FROM_ABI basic_istringstream(basic_istringstream&& __rhs)935      : basic_istream<_CharT, _Traits>(std::move(__rhs)), __sb_(std::move(__rhs.__sb_)) {936    basic_istream<_CharT, _Traits>::set_rdbuf(std::addressof(__sb_));937  }938 939  // [istringstream.assign] Assign and swap:940  basic_istringstream& operator=(const basic_istringstream&) = delete;941  basic_istringstream& operator=(basic_istringstream&& __rhs) {942    basic_istream<char_type, traits_type>::operator=(std::move(__rhs));943    __sb_ = std::move(__rhs.__sb_);944    return *this;945  }946  _LIBCPP_HIDE_FROM_ABI void swap(basic_istringstream& __rhs) {947    basic_istream<char_type, traits_type>::swap(__rhs);948    __sb_.swap(__rhs.__sb_);949  }950 951  // [istringstream.members] Member functions:952  _LIBCPP_HIDE_FROM_ABI basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const {953    return const_cast<basic_stringbuf<char_type, traits_type, allocator_type>*>(std::addressof(__sb_));954  }955 956#    if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_BUILDING_LIBRARY)957  _LIBCPP_HIDE_FROM_ABI string_type str() const { return __sb_.str(); }958#    else959  _LIBCPP_HIDE_FROM_ABI string_type str() const& { return __sb_.str(); }960 961  _LIBCPP_HIDE_FROM_ABI string_type str() && { return std::move(__sb_).str(); }962#    endif963 964#    if _LIBCPP_STD_VER >= 20965  template <class _SAlloc>966    requires __is_allocator_v<_SAlloc>967  _LIBCPP_HIDE_FROM_ABI basic_string<char_type, traits_type, _SAlloc> str(const _SAlloc& __sa) const {968    return __sb_.str(__sa);969  }970 971  _LIBCPP_HIDE_FROM_ABI basic_string_view<char_type, traits_type> view() const noexcept { return __sb_.view(); }972#    endif // _LIBCPP_STD_VER >= 20973 974  _LIBCPP_HIDE_FROM_ABI void str(const string_type& __s) { __sb_.str(__s); }975 976#    if _LIBCPP_STD_VER >= 20977  template <class _SAlloc>978  _LIBCPP_HIDE_FROM_ABI void str(const basic_string<char_type, traits_type, _SAlloc>& __s) {979    __sb_.str(__s);980  }981 982  _LIBCPP_HIDE_FROM_ABI void str(string_type&& __s) { __sb_.str(std::move(__s)); }983#    endif // _LIBCPP_STD_VER >= 20984 985#    if _LIBCPP_STD_VER >= 26986  template <class _Tp>987    requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>988  _LIBCPP_HIDE_FROM_ABI void str(const _Tp& __t) {989    rdbuf()->str(__t);990  }991#    endif //  _LIBCPP_STD_VER >= 26992};993 994template <class _CharT, class _Traits, class _Allocator>995inline _LIBCPP_HIDE_FROM_ABI void996swap(basic_istringstream<_CharT, _Traits, _Allocator>& __x, basic_istringstream<_CharT, _Traits, _Allocator>& __y) {997  __x.swap(__y);998}999 1000// Class template basic_ostringstream [ostringstream]1001 1002template <class _CharT, class _Traits, class _Allocator>1003class basic_ostringstream : public basic_ostream<_CharT, _Traits> {1004public:1005  typedef _CharT char_type;1006  typedef _Traits traits_type;1007  typedef typename traits_type::int_type int_type;1008  typedef typename traits_type::pos_type pos_type;1009  typedef typename traits_type::off_type off_type;1010  typedef _Allocator allocator_type;1011 1012  typedef basic_string<char_type, traits_type, allocator_type> string_type;1013 1014private:1015  basic_stringbuf<char_type, traits_type, allocator_type> __sb_;1016 1017public:1018  // [ostringstream.cons] Constructors:1019  _LIBCPP_HIDE_FROM_ABI basic_ostringstream()1020      : basic_ostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(ios_base::out) {}1021 1022  _LIBCPP_HIDE_FROM_ABI explicit basic_ostringstream(ios_base::openmode __wch)1023      : basic_ostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__wch | ios_base::out) {}1024 1025  _LIBCPP_HIDE_FROM_ABI explicit basic_ostringstream(const string_type& __s, ios_base::openmode __wch = ios_base::out)1026      : basic_ostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__s, __wch | ios_base::out) {}1027 1028#    if _LIBCPP_STD_VER >= 201029  _LIBCPP_HIDE_FROM_ABI basic_ostringstream(ios_base::openmode __wch, const _Allocator& __a)1030      : basic_ostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__wch | ios_base::out, __a) {}1031 1032  _LIBCPP_HIDE_FROM_ABI explicit basic_ostringstream(string_type&& __s, ios_base::openmode __wch = ios_base::out)1033      : basic_ostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(std::move(__s), __wch | ios_base::out) {}1034 1035  template <class _SAlloc>1036  _LIBCPP_HIDE_FROM_ABI basic_ostringstream(const basic_string<_CharT, _Traits, _SAlloc>& __s, const _Allocator& __a)1037      : basic_ostringstream(__s, ios_base::out, __a) {}1038 1039  template <class _SAlloc>1040  _LIBCPP_HIDE_FROM_ABI basic_ostringstream(1041      const basic_string<_CharT, _Traits, _SAlloc>& __s, ios_base::openmode __wch, const _Allocator& __a)1042      : basic_ostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__s, __wch | ios_base::out, __a) {}1043 1044  template <class _SAlloc>1045    requires(!is_same_v<_SAlloc, allocator_type>)1046  _LIBCPP_HIDE_FROM_ABI explicit basic_ostringstream(const basic_string<_CharT, _Traits, _SAlloc>& __s,1047                                                     ios_base::openmode __wch = ios_base::out)1048      : basic_ostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__s, __wch | ios_base::out) {}1049#    endif // _LIBCPP_STD_VER >= 201050 1051#    if _LIBCPP_STD_VER >= 261052 1053  template <class _Tp>1054    requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>1055  _LIBCPP_HIDE_FROM_ABI explicit basic_ostringstream(const _Tp& __t, ios_base::openmode __which = ios_base::out)1056      : basic_ostringstream(__t, __which | ios_base::out, _Allocator()) {}1057 1058  template <class _Tp>1059    requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>1060  _LIBCPP_HIDE_FROM_ABI basic_ostringstream(const _Tp& __t, const _Allocator& __a)1061      : basic_ostringstream(__t, ios_base::out, __a) {}1062 1063  template <class _Tp>1064    requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>1065  _LIBCPP_HIDE_FROM_ABI basic_ostringstream(const _Tp& __t, ios_base::openmode __which, const _Allocator& __a)1066      : basic_ostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__t, __which | ios_base::out, __a) {}1067 1068#    endif //  _LIBCPP_STD_VER >= 261069 1070  basic_ostringstream(const basic_ostringstream&) = delete;1071  _LIBCPP_HIDE_FROM_ABI basic_ostringstream(basic_ostringstream&& __rhs)1072      : basic_ostream<_CharT, _Traits>(std::move(__rhs)), __sb_(std::move(__rhs.__sb_)) {1073    basic_ostream<_CharT, _Traits>::set_rdbuf(std::addressof(__sb_));1074  }1075 1076  // [ostringstream.assign] Assign and swap:1077  basic_ostringstream& operator=(const basic_ostringstream&) = delete;1078  basic_ostringstream& operator=(basic_ostringstream&& __rhs) {1079    basic_ostream<char_type, traits_type>::operator=(std::move(__rhs));1080    __sb_ = std::move(__rhs.__sb_);1081    return *this;1082  }1083 1084  _LIBCPP_HIDE_FROM_ABI void swap(basic_ostringstream& __rhs) {1085    basic_ostream<char_type, traits_type>::swap(__rhs);1086    __sb_.swap(__rhs.__sb_);1087  }1088 1089  // [ostringstream.members] Member functions:1090  _LIBCPP_HIDE_FROM_ABI basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const {1091    return const_cast<basic_stringbuf<char_type, traits_type, allocator_type>*>(std::addressof(__sb_));1092  }1093 1094#    if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_BUILDING_LIBRARY)1095  _LIBCPP_HIDE_FROM_ABI string_type str() const { return __sb_.str(); }1096#    else1097  _LIBCPP_HIDE_FROM_ABI string_type str() const& { return __sb_.str(); }1098 1099  _LIBCPP_HIDE_FROM_ABI string_type str() && { return std::move(__sb_).str(); }1100#    endif1101 1102#    if _LIBCPP_STD_VER >= 201103  template <class _SAlloc>1104    requires __is_allocator_v<_SAlloc>1105  _LIBCPP_HIDE_FROM_ABI basic_string<char_type, traits_type, _SAlloc> str(const _SAlloc& __sa) const {1106    return __sb_.str(__sa);1107  }1108 1109  _LIBCPP_HIDE_FROM_ABI basic_string_view<char_type, traits_type> view() const noexcept { return __sb_.view(); }1110#    endif // _LIBCPP_STD_VER >= 201111 1112  _LIBCPP_HIDE_FROM_ABI void str(const string_type& __s) { __sb_.str(__s); }1113 1114#    if _LIBCPP_STD_VER >= 201115  template <class _SAlloc>1116  _LIBCPP_HIDE_FROM_ABI void str(const basic_string<char_type, traits_type, _SAlloc>& __s) {1117    __sb_.str(__s);1118  }1119 1120  _LIBCPP_HIDE_FROM_ABI void str(string_type&& __s) { __sb_.str(std::move(__s)); }1121#    endif // _LIBCPP_STD_VER >= 201122 1123#    if _LIBCPP_STD_VER >= 261124  template <class _Tp>1125    requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>1126  _LIBCPP_HIDE_FROM_ABI void str(const _Tp& __t) {1127    rdbuf()->str(__t);1128  }1129#    endif //  _LIBCPP_STD_VER >= 261130};1131 1132template <class _CharT, class _Traits, class _Allocator>1133inline _LIBCPP_HIDE_FROM_ABI void1134swap(basic_ostringstream<_CharT, _Traits, _Allocator>& __x, basic_ostringstream<_CharT, _Traits, _Allocator>& __y) {1135  __x.swap(__y);1136}1137 1138// Class template basic_stringstream [stringstream]1139 1140template <class _CharT, class _Traits, class _Allocator>1141class basic_stringstream : public basic_iostream<_CharT, _Traits> {1142public:1143  typedef _CharT char_type;1144  typedef _Traits traits_type;1145  typedef typename traits_type::int_type int_type;1146  typedef typename traits_type::pos_type pos_type;1147  typedef typename traits_type::off_type off_type;1148  typedef _Allocator allocator_type;1149 1150  typedef basic_string<char_type, traits_type, allocator_type> string_type;1151 1152private:1153  basic_stringbuf<char_type, traits_type, allocator_type> __sb_;1154 1155public:1156  // [stringstream.cons] constructors1157  _LIBCPP_HIDE_FROM_ABI basic_stringstream()1158      : basic_iostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(ios_base::in | ios_base::out) {}1159 1160  _LIBCPP_HIDE_FROM_ABI explicit basic_stringstream(ios_base::openmode __wch)1161      : basic_iostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__wch) {}1162 1163  _LIBCPP_HIDE_FROM_ABI explicit basic_stringstream(const string_type& __s,1164                                                    ios_base::openmode __wch = ios_base::in | ios_base::out)1165      : basic_iostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__s, __wch) {}1166 1167#    if _LIBCPP_STD_VER >= 201168  _LIBCPP_HIDE_FROM_ABI basic_stringstream(ios_base::openmode __wch, const _Allocator& __a)1169      : basic_iostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__wch, __a) {}1170 1171  _LIBCPP_HIDE_FROM_ABI explicit basic_stringstream(string_type&& __s,1172                                                    ios_base::openmode __wch = ios_base::out | ios_base::in)1173      : basic_iostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(std::move(__s), __wch) {}1174 1175  template <class _SAlloc>1176  _LIBCPP_HIDE_FROM_ABI basic_stringstream(const basic_string<_CharT, _Traits, _SAlloc>& __s, const _Allocator& __a)1177      : basic_stringstream(__s, ios_base::out | ios_base::in, __a) {}1178 1179  template <class _SAlloc>1180  _LIBCPP_HIDE_FROM_ABI1181  basic_stringstream(const basic_string<_CharT, _Traits, _SAlloc>& __s, ios_base::openmode __wch, const _Allocator& __a)1182      : basic_iostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__s, __wch, __a) {}1183 1184  template <class _SAlloc>1185    requires(!is_same_v<_SAlloc, allocator_type>)1186  _LIBCPP_HIDE_FROM_ABI explicit basic_stringstream(const basic_string<_CharT, _Traits, _SAlloc>& __s,1187                                                    ios_base::openmode __wch = ios_base::out | ios_base::in)1188      : basic_iostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__s, __wch) {}1189#    endif // _LIBCPP_STD_VER >= 201190 1191#    if _LIBCPP_STD_VER >= 261192 1193  template <class _Tp>1194    requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>1195  _LIBCPP_HIDE_FROM_ABI explicit basic_stringstream(const _Tp& __t,1196                                                    ios_base::openmode __which = ios_base::out | ios_base::in)1197      : basic_stringstream(__t, __which, _Allocator()) {}1198 1199  template <class _Tp>1200    requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>1201  _LIBCPP_HIDE_FROM_ABI basic_stringstream(const _Tp& __t, const _Allocator& __a)1202      : basic_stringstream(__t, ios_base::out | ios_base::in, __a) {}1203 1204  template <class _Tp>1205    requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>1206  _LIBCPP_HIDE_FROM_ABI basic_stringstream(const _Tp& __t, ios_base::openmode __which, const _Allocator& __a)1207      : basic_iostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__t, __which, __a) {}1208 1209#    endif //  _LIBCPP_STD_VER >= 261210 1211  basic_stringstream(const basic_stringstream&) = delete;1212  _LIBCPP_HIDE_FROM_ABI basic_stringstream(basic_stringstream&& __rhs)1213      : basic_iostream<_CharT, _Traits>(std::move(__rhs)), __sb_(std::move(__rhs.__sb_)) {1214    basic_istream<_CharT, _Traits>::set_rdbuf(std::addressof(__sb_));1215  }1216 1217  // [stringstream.assign] Assign and swap:1218  basic_stringstream& operator=(const basic_stringstream&) = delete;1219  basic_stringstream& operator=(basic_stringstream&& __rhs) {1220    basic_iostream<char_type, traits_type>::operator=(std::move(__rhs));1221    __sb_ = std::move(__rhs.__sb_);1222    return *this;1223  }1224  _LIBCPP_HIDE_FROM_ABI void swap(basic_stringstream& __rhs) {1225    basic_iostream<char_type, traits_type>::swap(__rhs);1226    __sb_.swap(__rhs.__sb_);1227  }1228 1229  // [stringstream.members] Member functions:1230  _LIBCPP_HIDE_FROM_ABI basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const {1231    return const_cast<basic_stringbuf<char_type, traits_type, allocator_type>*>(std::addressof(__sb_));1232  }1233 1234#    if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_BUILDING_LIBRARY)1235  _LIBCPP_HIDE_FROM_ABI string_type str() const { return __sb_.str(); }1236#    else1237  _LIBCPP_HIDE_FROM_ABI string_type str() const& { return __sb_.str(); }1238 1239  _LIBCPP_HIDE_FROM_ABI string_type str() && { return std::move(__sb_).str(); }1240#    endif1241 1242#    if _LIBCPP_STD_VER >= 201243  template <class _SAlloc>1244    requires __is_allocator_v<_SAlloc>1245  _LIBCPP_HIDE_FROM_ABI basic_string<char_type, traits_type, _SAlloc> str(const _SAlloc& __sa) const {1246    return __sb_.str(__sa);1247  }1248 1249  _LIBCPP_HIDE_FROM_ABI basic_string_view<char_type, traits_type> view() const noexcept { return __sb_.view(); }1250#    endif // _LIBCPP_STD_VER >= 201251 1252  _LIBCPP_HIDE_FROM_ABI void str(const string_type& __s) { __sb_.str(__s); }1253 1254#    if _LIBCPP_STD_VER >= 201255  template <class _SAlloc>1256  _LIBCPP_HIDE_FROM_ABI void str(const basic_string<char_type, traits_type, _SAlloc>& __s) {1257    __sb_.str(__s);1258  }1259 1260  _LIBCPP_HIDE_FROM_ABI void str(string_type&& __s) { __sb_.str(std::move(__s)); }1261#    endif // _LIBCPP_STD_VER >= 201262 1263#    if _LIBCPP_STD_VER >= 261264  template <class _Tp>1265    requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>1266  _LIBCPP_HIDE_FROM_ABI void str(const _Tp& __t) {1267    rdbuf()->str(__t);1268  }1269#    endif //  _LIBCPP_STD_VER >= 261270};1271 1272template <class _CharT, class _Traits, class _Allocator>1273inline _LIBCPP_HIDE_FROM_ABI void1274swap(basic_stringstream<_CharT, _Traits, _Allocator>& __x, basic_stringstream<_CharT, _Traits, _Allocator>& __y) {1275  __x.swap(__y);1276}1277 1278#    if _LIBCPP_AVAILABILITY_HAS_ADDITIONAL_IOSTREAM_EXPLICIT_INSTANTIATIONS_11279extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_stringbuf<char>;1280extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_stringstream<char>;1281extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ostringstream<char>;1282extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istringstream<char>;1283#    endif1284 1285_LIBCPP_END_NAMESPACE_STD1286 1287_LIBCPP_POP_MACROS1288 1289#  endif // _LIBCPP_HAS_LOCALIZATION1290 1291#  if _LIBCPP_STD_VER <= 20 && !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES)1292#    include <ostream>1293#    include <type_traits>1294#  endif1295#endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)1296 1297#endif // _LIBCPP_SSTREAM1298