146035553Spatrick// -*- C++ -*- 2*4bdff4beSrobert//===----------------------------------------------------------------------===// 346035553Spatrick// 446035553Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 546035553Spatrick// See https://llvm.org/LICENSE.txt for license information. 646035553Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 746035553Spatrick// 846035553Spatrick//===----------------------------------------------------------------------===// 946035553Spatrick 1046035553Spatrick#ifndef _LIBCPP_SSTREAM 1146035553Spatrick#define _LIBCPP_SSTREAM 1246035553Spatrick 1346035553Spatrick/* 14*4bdff4beSrobert sstream synopsis [sstream.syn] 1546035553Spatrick 16*4bdff4beSrobert// Class template basic_stringbuf [stringbuf] 1746035553Spatricktemplate <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > 1846035553Spatrickclass basic_stringbuf 1946035553Spatrick : public basic_streambuf<charT, traits> 2046035553Spatrick{ 2146035553Spatrickpublic: 2246035553Spatrick typedef charT char_type; 2346035553Spatrick typedef traits traits_type; 2446035553Spatrick typedef typename traits_type::int_type int_type; 2546035553Spatrick typedef typename traits_type::pos_type pos_type; 2646035553Spatrick typedef typename traits_type::off_type off_type; 2746035553Spatrick typedef Allocator allocator_type; 2846035553Spatrick 29*4bdff4beSrobert // [stringbuf.cons] constructors: 3076d0caaeSpatrick explicit basic_stringbuf(ios_base::openmode which = ios_base::in | ios_base::out); // before C++20 3176d0caaeSpatrick basic_stringbuf() : basic_stringbuf(ios_base::in | ios_base::out) {} // C++20 3276d0caaeSpatrick explicit basic_stringbuf(ios_base::openmode which); // C++20 3346035553Spatrick explicit basic_stringbuf(const basic_string<char_type, traits_type, allocator_type>& str, 3446035553Spatrick ios_base::openmode which = ios_base::in | ios_base::out); 3546035553Spatrick basic_stringbuf(basic_stringbuf&& rhs); 3646035553Spatrick 37*4bdff4beSrobert // [stringbuf.assign] Assign and swap: 3846035553Spatrick basic_stringbuf& operator=(basic_stringbuf&& rhs); 3946035553Spatrick void swap(basic_stringbuf& rhs); 4046035553Spatrick 41*4bdff4beSrobert // [stringbuf.members] Member functions: 4246035553Spatrick basic_string<char_type, traits_type, allocator_type> str() const; 4346035553Spatrick void str(const basic_string<char_type, traits_type, allocator_type>& s); 4446035553Spatrick 4546035553Spatrickprotected: 46*4bdff4beSrobert // [stringbuf.virtuals] Overridden virtual functions: 4746035553Spatrick virtual int_type underflow(); 4846035553Spatrick virtual int_type pbackfail(int_type c = traits_type::eof()); 4946035553Spatrick virtual int_type overflow (int_type c = traits_type::eof()); 5046035553Spatrick virtual basic_streambuf<char_type, traits_type>* setbuf(char_type*, streamsize); 5146035553Spatrick virtual pos_type seekoff(off_type off, ios_base::seekdir way, 5246035553Spatrick ios_base::openmode which = ios_base::in | ios_base::out); 5346035553Spatrick virtual pos_type seekpos(pos_type sp, 5446035553Spatrick ios_base::openmode which = ios_base::in | ios_base::out); 5546035553Spatrick}; 5646035553Spatrick 57*4bdff4beSrobert// [stringbuf.assign] non member swap 5846035553Spatricktemplate <class charT, class traits, class Allocator> 5946035553Spatrick void swap(basic_stringbuf<charT, traits, Allocator>& x, 6046035553Spatrick basic_stringbuf<charT, traits, Allocator>& y); 6146035553Spatrick 6246035553Spatricktypedef basic_stringbuf<char> stringbuf; 6346035553Spatricktypedef basic_stringbuf<wchar_t> wstringbuf; 6446035553Spatrick 65*4bdff4beSrobert// Class template basic_istringstream [istringstream] 6646035553Spatricktemplate <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > 6746035553Spatrickclass basic_istringstream 6846035553Spatrick : public basic_istream<charT, traits> 6946035553Spatrick{ 7046035553Spatrickpublic: 7146035553Spatrick typedef charT char_type; 7246035553Spatrick typedef traits traits_type; 7346035553Spatrick typedef typename traits_type::int_type int_type; 7446035553Spatrick typedef typename traits_type::pos_type pos_type; 7546035553Spatrick typedef typename traits_type::off_type off_type; 7646035553Spatrick typedef Allocator allocator_type; 7746035553Spatrick 78*4bdff4beSrobert // [istringstream.cons] Constructors: 7976d0caaeSpatrick explicit basic_istringstream(ios_base::openmode which = ios_base::in); // before C++20 8076d0caaeSpatrick basic_istringstream() : basic_istringstream(ios_base::in) {} // C++20 8176d0caaeSpatrick explicit basic_istringstream(ios_base::openmode which); // C++20 8276d0caaeSpatrick 8346035553Spatrick explicit basic_istringstream(const basic_string<char_type, traits_type,allocator_type>& str, 8446035553Spatrick ios_base::openmode which = ios_base::in); 8546035553Spatrick basic_istringstream(basic_istringstream&& rhs); 8646035553Spatrick 87*4bdff4beSrobert // [istringstream.assign] Assign and swap: 8846035553Spatrick basic_istringstream& operator=(basic_istringstream&& rhs); 8946035553Spatrick void swap(basic_istringstream& rhs); 9046035553Spatrick 91*4bdff4beSrobert // [istringstream.members] Member functions: 9246035553Spatrick basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const; 9346035553Spatrick basic_string<char_type, traits_type, allocator_type> str() const; 9446035553Spatrick void str(const basic_string<char_type, traits_type, allocator_type>& s); 9546035553Spatrick}; 9646035553Spatrick 9746035553Spatricktemplate <class charT, class traits, class Allocator> 9846035553Spatrick void swap(basic_istringstream<charT, traits, Allocator>& x, 9946035553Spatrick basic_istringstream<charT, traits, Allocator>& y); 10046035553Spatrick 10146035553Spatricktypedef basic_istringstream<char> istringstream; 10246035553Spatricktypedef basic_istringstream<wchar_t> wistringstream; 10346035553Spatrick 104*4bdff4beSrobert// Class template basic_ostringstream [ostringstream] 10546035553Spatricktemplate <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > 10646035553Spatrickclass basic_ostringstream 10746035553Spatrick : public basic_ostream<charT, traits> 10846035553Spatrick{ 10946035553Spatrickpublic: 11046035553Spatrick // types: 11146035553Spatrick typedef charT char_type; 11246035553Spatrick typedef traits traits_type; 11346035553Spatrick typedef typename traits_type::int_type int_type; 11446035553Spatrick typedef typename traits_type::pos_type pos_type; 11546035553Spatrick typedef typename traits_type::off_type off_type; 11646035553Spatrick typedef Allocator allocator_type; 11746035553Spatrick 118*4bdff4beSrobert // [ostringstream.cons] Constructors: 11976d0caaeSpatrick explicit basic_ostringstream(ios_base::openmode which = ios_base::out); // before C++20 12076d0caaeSpatrick basic_ostringstream() : basic_ostringstream(ios_base::out) {} // C++20 12176d0caaeSpatrick explicit basic_ostringstream(ios_base::openmode which); // C++20 12276d0caaeSpatrick 12346035553Spatrick explicit basic_ostringstream(const basic_string<char_type, traits_type, allocator_type>& str, 12446035553Spatrick ios_base::openmode which = ios_base::out); 12546035553Spatrick basic_ostringstream(basic_ostringstream&& rhs); 12646035553Spatrick 127*4bdff4beSrobert // [ostringstream.assign] Assign and swap: 12846035553Spatrick basic_ostringstream& operator=(basic_ostringstream&& rhs); 12946035553Spatrick void swap(basic_ostringstream& rhs); 13046035553Spatrick 131*4bdff4beSrobert // [ostringstream.members] Member functions: 13246035553Spatrick basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const; 13346035553Spatrick basic_string<char_type, traits_type, allocator_type> str() const; 13446035553Spatrick void str(const basic_string<char_type, traits_type, allocator_type>& s); 13546035553Spatrick}; 13646035553Spatrick 13746035553Spatricktemplate <class charT, class traits, class Allocator> 13846035553Spatrick void swap(basic_ostringstream<charT, traits, Allocator>& x, 13946035553Spatrick basic_ostringstream<charT, traits, Allocator>& y); 14046035553Spatrick 14146035553Spatricktypedef basic_ostringstream<char> ostringstream; 14246035553Spatricktypedef basic_ostringstream<wchar_t> wostringstream; 14346035553Spatrick 144*4bdff4beSrobert// Class template basic_stringstream [stringstream] 14546035553Spatricktemplate <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > 14646035553Spatrickclass basic_stringstream 14746035553Spatrick : public basic_iostream<charT, traits> 14846035553Spatrick{ 14946035553Spatrickpublic: 15046035553Spatrick // types: 15146035553Spatrick typedef charT char_type; 15246035553Spatrick typedef traits traits_type; 15346035553Spatrick typedef typename traits_type::int_type int_type; 15446035553Spatrick typedef typename traits_type::pos_type pos_type; 15546035553Spatrick typedef typename traits_type::off_type off_type; 15646035553Spatrick typedef Allocator allocator_type; 15746035553Spatrick 158*4bdff4beSrobert // [stringstream.cons] constructors 15976d0caaeSpatrick explicit basic_stringstream(ios_base::openmode which = ios_base::out | ios_base::in); // before C++20 16076d0caaeSpatrick basic_stringstream() : basic_stringstream(ios_base::out | ios_base::in) {} // C++20 16176d0caaeSpatrick explicit basic_stringstream(ios_base::openmode which); // C++20 16276d0caaeSpatrick 16346035553Spatrick explicit basic_stringstream(const basic_string<char_type, traits_type, allocator_type>& str, 16446035553Spatrick ios_base::openmode which = ios_base::out|ios_base::in); 16546035553Spatrick basic_stringstream(basic_stringstream&& rhs); 16646035553Spatrick 167*4bdff4beSrobert // [stringstream.assign] Assign and swap: 16846035553Spatrick basic_stringstream& operator=(basic_stringstream&& rhs); 16946035553Spatrick void swap(basic_stringstream& rhs); 17046035553Spatrick 171*4bdff4beSrobert // [stringstream.members] Member functions: 17246035553Spatrick basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const; 17346035553Spatrick basic_string<char_type, traits_type, allocator_type> str() const; 17446035553Spatrick void str(const basic_string<char_type, traits_type, allocator_type>& str); 17546035553Spatrick}; 17646035553Spatrick 17746035553Spatricktemplate <class charT, class traits, class Allocator> 17846035553Spatrick void swap(basic_stringstream<charT, traits, Allocator>& x, 17946035553Spatrick basic_stringstream<charT, traits, Allocator>& y); 18046035553Spatrick 18146035553Spatricktypedef basic_stringstream<char> stringstream; 18246035553Spatricktypedef basic_stringstream<wchar_t> wstringstream; 18346035553Spatrick 18446035553Spatrick} // std 18546035553Spatrick 18646035553Spatrick*/ 18746035553Spatrick 188*4bdff4beSrobert#include <__assert> // all public C++ headers provide the assertion handler 18946035553Spatrick#include <__config> 190*4bdff4beSrobert#include <__utility/swap.h> 19146035553Spatrick#include <istream> 19276d0caaeSpatrick#include <ostream> 19346035553Spatrick#include <string> 194*4bdff4beSrobert#include <version> 19546035553Spatrick 19646035553Spatrick#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 19746035553Spatrick# pragma GCC system_header 19846035553Spatrick#endif 19946035553Spatrick 20046035553Spatrick_LIBCPP_PUSH_MACROS 20146035553Spatrick#include <__undef_macros> 20246035553Spatrick 20346035553Spatrick 20446035553Spatrick_LIBCPP_BEGIN_NAMESPACE_STD 20546035553Spatrick 206*4bdff4beSrobert// Class template basic_stringbuf [stringbuf] 20746035553Spatrick 20846035553Spatricktemplate <class _CharT, class _Traits, class _Allocator> 20946035553Spatrickclass _LIBCPP_TEMPLATE_VIS basic_stringbuf 21046035553Spatrick : public basic_streambuf<_CharT, _Traits> 21146035553Spatrick{ 21246035553Spatrickpublic: 21346035553Spatrick typedef _CharT char_type; 21446035553Spatrick typedef _Traits traits_type; 21546035553Spatrick typedef typename traits_type::int_type int_type; 21646035553Spatrick typedef typename traits_type::pos_type pos_type; 21746035553Spatrick typedef typename traits_type::off_type off_type; 21846035553Spatrick typedef _Allocator allocator_type; 21946035553Spatrick 22046035553Spatrick typedef basic_string<char_type, traits_type, allocator_type> string_type; 22146035553Spatrick 22246035553Spatrickprivate: 22346035553Spatrick 22446035553Spatrick string_type __str_; 22546035553Spatrick mutable char_type* __hm_; 22646035553Spatrick ios_base::openmode __mode_; 22746035553Spatrick 22846035553Spatrickpublic: 229*4bdff4beSrobert // [stringbuf.cons] constructors: 23076d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY 23176d0caaeSpatrick basic_stringbuf() 23276d0caaeSpatrick : __hm_(nullptr), __mode_(ios_base::in | ios_base::out) {} 23376d0caaeSpatrick 23476d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY 23576d0caaeSpatrick explicit basic_stringbuf(ios_base::openmode __wch) 23676d0caaeSpatrick : __hm_(nullptr), __mode_(__wch) {} 23776d0caaeSpatrick 23876d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY 23946035553Spatrick explicit basic_stringbuf(const string_type& __s, 24076d0caaeSpatrick ios_base::openmode __wch = ios_base::in | ios_base::out) 24176d0caaeSpatrick : __str_(__s.get_allocator()), __hm_(nullptr), __mode_(__wch) 24276d0caaeSpatrick { 24376d0caaeSpatrick str(__s); 24476d0caaeSpatrick } 24576d0caaeSpatrick 24646035553Spatrick basic_stringbuf(basic_stringbuf&& __rhs); 24746035553Spatrick 248*4bdff4beSrobert // [stringbuf.assign] Assign and swap: 24946035553Spatrick basic_stringbuf& operator=(basic_stringbuf&& __rhs); 25046035553Spatrick void swap(basic_stringbuf& __rhs); 25146035553Spatrick 252*4bdff4beSrobert // [stringbuf.members] Member functions: 25346035553Spatrick string_type str() const; 25446035553Spatrick void str(const string_type& __s); 25546035553Spatrick 25646035553Spatrickprotected: 257*4bdff4beSrobert // [stringbuf.virtuals] Overridden virtual functions: 258*4bdff4beSrobert int_type underflow() override; 259*4bdff4beSrobert int_type pbackfail(int_type __c = traits_type::eof()) override; 260*4bdff4beSrobert int_type overflow (int_type __c = traits_type::eof()) override; 261*4bdff4beSrobert pos_type seekoff(off_type __off, ios_base::seekdir __way, 262*4bdff4beSrobert ios_base::openmode __wch = ios_base::in | ios_base::out) override; 263*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI_VIRTUAL 264*4bdff4beSrobert pos_type seekpos(pos_type __sp, 265*4bdff4beSrobert ios_base::openmode __wch = ios_base::in | ios_base::out) override { 26676d0caaeSpatrick return seekoff(__sp, ios_base::beg, __wch); 26776d0caaeSpatrick } 26846035553Spatrick}; 26946035553Spatrick 27046035553Spatricktemplate <class _CharT, class _Traits, class _Allocator> 27146035553Spatrickbasic_stringbuf<_CharT, _Traits, _Allocator>::basic_stringbuf(basic_stringbuf&& __rhs) 27246035553Spatrick : __mode_(__rhs.__mode_) 27346035553Spatrick{ 27446035553Spatrick char_type* __p = const_cast<char_type*>(__rhs.__str_.data()); 27546035553Spatrick ptrdiff_t __binp = -1; 27646035553Spatrick ptrdiff_t __ninp = -1; 27746035553Spatrick ptrdiff_t __einp = -1; 27846035553Spatrick if (__rhs.eback() != nullptr) 27946035553Spatrick { 28046035553Spatrick __binp = __rhs.eback() - __p; 28146035553Spatrick __ninp = __rhs.gptr() - __p; 28246035553Spatrick __einp = __rhs.egptr() - __p; 28346035553Spatrick } 28446035553Spatrick ptrdiff_t __bout = -1; 28546035553Spatrick ptrdiff_t __nout = -1; 28646035553Spatrick ptrdiff_t __eout = -1; 28746035553Spatrick if (__rhs.pbase() != nullptr) 28846035553Spatrick { 28946035553Spatrick __bout = __rhs.pbase() - __p; 29046035553Spatrick __nout = __rhs.pptr() - __p; 29146035553Spatrick __eout = __rhs.epptr() - __p; 29246035553Spatrick } 29346035553Spatrick ptrdiff_t __hm = __rhs.__hm_ == nullptr ? -1 : __rhs.__hm_ - __p; 29446035553Spatrick __str_ = _VSTD::move(__rhs.__str_); 29546035553Spatrick __p = const_cast<char_type*>(__str_.data()); 29646035553Spatrick if (__binp != -1) 29746035553Spatrick this->setg(__p + __binp, __p + __ninp, __p + __einp); 29846035553Spatrick if (__bout != -1) 29946035553Spatrick { 30046035553Spatrick this->setp(__p + __bout, __p + __eout); 30146035553Spatrick this->__pbump(__nout); 30246035553Spatrick } 30346035553Spatrick __hm_ = __hm == -1 ? nullptr : __p + __hm; 30446035553Spatrick __p = const_cast<char_type*>(__rhs.__str_.data()); 30546035553Spatrick __rhs.setg(__p, __p, __p); 30646035553Spatrick __rhs.setp(__p, __p); 30746035553Spatrick __rhs.__hm_ = __p; 30846035553Spatrick this->pubimbue(__rhs.getloc()); 30946035553Spatrick} 31046035553Spatrick 31146035553Spatricktemplate <class _CharT, class _Traits, class _Allocator> 31246035553Spatrickbasic_stringbuf<_CharT, _Traits, _Allocator>& 31346035553Spatrickbasic_stringbuf<_CharT, _Traits, _Allocator>::operator=(basic_stringbuf&& __rhs) 31446035553Spatrick{ 31546035553Spatrick char_type* __p = const_cast<char_type*>(__rhs.__str_.data()); 31646035553Spatrick ptrdiff_t __binp = -1; 31746035553Spatrick ptrdiff_t __ninp = -1; 31846035553Spatrick ptrdiff_t __einp = -1; 31946035553Spatrick if (__rhs.eback() != nullptr) 32046035553Spatrick { 32146035553Spatrick __binp = __rhs.eback() - __p; 32246035553Spatrick __ninp = __rhs.gptr() - __p; 32346035553Spatrick __einp = __rhs.egptr() - __p; 32446035553Spatrick } 32546035553Spatrick ptrdiff_t __bout = -1; 32646035553Spatrick ptrdiff_t __nout = -1; 32746035553Spatrick ptrdiff_t __eout = -1; 32846035553Spatrick if (__rhs.pbase() != nullptr) 32946035553Spatrick { 33046035553Spatrick __bout = __rhs.pbase() - __p; 33146035553Spatrick __nout = __rhs.pptr() - __p; 33246035553Spatrick __eout = __rhs.epptr() - __p; 33346035553Spatrick } 33446035553Spatrick ptrdiff_t __hm = __rhs.__hm_ == nullptr ? -1 : __rhs.__hm_ - __p; 33546035553Spatrick __str_ = _VSTD::move(__rhs.__str_); 33646035553Spatrick __p = const_cast<char_type*>(__str_.data()); 33746035553Spatrick if (__binp != -1) 33846035553Spatrick this->setg(__p + __binp, __p + __ninp, __p + __einp); 33946035553Spatrick else 34046035553Spatrick this->setg(nullptr, nullptr, nullptr); 34146035553Spatrick if (__bout != -1) 34246035553Spatrick { 34346035553Spatrick this->setp(__p + __bout, __p + __eout); 34446035553Spatrick this->__pbump(__nout); 34546035553Spatrick } 34646035553Spatrick else 34746035553Spatrick this->setp(nullptr, nullptr); 34846035553Spatrick 34946035553Spatrick __hm_ = __hm == -1 ? nullptr : __p + __hm; 35046035553Spatrick __mode_ = __rhs.__mode_; 35146035553Spatrick __p = const_cast<char_type*>(__rhs.__str_.data()); 35246035553Spatrick __rhs.setg(__p, __p, __p); 35346035553Spatrick __rhs.setp(__p, __p); 35446035553Spatrick __rhs.__hm_ = __p; 35546035553Spatrick this->pubimbue(__rhs.getloc()); 35646035553Spatrick return *this; 35746035553Spatrick} 35846035553Spatrick 35946035553Spatricktemplate <class _CharT, class _Traits, class _Allocator> 36046035553Spatrickvoid 36146035553Spatrickbasic_stringbuf<_CharT, _Traits, _Allocator>::swap(basic_stringbuf& __rhs) 36246035553Spatrick{ 36346035553Spatrick char_type* __p = const_cast<char_type*>(__rhs.__str_.data()); 36446035553Spatrick ptrdiff_t __rbinp = -1; 36546035553Spatrick ptrdiff_t __rninp = -1; 36646035553Spatrick ptrdiff_t __reinp = -1; 36746035553Spatrick if (__rhs.eback() != nullptr) 36846035553Spatrick { 36946035553Spatrick __rbinp = __rhs.eback() - __p; 37046035553Spatrick __rninp = __rhs.gptr() - __p; 37146035553Spatrick __reinp = __rhs.egptr() - __p; 37246035553Spatrick } 37346035553Spatrick ptrdiff_t __rbout = -1; 37446035553Spatrick ptrdiff_t __rnout = -1; 37546035553Spatrick ptrdiff_t __reout = -1; 37646035553Spatrick if (__rhs.pbase() != nullptr) 37746035553Spatrick { 37846035553Spatrick __rbout = __rhs.pbase() - __p; 37946035553Spatrick __rnout = __rhs.pptr() - __p; 38046035553Spatrick __reout = __rhs.epptr() - __p; 38146035553Spatrick } 38246035553Spatrick ptrdiff_t __rhm = __rhs.__hm_ == nullptr ? -1 : __rhs.__hm_ - __p; 38346035553Spatrick __p = const_cast<char_type*>(__str_.data()); 38446035553Spatrick ptrdiff_t __lbinp = -1; 38546035553Spatrick ptrdiff_t __lninp = -1; 38646035553Spatrick ptrdiff_t __leinp = -1; 38746035553Spatrick if (this->eback() != nullptr) 38846035553Spatrick { 38946035553Spatrick __lbinp = this->eback() - __p; 39046035553Spatrick __lninp = this->gptr() - __p; 39146035553Spatrick __leinp = this->egptr() - __p; 39246035553Spatrick } 39346035553Spatrick ptrdiff_t __lbout = -1; 39446035553Spatrick ptrdiff_t __lnout = -1; 39546035553Spatrick ptrdiff_t __leout = -1; 39646035553Spatrick if (this->pbase() != nullptr) 39746035553Spatrick { 39846035553Spatrick __lbout = this->pbase() - __p; 39946035553Spatrick __lnout = this->pptr() - __p; 40046035553Spatrick __leout = this->epptr() - __p; 40146035553Spatrick } 40246035553Spatrick ptrdiff_t __lhm = __hm_ == nullptr ? -1 : __hm_ - __p; 40346035553Spatrick _VSTD::swap(__mode_, __rhs.__mode_); 40446035553Spatrick __str_.swap(__rhs.__str_); 40546035553Spatrick __p = const_cast<char_type*>(__str_.data()); 40646035553Spatrick if (__rbinp != -1) 40746035553Spatrick this->setg(__p + __rbinp, __p + __rninp, __p + __reinp); 40846035553Spatrick else 40946035553Spatrick this->setg(nullptr, nullptr, nullptr); 41046035553Spatrick if (__rbout != -1) 41146035553Spatrick { 41246035553Spatrick this->setp(__p + __rbout, __p + __reout); 41346035553Spatrick this->__pbump(__rnout); 41446035553Spatrick } 41546035553Spatrick else 41646035553Spatrick this->setp(nullptr, nullptr); 41746035553Spatrick __hm_ = __rhm == -1 ? nullptr : __p + __rhm; 41846035553Spatrick __p = const_cast<char_type*>(__rhs.__str_.data()); 41946035553Spatrick if (__lbinp != -1) 42046035553Spatrick __rhs.setg(__p + __lbinp, __p + __lninp, __p + __leinp); 42146035553Spatrick else 42246035553Spatrick __rhs.setg(nullptr, nullptr, nullptr); 42346035553Spatrick if (__lbout != -1) 42446035553Spatrick { 42546035553Spatrick __rhs.setp(__p + __lbout, __p + __leout); 42646035553Spatrick __rhs.__pbump(__lnout); 42746035553Spatrick } 42846035553Spatrick else 42946035553Spatrick __rhs.setp(nullptr, nullptr); 43046035553Spatrick __rhs.__hm_ = __lhm == -1 ? nullptr : __p + __lhm; 43146035553Spatrick locale __tl = __rhs.getloc(); 43246035553Spatrick __rhs.pubimbue(this->getloc()); 43346035553Spatrick this->pubimbue(__tl); 43446035553Spatrick} 43546035553Spatrick 43646035553Spatricktemplate <class _CharT, class _Traits, class _Allocator> 43746035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 43846035553Spatrickvoid 43946035553Spatrickswap(basic_stringbuf<_CharT, _Traits, _Allocator>& __x, 44046035553Spatrick basic_stringbuf<_CharT, _Traits, _Allocator>& __y) 44146035553Spatrick{ 44246035553Spatrick __x.swap(__y); 44346035553Spatrick} 44446035553Spatrick 44546035553Spatricktemplate <class _CharT, class _Traits, class _Allocator> 44646035553Spatrickbasic_string<_CharT, _Traits, _Allocator> 44746035553Spatrickbasic_stringbuf<_CharT, _Traits, _Allocator>::str() const 44846035553Spatrick{ 44946035553Spatrick if (__mode_ & ios_base::out) 45046035553Spatrick { 45146035553Spatrick if (__hm_ < this->pptr()) 45246035553Spatrick __hm_ = this->pptr(); 45346035553Spatrick return string_type(this->pbase(), __hm_, __str_.get_allocator()); 45446035553Spatrick } 45546035553Spatrick else if (__mode_ & ios_base::in) 45646035553Spatrick return string_type(this->eback(), this->egptr(), __str_.get_allocator()); 45746035553Spatrick return string_type(__str_.get_allocator()); 45846035553Spatrick} 45946035553Spatrick 46046035553Spatricktemplate <class _CharT, class _Traits, class _Allocator> 46146035553Spatrickvoid 46246035553Spatrickbasic_stringbuf<_CharT, _Traits, _Allocator>::str(const string_type& __s) 46346035553Spatrick{ 46446035553Spatrick __str_ = __s; 46576d0caaeSpatrick __hm_ = nullptr; 46646035553Spatrick if (__mode_ & ios_base::in) 46746035553Spatrick { 46846035553Spatrick __hm_ = const_cast<char_type*>(__str_.data()) + __str_.size(); 46946035553Spatrick this->setg(const_cast<char_type*>(__str_.data()), 47046035553Spatrick const_cast<char_type*>(__str_.data()), 47146035553Spatrick __hm_); 47246035553Spatrick } 47346035553Spatrick if (__mode_ & ios_base::out) 47446035553Spatrick { 47546035553Spatrick typename string_type::size_type __sz = __str_.size(); 47646035553Spatrick __hm_ = const_cast<char_type*>(__str_.data()) + __sz; 47746035553Spatrick __str_.resize(__str_.capacity()); 47846035553Spatrick this->setp(const_cast<char_type*>(__str_.data()), 47946035553Spatrick const_cast<char_type*>(__str_.data()) + __str_.size()); 48046035553Spatrick if (__mode_ & (ios_base::app | ios_base::ate)) 48146035553Spatrick { 48246035553Spatrick while (__sz > INT_MAX) 48346035553Spatrick { 48446035553Spatrick this->pbump(INT_MAX); 48546035553Spatrick __sz -= INT_MAX; 48646035553Spatrick } 48746035553Spatrick if (__sz > 0) 48846035553Spatrick this->pbump(__sz); 48946035553Spatrick } 49046035553Spatrick } 49146035553Spatrick} 49246035553Spatrick 49346035553Spatricktemplate <class _CharT, class _Traits, class _Allocator> 49446035553Spatricktypename basic_stringbuf<_CharT, _Traits, _Allocator>::int_type 49546035553Spatrickbasic_stringbuf<_CharT, _Traits, _Allocator>::underflow() 49646035553Spatrick{ 49746035553Spatrick if (__hm_ < this->pptr()) 49846035553Spatrick __hm_ = this->pptr(); 49946035553Spatrick if (__mode_ & ios_base::in) 50046035553Spatrick { 50146035553Spatrick if (this->egptr() < __hm_) 50246035553Spatrick this->setg(this->eback(), this->gptr(), __hm_); 50346035553Spatrick if (this->gptr() < this->egptr()) 50446035553Spatrick return traits_type::to_int_type(*this->gptr()); 50546035553Spatrick } 50646035553Spatrick return traits_type::eof(); 50746035553Spatrick} 50846035553Spatrick 50946035553Spatricktemplate <class _CharT, class _Traits, class _Allocator> 51046035553Spatricktypename basic_stringbuf<_CharT, _Traits, _Allocator>::int_type 51146035553Spatrickbasic_stringbuf<_CharT, _Traits, _Allocator>::pbackfail(int_type __c) 51246035553Spatrick{ 51346035553Spatrick if (__hm_ < this->pptr()) 51446035553Spatrick __hm_ = this->pptr(); 51546035553Spatrick if (this->eback() < this->gptr()) 51646035553Spatrick { 51746035553Spatrick if (traits_type::eq_int_type(__c, traits_type::eof())) 51846035553Spatrick { 51946035553Spatrick this->setg(this->eback(), this->gptr()-1, __hm_); 52046035553Spatrick return traits_type::not_eof(__c); 52146035553Spatrick } 52246035553Spatrick if ((__mode_ & ios_base::out) || 52346035553Spatrick traits_type::eq(traits_type::to_char_type(__c), this->gptr()[-1])) 52446035553Spatrick { 52546035553Spatrick this->setg(this->eback(), this->gptr()-1, __hm_); 52646035553Spatrick *this->gptr() = traits_type::to_char_type(__c); 52746035553Spatrick return __c; 52846035553Spatrick } 52946035553Spatrick } 53046035553Spatrick return traits_type::eof(); 53146035553Spatrick} 53246035553Spatrick 53346035553Spatricktemplate <class _CharT, class _Traits, class _Allocator> 53446035553Spatricktypename basic_stringbuf<_CharT, _Traits, _Allocator>::int_type 53546035553Spatrickbasic_stringbuf<_CharT, _Traits, _Allocator>::overflow(int_type __c) 53646035553Spatrick{ 53746035553Spatrick if (!traits_type::eq_int_type(__c, traits_type::eof())) 53846035553Spatrick { 53946035553Spatrick ptrdiff_t __ninp = this->gptr() - this->eback(); 54046035553Spatrick if (this->pptr() == this->epptr()) 54146035553Spatrick { 54246035553Spatrick if (!(__mode_ & ios_base::out)) 54346035553Spatrick return traits_type::eof(); 54446035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS 54546035553Spatrick try 54646035553Spatrick { 54746035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS 54846035553Spatrick ptrdiff_t __nout = this->pptr() - this->pbase(); 54946035553Spatrick ptrdiff_t __hm = __hm_ - this->pbase(); 55046035553Spatrick __str_.push_back(char_type()); 55146035553Spatrick __str_.resize(__str_.capacity()); 55246035553Spatrick char_type* __p = const_cast<char_type*>(__str_.data()); 55346035553Spatrick this->setp(__p, __p + __str_.size()); 55446035553Spatrick this->__pbump(__nout); 55546035553Spatrick __hm_ = this->pbase() + __hm; 55646035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS 55746035553Spatrick } 55846035553Spatrick catch (...) 55946035553Spatrick { 56046035553Spatrick return traits_type::eof(); 56146035553Spatrick } 56246035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS 56346035553Spatrick } 56446035553Spatrick __hm_ = _VSTD::max(this->pptr() + 1, __hm_); 56546035553Spatrick if (__mode_ & ios_base::in) 56646035553Spatrick { 56746035553Spatrick char_type* __p = const_cast<char_type*>(__str_.data()); 56846035553Spatrick this->setg(__p, __p + __ninp, __hm_); 56946035553Spatrick } 57046035553Spatrick return this->sputc(traits_type::to_char_type(__c)); 57146035553Spatrick } 57246035553Spatrick return traits_type::not_eof(__c); 57346035553Spatrick} 57446035553Spatrick 57546035553Spatricktemplate <class _CharT, class _Traits, class _Allocator> 57646035553Spatricktypename basic_stringbuf<_CharT, _Traits, _Allocator>::pos_type 57746035553Spatrickbasic_stringbuf<_CharT, _Traits, _Allocator>::seekoff(off_type __off, 57846035553Spatrick ios_base::seekdir __way, 57946035553Spatrick ios_base::openmode __wch) 58046035553Spatrick{ 58146035553Spatrick if (__hm_ < this->pptr()) 58246035553Spatrick __hm_ = this->pptr(); 58346035553Spatrick if ((__wch & (ios_base::in | ios_base::out)) == 0) 58446035553Spatrick return pos_type(-1); 58546035553Spatrick if ((__wch & (ios_base::in | ios_base::out)) == (ios_base::in | ios_base::out) 58646035553Spatrick && __way == ios_base::cur) 58746035553Spatrick return pos_type(-1); 58846035553Spatrick const ptrdiff_t __hm = __hm_ == nullptr ? 0 : __hm_ - __str_.data(); 58946035553Spatrick off_type __noff; 59046035553Spatrick switch (__way) 59146035553Spatrick { 59246035553Spatrick case ios_base::beg: 59346035553Spatrick __noff = 0; 59446035553Spatrick break; 59546035553Spatrick case ios_base::cur: 59646035553Spatrick if (__wch & ios_base::in) 59746035553Spatrick __noff = this->gptr() - this->eback(); 59846035553Spatrick else 59946035553Spatrick __noff = this->pptr() - this->pbase(); 60046035553Spatrick break; 60146035553Spatrick case ios_base::end: 60246035553Spatrick __noff = __hm; 60346035553Spatrick break; 60446035553Spatrick default: 60546035553Spatrick return pos_type(-1); 60646035553Spatrick } 60746035553Spatrick __noff += __off; 60846035553Spatrick if (__noff < 0 || __hm < __noff) 60946035553Spatrick return pos_type(-1); 61046035553Spatrick if (__noff != 0) 61146035553Spatrick { 61276d0caaeSpatrick if ((__wch & ios_base::in) && this->gptr() == nullptr) 61346035553Spatrick return pos_type(-1); 61476d0caaeSpatrick if ((__wch & ios_base::out) && this->pptr() == nullptr) 61546035553Spatrick return pos_type(-1); 61646035553Spatrick } 61746035553Spatrick if (__wch & ios_base::in) 61846035553Spatrick this->setg(this->eback(), this->eback() + __noff, __hm_); 61946035553Spatrick if (__wch & ios_base::out) 62046035553Spatrick { 62146035553Spatrick this->setp(this->pbase(), this->epptr()); 62246035553Spatrick this->pbump(__noff); 62346035553Spatrick } 62446035553Spatrick return pos_type(__noff); 62546035553Spatrick} 62646035553Spatrick 627*4bdff4beSrobert// Class template basic_istringstream [istringstream] 62846035553Spatrick 62946035553Spatricktemplate <class _CharT, class _Traits, class _Allocator> 63046035553Spatrickclass _LIBCPP_TEMPLATE_VIS basic_istringstream 63146035553Spatrick : public basic_istream<_CharT, _Traits> 63246035553Spatrick{ 63346035553Spatrickpublic: 63446035553Spatrick typedef _CharT char_type; 63546035553Spatrick typedef _Traits traits_type; 63646035553Spatrick typedef typename traits_type::int_type int_type; 63746035553Spatrick typedef typename traits_type::pos_type pos_type; 63846035553Spatrick typedef typename traits_type::off_type off_type; 63946035553Spatrick typedef _Allocator allocator_type; 64046035553Spatrick 64146035553Spatrick typedef basic_string<char_type, traits_type, allocator_type> string_type; 64246035553Spatrick 64346035553Spatrickprivate: 64446035553Spatrick basic_stringbuf<char_type, traits_type, allocator_type> __sb_; 64546035553Spatrick 64646035553Spatrickpublic: 647*4bdff4beSrobert // [istringstream.cons] Constructors: 64876d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY 64976d0caaeSpatrick basic_istringstream() 65076d0caaeSpatrick : basic_istream<_CharT, _Traits>(&__sb_), __sb_(ios_base::in) {} 65176d0caaeSpatrick 65276d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY 65376d0caaeSpatrick explicit basic_istringstream(ios_base::openmode __wch) 65476d0caaeSpatrick : basic_istream<_CharT, _Traits>(&__sb_), __sb_(__wch | ios_base::in) {} 65576d0caaeSpatrick 65676d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY 65746035553Spatrick explicit basic_istringstream(const string_type& __s, 65876d0caaeSpatrick ios_base::openmode __wch = ios_base::in) 65976d0caaeSpatrick : basic_istream<_CharT, _Traits>(&__sb_) 66076d0caaeSpatrick , __sb_(__s, __wch | ios_base::in) 66176d0caaeSpatrick { } 66246035553Spatrick 66376d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY 66476d0caaeSpatrick basic_istringstream(basic_istringstream&& __rhs) 66576d0caaeSpatrick : basic_istream<_CharT, _Traits>(_VSTD::move(__rhs)) 66676d0caaeSpatrick , __sb_(_VSTD::move(__rhs.__sb_)) 66746035553Spatrick { 66846035553Spatrick basic_istream<_CharT, _Traits>::set_rdbuf(&__sb_); 66946035553Spatrick } 67046035553Spatrick 671*4bdff4beSrobert // [istringstream.assign] Assign and swap: 67276d0caaeSpatrick basic_istringstream& operator=(basic_istringstream&& __rhs) { 67346035553Spatrick basic_istream<char_type, traits_type>::operator=(_VSTD::move(__rhs)); 67446035553Spatrick __sb_ = _VSTD::move(__rhs.__sb_); 67546035553Spatrick return *this; 67646035553Spatrick } 67776d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY 67876d0caaeSpatrick void swap(basic_istringstream& __rhs) { 67946035553Spatrick basic_istream<char_type, traits_type>::swap(__rhs); 68046035553Spatrick __sb_.swap(__rhs.__sb_); 68146035553Spatrick } 68246035553Spatrick 683*4bdff4beSrobert // [istringstream.members] Member functions: 68476d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY 68576d0caaeSpatrick basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const { 68676d0caaeSpatrick return const_cast<basic_stringbuf<char_type, traits_type, allocator_type>*>(&__sb_); 68776d0caaeSpatrick } 68876d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY 68976d0caaeSpatrick string_type str() const { 69076d0caaeSpatrick return __sb_.str(); 69176d0caaeSpatrick } 69276d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY 69376d0caaeSpatrick void str(const string_type& __s) { 69476d0caaeSpatrick __sb_.str(__s); 69576d0caaeSpatrick } 69676d0caaeSpatrick}; 69776d0caaeSpatrick 69846035553Spatricktemplate <class _CharT, class _Traits, class _Allocator> 69946035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 70046035553Spatrickvoid 70146035553Spatrickswap(basic_istringstream<_CharT, _Traits, _Allocator>& __x, 70246035553Spatrick basic_istringstream<_CharT, _Traits, _Allocator>& __y) 70346035553Spatrick{ 70446035553Spatrick __x.swap(__y); 70546035553Spatrick} 70646035553Spatrick 707*4bdff4beSrobert// Class template basic_ostringstream [ostringstream] 70846035553Spatrick 70946035553Spatricktemplate <class _CharT, class _Traits, class _Allocator> 71046035553Spatrickclass _LIBCPP_TEMPLATE_VIS basic_ostringstream 71146035553Spatrick : public basic_ostream<_CharT, _Traits> 71246035553Spatrick{ 71346035553Spatrickpublic: 71446035553Spatrick typedef _CharT char_type; 71546035553Spatrick typedef _Traits traits_type; 71646035553Spatrick typedef typename traits_type::int_type int_type; 71746035553Spatrick typedef typename traits_type::pos_type pos_type; 71846035553Spatrick typedef typename traits_type::off_type off_type; 71946035553Spatrick typedef _Allocator allocator_type; 72046035553Spatrick 72146035553Spatrick typedef basic_string<char_type, traits_type, allocator_type> string_type; 72246035553Spatrick 72346035553Spatrickprivate: 72446035553Spatrick basic_stringbuf<char_type, traits_type, allocator_type> __sb_; 72546035553Spatrick 72646035553Spatrickpublic: 727*4bdff4beSrobert // [ostringstream.cons] Constructors: 72876d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY 72976d0caaeSpatrick basic_ostringstream() 73076d0caaeSpatrick : basic_ostream<_CharT, _Traits>(&__sb_), __sb_(ios_base::out) {} 73176d0caaeSpatrick 73276d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY 73376d0caaeSpatrick explicit basic_ostringstream(ios_base::openmode __wch) 73476d0caaeSpatrick : basic_ostream<_CharT, _Traits>(&__sb_), __sb_(__wch | ios_base::out) {} 73576d0caaeSpatrick 73676d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY 73746035553Spatrick explicit basic_ostringstream(const string_type& __s, 73876d0caaeSpatrick ios_base::openmode __wch = ios_base::out) 73976d0caaeSpatrick : basic_ostream<_CharT, _Traits>(&__sb_) 74076d0caaeSpatrick , __sb_(__s, __wch | ios_base::out) 74176d0caaeSpatrick { } 74246035553Spatrick 74376d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY 74476d0caaeSpatrick basic_ostringstream(basic_ostringstream&& __rhs) 74576d0caaeSpatrick : basic_ostream<_CharT, _Traits>(_VSTD::move(__rhs)) 74676d0caaeSpatrick , __sb_(_VSTD::move(__rhs.__sb_)) 74746035553Spatrick { 74846035553Spatrick basic_ostream<_CharT, _Traits>::set_rdbuf(&__sb_); 74946035553Spatrick } 75046035553Spatrick 751*4bdff4beSrobert // [ostringstream.assign] Assign and swap: 75276d0caaeSpatrick basic_ostringstream& operator=(basic_ostringstream&& __rhs) { 75346035553Spatrick basic_ostream<char_type, traits_type>::operator=(_VSTD::move(__rhs)); 75446035553Spatrick __sb_ = _VSTD::move(__rhs.__sb_); 75546035553Spatrick return *this; 75646035553Spatrick } 75746035553Spatrick 75876d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY 75976d0caaeSpatrick void swap(basic_ostringstream& __rhs) { 76046035553Spatrick basic_ostream<char_type, traits_type>::swap(__rhs); 76146035553Spatrick __sb_.swap(__rhs.__sb_); 76246035553Spatrick } 76346035553Spatrick 764*4bdff4beSrobert // [ostringstream.members] Member functions: 76576d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY 76676d0caaeSpatrick basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const { 76776d0caaeSpatrick return const_cast<basic_stringbuf<char_type, traits_type, allocator_type>*>(&__sb_); 76876d0caaeSpatrick } 76976d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY 77076d0caaeSpatrick string_type str() const { 77176d0caaeSpatrick return __sb_.str(); 77276d0caaeSpatrick } 77376d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY 77476d0caaeSpatrick void str(const string_type& __s) { 77576d0caaeSpatrick __sb_.str(__s); 77676d0caaeSpatrick } 77776d0caaeSpatrick}; 77876d0caaeSpatrick 77946035553Spatricktemplate <class _CharT, class _Traits, class _Allocator> 78046035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 78146035553Spatrickvoid 78246035553Spatrickswap(basic_ostringstream<_CharT, _Traits, _Allocator>& __x, 78346035553Spatrick basic_ostringstream<_CharT, _Traits, _Allocator>& __y) 78446035553Spatrick{ 78546035553Spatrick __x.swap(__y); 78646035553Spatrick} 78746035553Spatrick 788*4bdff4beSrobert// Class template basic_stringstream [stringstream] 78946035553Spatrick 79046035553Spatricktemplate <class _CharT, class _Traits, class _Allocator> 79146035553Spatrickclass _LIBCPP_TEMPLATE_VIS basic_stringstream 79246035553Spatrick : public basic_iostream<_CharT, _Traits> 79346035553Spatrick{ 79446035553Spatrickpublic: 79546035553Spatrick typedef _CharT char_type; 79646035553Spatrick typedef _Traits traits_type; 79746035553Spatrick typedef typename traits_type::int_type int_type; 79846035553Spatrick typedef typename traits_type::pos_type pos_type; 79946035553Spatrick typedef typename traits_type::off_type off_type; 80046035553Spatrick typedef _Allocator allocator_type; 80146035553Spatrick 80246035553Spatrick typedef basic_string<char_type, traits_type, allocator_type> string_type; 80346035553Spatrick 80446035553Spatrickprivate: 80546035553Spatrick basic_stringbuf<char_type, traits_type, allocator_type> __sb_; 80646035553Spatrick 80746035553Spatrickpublic: 808*4bdff4beSrobert // [stringstream.cons] constructors 80976d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY 81076d0caaeSpatrick basic_stringstream() 81176d0caaeSpatrick : basic_iostream<_CharT, _Traits>(&__sb_), __sb_(ios_base::in | ios_base::out) {} 81276d0caaeSpatrick 81376d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY 81476d0caaeSpatrick explicit basic_stringstream(ios_base::openmode __wch) 81576d0caaeSpatrick : basic_iostream<_CharT, _Traits>(&__sb_), __sb_(__wch) {} 81676d0caaeSpatrick 81776d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY 81846035553Spatrick explicit basic_stringstream(const string_type& __s, 81976d0caaeSpatrick ios_base::openmode __wch = ios_base::in | ios_base::out) 82076d0caaeSpatrick : basic_iostream<_CharT, _Traits>(&__sb_) 82176d0caaeSpatrick , __sb_(__s, __wch) 82276d0caaeSpatrick { } 82346035553Spatrick 82476d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY 82576d0caaeSpatrick basic_stringstream(basic_stringstream&& __rhs) 82676d0caaeSpatrick : basic_iostream<_CharT, _Traits>(_VSTD::move(__rhs)) 82776d0caaeSpatrick , __sb_(_VSTD::move(__rhs.__sb_)) 82846035553Spatrick { 82946035553Spatrick basic_istream<_CharT, _Traits>::set_rdbuf(&__sb_); 83046035553Spatrick } 83146035553Spatrick 832*4bdff4beSrobert // [stringstream.assign] Assign and swap: 83376d0caaeSpatrick basic_stringstream& operator=(basic_stringstream&& __rhs) { 83446035553Spatrick basic_iostream<char_type, traits_type>::operator=(_VSTD::move(__rhs)); 83546035553Spatrick __sb_ = _VSTD::move(__rhs.__sb_); 83646035553Spatrick return *this; 83746035553Spatrick } 83876d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY 83976d0caaeSpatrick void swap(basic_stringstream& __rhs) { 84046035553Spatrick basic_iostream<char_type, traits_type>::swap(__rhs); 84146035553Spatrick __sb_.swap(__rhs.__sb_); 84246035553Spatrick } 84346035553Spatrick 844*4bdff4beSrobert // [stringstream.members] Member functions: 84576d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY 84676d0caaeSpatrick basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const { 84776d0caaeSpatrick return const_cast<basic_stringbuf<char_type, traits_type, allocator_type>*>(&__sb_); 84876d0caaeSpatrick } 84976d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY 85076d0caaeSpatrick string_type str() const { 85176d0caaeSpatrick return __sb_.str(); 85276d0caaeSpatrick } 85376d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY 85476d0caaeSpatrick void str(const string_type& __s) { 85576d0caaeSpatrick __sb_.str(__s); 85676d0caaeSpatrick } 85776d0caaeSpatrick}; 85876d0caaeSpatrick 85946035553Spatricktemplate <class _CharT, class _Traits, class _Allocator> 86046035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 86146035553Spatrickvoid 86246035553Spatrickswap(basic_stringstream<_CharT, _Traits, _Allocator>& __x, 86346035553Spatrick basic_stringstream<_CharT, _Traits, _Allocator>& __y) 86446035553Spatrick{ 86546035553Spatrick __x.swap(__y); 86646035553Spatrick} 86746035553Spatrick 86876d0caaeSpatrick#if defined(_LIBCPP_ABI_ENABLE_ADDITIONAL_IOSTREAM_EXPLICIT_INSTANTIATIONS_1) 869*4bdff4beSrobertextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_stringbuf<char>; 870*4bdff4beSrobertextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_stringstream<char>; 871*4bdff4beSrobertextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ostringstream<char>; 872*4bdff4beSrobertextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istringstream<char>; 87376d0caaeSpatrick#endif 87446035553Spatrick 87546035553Spatrick_LIBCPP_END_NAMESPACE_STD 87646035553Spatrick 87746035553Spatrick_LIBCPP_POP_MACROS 87846035553Spatrick 879*4bdff4beSrobert#if _LIBCPP_STD_VER <= 20 && !defined(_LIPCPP_REMOVE_TRANSITIVE_INCLUDES) 880*4bdff4beSrobert# include <type_traits> 881*4bdff4beSrobert#endif 882*4bdff4beSrobert 88346035553Spatrick#endif // _LIBCPP_SSTREAM 884