13e519524SHoward Hinnant// -*- C++ -*- 2eb8650a7SLouis Dionne//===----------------------------------------------------------------------===// 33e519524SHoward Hinnant// 457b08b09SChandler Carruth// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 557b08b09SChandler Carruth// See https://llvm.org/LICENSE.txt for license information. 657b08b09SChandler Carruth// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 73e519524SHoward Hinnant// 83e519524SHoward Hinnant//===----------------------------------------------------------------------===// 93e519524SHoward Hinnant 103e519524SHoward Hinnant#ifndef _LIBCPP_SSTREAM 113e519524SHoward Hinnant#define _LIBCPP_SSTREAM 123e519524SHoward Hinnant 133e519524SHoward Hinnant/* 143e519524SHoward Hinnant sstream synopsis 153e519524SHoward Hinnant 163e519524SHoward Hinnanttemplate <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > 173e519524SHoward Hinnantclass basic_stringbuf 183e519524SHoward Hinnant : public basic_streambuf<charT, traits> 193e519524SHoward Hinnant{ 203e519524SHoward Hinnantpublic: 213e519524SHoward Hinnant typedef charT char_type; 223e519524SHoward Hinnant typedef traits traits_type; 233e519524SHoward Hinnant typedef typename traits_type::int_type int_type; 243e519524SHoward Hinnant typedef typename traits_type::pos_type pos_type; 253e519524SHoward Hinnant typedef typename traits_type::off_type off_type; 263e519524SHoward Hinnant typedef Allocator allocator_type; 273e519524SHoward Hinnant 28a11f8b1aSMarek Kurdej // 27.8.1.1 [stringbuf.cons], constructors: 29a11f8b1aSMarek Kurdej explicit basic_stringbuf(ios_base::openmode which = ios_base::in | ios_base::out); // before C++20 30a11f8b1aSMarek Kurdej basic_stringbuf() : basic_stringbuf(ios_base::in | ios_base::out) {} // C++20 31a11f8b1aSMarek Kurdej explicit basic_stringbuf(ios_base::openmode which); // C++20 323e519524SHoward Hinnant explicit basic_stringbuf(const basic_string<char_type, traits_type, allocator_type>& str, 333e519524SHoward Hinnant ios_base::openmode which = ios_base::in | ios_base::out); 343e519524SHoward Hinnant basic_stringbuf(basic_stringbuf&& rhs); 353e519524SHoward Hinnant 363e519524SHoward Hinnant // 27.8.1.2 Assign and swap: 373e519524SHoward Hinnant basic_stringbuf& operator=(basic_stringbuf&& rhs); 383e519524SHoward Hinnant void swap(basic_stringbuf& rhs); 393e519524SHoward Hinnant 403e519524SHoward Hinnant // 27.8.1.3 Get and set: 413e519524SHoward Hinnant basic_string<char_type, traits_type, allocator_type> str() const; 423e519524SHoward Hinnant void str(const basic_string<char_type, traits_type, allocator_type>& s); 433e519524SHoward Hinnant 443e519524SHoward Hinnantprotected: 453e519524SHoward Hinnant // 27.8.1.4 Overridden virtual functions: 463e519524SHoward Hinnant virtual int_type underflow(); 473e519524SHoward Hinnant virtual int_type pbackfail(int_type c = traits_type::eof()); 483e519524SHoward Hinnant virtual int_type overflow (int_type c = traits_type::eof()); 493e519524SHoward Hinnant virtual basic_streambuf<char_type, traits_type>* setbuf(char_type*, streamsize); 503e519524SHoward Hinnant virtual pos_type seekoff(off_type off, ios_base::seekdir way, 513e519524SHoward Hinnant ios_base::openmode which = ios_base::in | ios_base::out); 523e519524SHoward Hinnant virtual pos_type seekpos(pos_type sp, 533e519524SHoward Hinnant ios_base::openmode which = ios_base::in | ios_base::out); 543e519524SHoward Hinnant}; 553e519524SHoward Hinnant 563e519524SHoward Hinnanttemplate <class charT, class traits, class Allocator> 573e519524SHoward Hinnant void swap(basic_stringbuf<charT, traits, Allocator>& x, 583e519524SHoward Hinnant basic_stringbuf<charT, traits, Allocator>& y); 593e519524SHoward Hinnant 603e519524SHoward Hinnanttypedef basic_stringbuf<char> stringbuf; 613e519524SHoward Hinnanttypedef basic_stringbuf<wchar_t> wstringbuf; 623e519524SHoward Hinnant 633e519524SHoward Hinnanttemplate <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > 643e519524SHoward Hinnantclass basic_istringstream 653e519524SHoward Hinnant : public basic_istream<charT, traits> 663e519524SHoward Hinnant{ 673e519524SHoward Hinnantpublic: 683e519524SHoward Hinnant typedef charT char_type; 693e519524SHoward Hinnant typedef traits traits_type; 703e519524SHoward Hinnant typedef typename traits_type::int_type int_type; 713e519524SHoward Hinnant typedef typename traits_type::pos_type pos_type; 723e519524SHoward Hinnant typedef typename traits_type::off_type off_type; 733e519524SHoward Hinnant typedef Allocator allocator_type; 743e519524SHoward Hinnant 753e519524SHoward Hinnant // 27.8.2.1 Constructors: 76a11f8b1aSMarek Kurdej explicit basic_istringstream(ios_base::openmode which = ios_base::in); // before C++20 77a11f8b1aSMarek Kurdej basic_istringstream() : basic_istringstream(ios_base::in) {} // C++20 78a11f8b1aSMarek Kurdej explicit basic_istringstream(ios_base::openmode which); // C++20 79a11f8b1aSMarek Kurdej 803e519524SHoward Hinnant explicit basic_istringstream(const basic_string<char_type, traits_type,allocator_type>& str, 813e519524SHoward Hinnant ios_base::openmode which = ios_base::in); 823e519524SHoward Hinnant basic_istringstream(basic_istringstream&& rhs); 833e519524SHoward Hinnant 843e519524SHoward Hinnant // 27.8.2.2 Assign and swap: 853e519524SHoward Hinnant basic_istringstream& operator=(basic_istringstream&& rhs); 863e519524SHoward Hinnant void swap(basic_istringstream& rhs); 873e519524SHoward Hinnant 883e519524SHoward Hinnant // 27.8.2.3 Members: 893e519524SHoward Hinnant basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const; 903e519524SHoward Hinnant basic_string<char_type, traits_type, allocator_type> str() const; 913e519524SHoward Hinnant void str(const basic_string<char_type, traits_type, allocator_type>& s); 923e519524SHoward Hinnant}; 933e519524SHoward Hinnant 943e519524SHoward Hinnanttemplate <class charT, class traits, class Allocator> 953e519524SHoward Hinnant void swap(basic_istringstream<charT, traits, Allocator>& x, 963e519524SHoward Hinnant basic_istringstream<charT, traits, Allocator>& y); 973e519524SHoward Hinnant 983e519524SHoward Hinnanttypedef basic_istringstream<char> istringstream; 993e519524SHoward Hinnanttypedef basic_istringstream<wchar_t> wistringstream; 1003e519524SHoward Hinnant 1013e519524SHoward Hinnanttemplate <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > 1023e519524SHoward Hinnantclass basic_ostringstream 1033e519524SHoward Hinnant : public basic_ostream<charT, traits> 1043e519524SHoward Hinnant{ 1053e519524SHoward Hinnantpublic: 1063e519524SHoward Hinnant // types: 1073e519524SHoward Hinnant typedef charT char_type; 1083e519524SHoward Hinnant typedef traits traits_type; 1093e519524SHoward Hinnant typedef typename traits_type::int_type int_type; 1103e519524SHoward Hinnant typedef typename traits_type::pos_type pos_type; 1113e519524SHoward Hinnant typedef typename traits_type::off_type off_type; 1123e519524SHoward Hinnant typedef Allocator allocator_type; 1133e519524SHoward Hinnant 1143e519524SHoward Hinnant // 27.8.3.1 Constructors/destructor: 115a11f8b1aSMarek Kurdej explicit basic_ostringstream(ios_base::openmode which = ios_base::out); // before C++20 116a11f8b1aSMarek Kurdej basic_ostringstream() : basic_ostringstream(ios_base::out) {} // C++20 117a11f8b1aSMarek Kurdej explicit basic_ostringstream(ios_base::openmode which); // C++20 118a11f8b1aSMarek Kurdej 1193e519524SHoward Hinnant explicit basic_ostringstream(const basic_string<char_type, traits_type, allocator_type>& str, 1203e519524SHoward Hinnant ios_base::openmode which = ios_base::out); 1213e519524SHoward Hinnant basic_ostringstream(basic_ostringstream&& rhs); 1223e519524SHoward Hinnant 1233e519524SHoward Hinnant // 27.8.3.2 Assign/swap: 1243e519524SHoward Hinnant basic_ostringstream& operator=(basic_ostringstream&& rhs); 1253e519524SHoward Hinnant void swap(basic_ostringstream& rhs); 1263e519524SHoward Hinnant 1273e519524SHoward Hinnant // 27.8.3.3 Members: 1283e519524SHoward Hinnant basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const; 1293e519524SHoward Hinnant basic_string<char_type, traits_type, allocator_type> str() const; 1303e519524SHoward Hinnant void str(const basic_string<char_type, traits_type, allocator_type>& s); 1313e519524SHoward Hinnant}; 1323e519524SHoward Hinnant 1333e519524SHoward Hinnanttemplate <class charT, class traits, class Allocator> 1343e519524SHoward Hinnant void swap(basic_ostringstream<charT, traits, Allocator>& x, 1353e519524SHoward Hinnant basic_ostringstream<charT, traits, Allocator>& y); 1363e519524SHoward Hinnant 1373e519524SHoward Hinnanttypedef basic_ostringstream<char> ostringstream; 1383e519524SHoward Hinnanttypedef basic_ostringstream<wchar_t> wostringstream; 1393e519524SHoward Hinnant 1403e519524SHoward Hinnanttemplate <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > 1413e519524SHoward Hinnantclass basic_stringstream 1423e519524SHoward Hinnant : public basic_iostream<charT, traits> 1433e519524SHoward Hinnant{ 1443e519524SHoward Hinnantpublic: 1453e519524SHoward Hinnant // types: 1463e519524SHoward Hinnant typedef charT char_type; 1473e519524SHoward Hinnant typedef traits traits_type; 1483e519524SHoward Hinnant typedef typename traits_type::int_type int_type; 1493e519524SHoward Hinnant typedef typename traits_type::pos_type pos_type; 1503e519524SHoward Hinnant typedef typename traits_type::off_type off_type; 1513e519524SHoward Hinnant typedef Allocator allocator_type; 1523e519524SHoward Hinnant 1533e519524SHoward Hinnant // constructors/destructor 154a11f8b1aSMarek Kurdej explicit basic_stringstream(ios_base::openmode which = ios_base::out | ios_base::in); // before C++20 155a11f8b1aSMarek Kurdej basic_stringstream() : basic_stringstream(ios_base::out | ios_base::in) {} // C++20 156a11f8b1aSMarek Kurdej explicit basic_stringstream(ios_base::openmode which); // C++20 157a11f8b1aSMarek Kurdej 1583e519524SHoward Hinnant explicit basic_stringstream(const basic_string<char_type, traits_type, allocator_type>& str, 1593e519524SHoward Hinnant ios_base::openmode which = ios_base::out|ios_base::in); 1603e519524SHoward Hinnant basic_stringstream(basic_stringstream&& rhs); 1613e519524SHoward Hinnant 1623e519524SHoward Hinnant // 27.8.5.1 Assign/swap: 1633e519524SHoward Hinnant basic_stringstream& operator=(basic_stringstream&& rhs); 1643e519524SHoward Hinnant void swap(basic_stringstream& rhs); 1653e519524SHoward Hinnant 1663e519524SHoward Hinnant // Members: 1673e519524SHoward Hinnant basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const; 1683e519524SHoward Hinnant basic_string<char_type, traits_type, allocator_type> str() const; 1693e519524SHoward Hinnant void str(const basic_string<char_type, traits_type, allocator_type>& str); 1703e519524SHoward Hinnant}; 1713e519524SHoward Hinnant 1723e519524SHoward Hinnanttemplate <class charT, class traits, class Allocator> 1733e519524SHoward Hinnant void swap(basic_stringstream<charT, traits, Allocator>& x, 1743e519524SHoward Hinnant basic_stringstream<charT, traits, Allocator>& y); 1753e519524SHoward Hinnant 1763e519524SHoward Hinnanttypedef basic_stringstream<char> stringstream; 1773e519524SHoward Hinnanttypedef basic_stringstream<wchar_t> wstringstream; 1783e519524SHoward Hinnant 1793e519524SHoward Hinnant} // std 1803e519524SHoward Hinnant 1813e519524SHoward Hinnant*/ 1823e519524SHoward Hinnant 183385cc25aSLouis Dionne#include <__assert> // all public C++ headers provide the assertion handler 1843e519524SHoward Hinnant#include <__config> 18552915d78SNikolas Klauser#include <__utility/swap.h> 1863e519524SHoward Hinnant#include <istream> 187bfbd73f8SArthur O'Dwyer#include <ostream> 1883e519524SHoward Hinnant#include <string> 189bd6e6846SMark de Wever#include <version> 1903e519524SHoward Hinnant 191073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 1923e519524SHoward Hinnant# pragma GCC system_header 193073458b1SHoward Hinnant#endif 1943e519524SHoward Hinnant 195a016efb1SEric Fiselier_LIBCPP_PUSH_MACROS 196a016efb1SEric Fiselier#include <__undef_macros> 197a016efb1SEric Fiselier 198a016efb1SEric Fiselier 1993e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 2003e519524SHoward Hinnant 2013e519524SHoward Hinnant// basic_stringbuf 2023e519524SHoward Hinnant 2033e519524SHoward Hinnanttemplate <class _CharT, class _Traits, class _Allocator> 204e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS basic_stringbuf 2053e519524SHoward Hinnant : public basic_streambuf<_CharT, _Traits> 2063e519524SHoward Hinnant{ 2073e519524SHoward Hinnantpublic: 2083e519524SHoward Hinnant typedef _CharT char_type; 2093e519524SHoward Hinnant typedef _Traits traits_type; 2103e519524SHoward Hinnant typedef typename traits_type::int_type int_type; 2113e519524SHoward Hinnant typedef typename traits_type::pos_type pos_type; 2123e519524SHoward Hinnant typedef typename traits_type::off_type off_type; 2133e519524SHoward Hinnant typedef _Allocator allocator_type; 2143e519524SHoward Hinnant 2153e519524SHoward Hinnant typedef basic_string<char_type, traits_type, allocator_type> string_type; 2163e519524SHoward Hinnant 2173e519524SHoward Hinnantprivate: 2183e519524SHoward Hinnant 2193e519524SHoward Hinnant string_type __str_; 2203e519524SHoward Hinnant mutable char_type* __hm_; 2213e519524SHoward Hinnant ios_base::openmode __mode_; 2223e519524SHoward Hinnant 2233e519524SHoward Hinnantpublic: 224a11f8b1aSMarek Kurdej // 30.8.2.1 [stringbuf.cons], constructors 2254abb5196SLouis Dionne _LIBCPP_INLINE_VISIBILITY 226a8d1182fSArthur O'Dwyer basic_stringbuf() 227a8d1182fSArthur O'Dwyer : __hm_(nullptr), __mode_(ios_base::in | ios_base::out) {} 228a11f8b1aSMarek Kurdej 229a11f8b1aSMarek Kurdej _LIBCPP_INLINE_VISIBILITY 230a11f8b1aSMarek Kurdej explicit basic_stringbuf(ios_base::openmode __wch) 231a11f8b1aSMarek Kurdej : __hm_(nullptr), __mode_(__wch) {} 2324abb5196SLouis Dionne 2334abb5196SLouis Dionne _LIBCPP_INLINE_VISIBILITY 2343e519524SHoward Hinnant explicit basic_stringbuf(const string_type& __s, 2354abb5196SLouis Dionne ios_base::openmode __wch = ios_base::in | ios_base::out) 236527a7fdfSBruce Mitchener : __str_(__s.get_allocator()), __hm_(nullptr), __mode_(__wch) 2374abb5196SLouis Dionne { 2384abb5196SLouis Dionne str(__s); 2394abb5196SLouis Dionne } 2404abb5196SLouis Dionne 2413e519524SHoward Hinnant basic_stringbuf(basic_stringbuf&& __rhs); 2423e519524SHoward Hinnant 2433e519524SHoward Hinnant // 27.8.1.2 Assign and swap: 2443e519524SHoward Hinnant basic_stringbuf& operator=(basic_stringbuf&& __rhs); 2453e519524SHoward Hinnant void swap(basic_stringbuf& __rhs); 2463e519524SHoward Hinnant 2473e519524SHoward Hinnant // 27.8.1.3 Get and set: 2483e519524SHoward Hinnant string_type str() const; 2493e519524SHoward Hinnant void str(const string_type& __s); 2503e519524SHoward Hinnant 2513e519524SHoward Hinnantprotected: 2523e519524SHoward Hinnant // 27.8.1.4 Overridden virtual functions: 2533e519524SHoward Hinnant virtual int_type underflow(); 2543e519524SHoward Hinnant virtual int_type pbackfail(int_type __c = traits_type::eof()); 2553e519524SHoward Hinnant virtual int_type overflow (int_type __c = traits_type::eof()); 2563e519524SHoward Hinnant virtual pos_type seekoff(off_type __off, ios_base::seekdir __way, 2573e519524SHoward Hinnant ios_base::openmode __wch = ios_base::in | ios_base::out); 2584abb5196SLouis Dionne _LIBCPP_INLINE_VISIBILITY 2593e519524SHoward Hinnant virtual pos_type seekpos(pos_type __sp, 2604abb5196SLouis Dionne ios_base::openmode __wch = ios_base::in | ios_base::out) { 2614abb5196SLouis Dionne return seekoff(__sp, ios_base::beg, __wch); 2624abb5196SLouis Dionne } 2633e519524SHoward Hinnant}; 2643e519524SHoward Hinnant 2653e519524SHoward Hinnanttemplate <class _CharT, class _Traits, class _Allocator> 2663e519524SHoward Hinnantbasic_stringbuf<_CharT, _Traits, _Allocator>::basic_stringbuf(basic_stringbuf&& __rhs) 2673e519524SHoward Hinnant : __mode_(__rhs.__mode_) 2683e519524SHoward Hinnant{ 2691347d334SHoward Hinnant char_type* __p = const_cast<char_type*>(__rhs.__str_.data()); 2701347d334SHoward Hinnant ptrdiff_t __binp = -1; 2711347d334SHoward Hinnant ptrdiff_t __ninp = -1; 2721347d334SHoward Hinnant ptrdiff_t __einp = -1; 2731347d334SHoward Hinnant if (__rhs.eback() != nullptr) 2741347d334SHoward Hinnant { 2751347d334SHoward Hinnant __binp = __rhs.eback() - __p; 2761347d334SHoward Hinnant __ninp = __rhs.gptr() - __p; 2771347d334SHoward Hinnant __einp = __rhs.egptr() - __p; 2781347d334SHoward Hinnant } 2791347d334SHoward Hinnant ptrdiff_t __bout = -1; 2801347d334SHoward Hinnant ptrdiff_t __nout = -1; 2811347d334SHoward Hinnant ptrdiff_t __eout = -1; 2821347d334SHoward Hinnant if (__rhs.pbase() != nullptr) 2831347d334SHoward Hinnant { 2841347d334SHoward Hinnant __bout = __rhs.pbase() - __p; 2851347d334SHoward Hinnant __nout = __rhs.pptr() - __p; 2861347d334SHoward Hinnant __eout = __rhs.epptr() - __p; 2871347d334SHoward Hinnant } 2881347d334SHoward Hinnant ptrdiff_t __hm = __rhs.__hm_ == nullptr ? -1 : __rhs.__hm_ - __p; 289ce48a113SHoward Hinnant __str_ = _VSTD::move(__rhs.__str_); 2901347d334SHoward Hinnant __p = const_cast<char_type*>(__str_.data()); 2911347d334SHoward Hinnant if (__binp != -1) 2921347d334SHoward Hinnant this->setg(__p + __binp, __p + __ninp, __p + __einp); 2931347d334SHoward Hinnant if (__bout != -1) 2941347d334SHoward Hinnant { 2951347d334SHoward Hinnant this->setp(__p + __bout, __p + __eout); 296d90758e2SMarshall Clow this->__pbump(__nout); 2971347d334SHoward Hinnant } 2981347d334SHoward Hinnant __hm_ = __hm == -1 ? nullptr : __p + __hm; 2993e519524SHoward Hinnant __p = const_cast<char_type*>(__rhs.__str_.data()); 3003e519524SHoward Hinnant __rhs.setg(__p, __p, __p); 3013e519524SHoward Hinnant __rhs.setp(__p, __p); 3023e519524SHoward Hinnant __rhs.__hm_ = __p; 3033e519524SHoward Hinnant this->pubimbue(__rhs.getloc()); 3043e519524SHoward Hinnant} 3053e519524SHoward Hinnant 3063e519524SHoward Hinnanttemplate <class _CharT, class _Traits, class _Allocator> 3073e519524SHoward Hinnantbasic_stringbuf<_CharT, _Traits, _Allocator>& 3083e519524SHoward Hinnantbasic_stringbuf<_CharT, _Traits, _Allocator>::operator=(basic_stringbuf&& __rhs) 3093e519524SHoward Hinnant{ 3101347d334SHoward Hinnant char_type* __p = const_cast<char_type*>(__rhs.__str_.data()); 3111347d334SHoward Hinnant ptrdiff_t __binp = -1; 3121347d334SHoward Hinnant ptrdiff_t __ninp = -1; 3131347d334SHoward Hinnant ptrdiff_t __einp = -1; 3141347d334SHoward Hinnant if (__rhs.eback() != nullptr) 3151347d334SHoward Hinnant { 3161347d334SHoward Hinnant __binp = __rhs.eback() - __p; 3171347d334SHoward Hinnant __ninp = __rhs.gptr() - __p; 3181347d334SHoward Hinnant __einp = __rhs.egptr() - __p; 3191347d334SHoward Hinnant } 3201347d334SHoward Hinnant ptrdiff_t __bout = -1; 3211347d334SHoward Hinnant ptrdiff_t __nout = -1; 3221347d334SHoward Hinnant ptrdiff_t __eout = -1; 3231347d334SHoward Hinnant if (__rhs.pbase() != nullptr) 3241347d334SHoward Hinnant { 3251347d334SHoward Hinnant __bout = __rhs.pbase() - __p; 3261347d334SHoward Hinnant __nout = __rhs.pptr() - __p; 3271347d334SHoward Hinnant __eout = __rhs.epptr() - __p; 3281347d334SHoward Hinnant } 3291347d334SHoward Hinnant ptrdiff_t __hm = __rhs.__hm_ == nullptr ? -1 : __rhs.__hm_ - __p; 330ce48a113SHoward Hinnant __str_ = _VSTD::move(__rhs.__str_); 3311347d334SHoward Hinnant __p = const_cast<char_type*>(__str_.data()); 3321347d334SHoward Hinnant if (__binp != -1) 3331347d334SHoward Hinnant this->setg(__p + __binp, __p + __ninp, __p + __einp); 334d1b50785SMarshall Clow else 335d1b50785SMarshall Clow this->setg(nullptr, nullptr, nullptr); 3361347d334SHoward Hinnant if (__bout != -1) 3371347d334SHoward Hinnant { 3381347d334SHoward Hinnant this->setp(__p + __bout, __p + __eout); 339d90758e2SMarshall Clow this->__pbump(__nout); 3401347d334SHoward Hinnant } 341d1b50785SMarshall Clow else 342d1b50785SMarshall Clow this->setp(nullptr, nullptr); 343d1b50785SMarshall Clow 3441347d334SHoward Hinnant __hm_ = __hm == -1 ? nullptr : __p + __hm; 3451347d334SHoward Hinnant __mode_ = __rhs.__mode_; 3463e519524SHoward Hinnant __p = const_cast<char_type*>(__rhs.__str_.data()); 3473e519524SHoward Hinnant __rhs.setg(__p, __p, __p); 3483e519524SHoward Hinnant __rhs.setp(__p, __p); 3493e519524SHoward Hinnant __rhs.__hm_ = __p; 3503e519524SHoward Hinnant this->pubimbue(__rhs.getloc()); 3513e519524SHoward Hinnant return *this; 3523e519524SHoward Hinnant} 3533e519524SHoward Hinnant 3543e519524SHoward Hinnanttemplate <class _CharT, class _Traits, class _Allocator> 3553e519524SHoward Hinnantvoid 3563e519524SHoward Hinnantbasic_stringbuf<_CharT, _Traits, _Allocator>::swap(basic_stringbuf& __rhs) 3573e519524SHoward Hinnant{ 3581347d334SHoward Hinnant char_type* __p = const_cast<char_type*>(__rhs.__str_.data()); 3591347d334SHoward Hinnant ptrdiff_t __rbinp = -1; 3601347d334SHoward Hinnant ptrdiff_t __rninp = -1; 3611347d334SHoward Hinnant ptrdiff_t __reinp = -1; 3621347d334SHoward Hinnant if (__rhs.eback() != nullptr) 3631347d334SHoward Hinnant { 3641347d334SHoward Hinnant __rbinp = __rhs.eback() - __p; 3651347d334SHoward Hinnant __rninp = __rhs.gptr() - __p; 3661347d334SHoward Hinnant __reinp = __rhs.egptr() - __p; 3671347d334SHoward Hinnant } 3681347d334SHoward Hinnant ptrdiff_t __rbout = -1; 3691347d334SHoward Hinnant ptrdiff_t __rnout = -1; 3701347d334SHoward Hinnant ptrdiff_t __reout = -1; 3711347d334SHoward Hinnant if (__rhs.pbase() != nullptr) 3721347d334SHoward Hinnant { 3731347d334SHoward Hinnant __rbout = __rhs.pbase() - __p; 3741347d334SHoward Hinnant __rnout = __rhs.pptr() - __p; 3751347d334SHoward Hinnant __reout = __rhs.epptr() - __p; 3761347d334SHoward Hinnant } 3771347d334SHoward Hinnant ptrdiff_t __rhm = __rhs.__hm_ == nullptr ? -1 : __rhs.__hm_ - __p; 3781347d334SHoward Hinnant __p = const_cast<char_type*>(__str_.data()); 3791347d334SHoward Hinnant ptrdiff_t __lbinp = -1; 3801347d334SHoward Hinnant ptrdiff_t __lninp = -1; 3811347d334SHoward Hinnant ptrdiff_t __leinp = -1; 3821347d334SHoward Hinnant if (this->eback() != nullptr) 3831347d334SHoward Hinnant { 3841347d334SHoward Hinnant __lbinp = this->eback() - __p; 3851347d334SHoward Hinnant __lninp = this->gptr() - __p; 3861347d334SHoward Hinnant __leinp = this->egptr() - __p; 3871347d334SHoward Hinnant } 3881347d334SHoward Hinnant ptrdiff_t __lbout = -1; 3891347d334SHoward Hinnant ptrdiff_t __lnout = -1; 3901347d334SHoward Hinnant ptrdiff_t __leout = -1; 3911347d334SHoward Hinnant if (this->pbase() != nullptr) 3921347d334SHoward Hinnant { 3931347d334SHoward Hinnant __lbout = this->pbase() - __p; 3941347d334SHoward Hinnant __lnout = this->pptr() - __p; 3951347d334SHoward Hinnant __leout = this->epptr() - __p; 3961347d334SHoward Hinnant } 3971347d334SHoward Hinnant ptrdiff_t __lhm = __hm_ == nullptr ? -1 : __hm_ - __p; 398ce48a113SHoward Hinnant _VSTD::swap(__mode_, __rhs.__mode_); 3993e519524SHoward Hinnant __str_.swap(__rhs.__str_); 4001347d334SHoward Hinnant __p = const_cast<char_type*>(__str_.data()); 4011347d334SHoward Hinnant if (__rbinp != -1) 4021347d334SHoward Hinnant this->setg(__p + __rbinp, __p + __rninp, __p + __reinp); 4031347d334SHoward Hinnant else 4041347d334SHoward Hinnant this->setg(nullptr, nullptr, nullptr); 4051347d334SHoward Hinnant if (__rbout != -1) 4061347d334SHoward Hinnant { 4071347d334SHoward Hinnant this->setp(__p + __rbout, __p + __reout); 408d90758e2SMarshall Clow this->__pbump(__rnout); 4091347d334SHoward Hinnant } 4101347d334SHoward Hinnant else 4111347d334SHoward Hinnant this->setp(nullptr, nullptr); 4121347d334SHoward Hinnant __hm_ = __rhm == -1 ? nullptr : __p + __rhm; 4133e519524SHoward Hinnant __p = const_cast<char_type*>(__rhs.__str_.data()); 4141347d334SHoward Hinnant if (__lbinp != -1) 4151347d334SHoward Hinnant __rhs.setg(__p + __lbinp, __p + __lninp, __p + __leinp); 4161347d334SHoward Hinnant else 4171347d334SHoward Hinnant __rhs.setg(nullptr, nullptr, nullptr); 4181347d334SHoward Hinnant if (__lbout != -1) 4191347d334SHoward Hinnant { 4201347d334SHoward Hinnant __rhs.setp(__p + __lbout, __p + __leout); 421d90758e2SMarshall Clow __rhs.__pbump(__lnout); 4221347d334SHoward Hinnant } 4231347d334SHoward Hinnant else 4241347d334SHoward Hinnant __rhs.setp(nullptr, nullptr); 4251347d334SHoward Hinnant __rhs.__hm_ = __lhm == -1 ? nullptr : __p + __lhm; 4263e519524SHoward Hinnant locale __tl = __rhs.getloc(); 4273e519524SHoward Hinnant __rhs.pubimbue(this->getloc()); 4283e519524SHoward Hinnant this->pubimbue(__tl); 4293e519524SHoward Hinnant} 4303e519524SHoward Hinnant 4313e519524SHoward Hinnanttemplate <class _CharT, class _Traits, class _Allocator> 432c86b3920SEvgeniy Stepanovinline _LIBCPP_INLINE_VISIBILITY 4333e519524SHoward Hinnantvoid 4343e519524SHoward Hinnantswap(basic_stringbuf<_CharT, _Traits, _Allocator>& __x, 4353e519524SHoward Hinnant basic_stringbuf<_CharT, _Traits, _Allocator>& __y) 4363e519524SHoward Hinnant{ 4373e519524SHoward Hinnant __x.swap(__y); 4383e519524SHoward Hinnant} 4393e519524SHoward Hinnant 4403e519524SHoward Hinnanttemplate <class _CharT, class _Traits, class _Allocator> 4413e519524SHoward Hinnantbasic_string<_CharT, _Traits, _Allocator> 4423e519524SHoward Hinnantbasic_stringbuf<_CharT, _Traits, _Allocator>::str() const 4433e519524SHoward Hinnant{ 4443e519524SHoward Hinnant if (__mode_ & ios_base::out) 4453e519524SHoward Hinnant { 4463e519524SHoward Hinnant if (__hm_ < this->pptr()) 4473e519524SHoward Hinnant __hm_ = this->pptr(); 4483e519524SHoward Hinnant return string_type(this->pbase(), __hm_, __str_.get_allocator()); 4493e519524SHoward Hinnant } 4503e519524SHoward Hinnant else if (__mode_ & ios_base::in) 4513e519524SHoward Hinnant return string_type(this->eback(), this->egptr(), __str_.get_allocator()); 4523e519524SHoward Hinnant return string_type(__str_.get_allocator()); 4533e519524SHoward Hinnant} 4543e519524SHoward Hinnant 4553e519524SHoward Hinnanttemplate <class _CharT, class _Traits, class _Allocator> 4563e519524SHoward Hinnantvoid 4573e519524SHoward Hinnantbasic_stringbuf<_CharT, _Traits, _Allocator>::str(const string_type& __s) 4583e519524SHoward Hinnant{ 4593e519524SHoward Hinnant __str_ = __s; 460527a7fdfSBruce Mitchener __hm_ = nullptr; 4613e519524SHoward Hinnant if (__mode_ & ios_base::in) 4623e519524SHoward Hinnant { 4633e519524SHoward Hinnant __hm_ = const_cast<char_type*>(__str_.data()) + __str_.size(); 4643e519524SHoward Hinnant this->setg(const_cast<char_type*>(__str_.data()), 4653e519524SHoward Hinnant const_cast<char_type*>(__str_.data()), 4663e519524SHoward Hinnant __hm_); 4673e519524SHoward Hinnant } 4683e519524SHoward Hinnant if (__mode_ & ios_base::out) 4693e519524SHoward Hinnant { 4703e519524SHoward Hinnant typename string_type::size_type __sz = __str_.size(); 4713e519524SHoward Hinnant __hm_ = const_cast<char_type*>(__str_.data()) + __sz; 4723e519524SHoward Hinnant __str_.resize(__str_.capacity()); 4733e519524SHoward Hinnant this->setp(const_cast<char_type*>(__str_.data()), 4743e519524SHoward Hinnant const_cast<char_type*>(__str_.data()) + __str_.size()); 4753e519524SHoward Hinnant if (__mode_ & (ios_base::app | ios_base::ate)) 476d90758e2SMarshall Clow { 477d90758e2SMarshall Clow while (__sz > INT_MAX) 478d90758e2SMarshall Clow { 479d90758e2SMarshall Clow this->pbump(INT_MAX); 480d90758e2SMarshall Clow __sz -= INT_MAX; 481d90758e2SMarshall Clow } 482d90758e2SMarshall Clow if (__sz > 0) 4833e519524SHoward Hinnant this->pbump(__sz); 4843e519524SHoward Hinnant } 4853e519524SHoward Hinnant } 486d90758e2SMarshall Clow} 4873e519524SHoward Hinnant 4883e519524SHoward Hinnanttemplate <class _CharT, class _Traits, class _Allocator> 4893e519524SHoward Hinnanttypename basic_stringbuf<_CharT, _Traits, _Allocator>::int_type 4903e519524SHoward Hinnantbasic_stringbuf<_CharT, _Traits, _Allocator>::underflow() 4913e519524SHoward Hinnant{ 4923e519524SHoward Hinnant if (__hm_ < this->pptr()) 4933e519524SHoward Hinnant __hm_ = this->pptr(); 4943e519524SHoward Hinnant if (__mode_ & ios_base::in) 4953e519524SHoward Hinnant { 4963e519524SHoward Hinnant if (this->egptr() < __hm_) 4973e519524SHoward Hinnant this->setg(this->eback(), this->gptr(), __hm_); 4983e519524SHoward Hinnant if (this->gptr() < this->egptr()) 4993e519524SHoward Hinnant return traits_type::to_int_type(*this->gptr()); 5003e519524SHoward Hinnant } 5013e519524SHoward Hinnant return traits_type::eof(); 5023e519524SHoward Hinnant} 5033e519524SHoward Hinnant 5043e519524SHoward Hinnanttemplate <class _CharT, class _Traits, class _Allocator> 5053e519524SHoward Hinnanttypename basic_stringbuf<_CharT, _Traits, _Allocator>::int_type 5063e519524SHoward Hinnantbasic_stringbuf<_CharT, _Traits, _Allocator>::pbackfail(int_type __c) 5073e519524SHoward Hinnant{ 5083e519524SHoward Hinnant if (__hm_ < this->pptr()) 5093e519524SHoward Hinnant __hm_ = this->pptr(); 5103e519524SHoward Hinnant if (this->eback() < this->gptr()) 5113e519524SHoward Hinnant { 5123e519524SHoward Hinnant if (traits_type::eq_int_type(__c, traits_type::eof())) 5133e519524SHoward Hinnant { 5143e519524SHoward Hinnant this->setg(this->eback(), this->gptr()-1, __hm_); 5153e519524SHoward Hinnant return traits_type::not_eof(__c); 5163e519524SHoward Hinnant } 5173e519524SHoward Hinnant if ((__mode_ & ios_base::out) || 5183e519524SHoward Hinnant traits_type::eq(traits_type::to_char_type(__c), this->gptr()[-1])) 5193e519524SHoward Hinnant { 5203e519524SHoward Hinnant this->setg(this->eback(), this->gptr()-1, __hm_); 5213e519524SHoward Hinnant *this->gptr() = traits_type::to_char_type(__c); 5223e519524SHoward Hinnant return __c; 5233e519524SHoward Hinnant } 5243e519524SHoward Hinnant } 5253e519524SHoward Hinnant return traits_type::eof(); 5263e519524SHoward Hinnant} 5273e519524SHoward Hinnant 5283e519524SHoward Hinnanttemplate <class _CharT, class _Traits, class _Allocator> 5293e519524SHoward Hinnanttypename basic_stringbuf<_CharT, _Traits, _Allocator>::int_type 5303e519524SHoward Hinnantbasic_stringbuf<_CharT, _Traits, _Allocator>::overflow(int_type __c) 5313e519524SHoward Hinnant{ 5323e519524SHoward Hinnant if (!traits_type::eq_int_type(__c, traits_type::eof())) 5333e519524SHoward Hinnant { 5343e519524SHoward Hinnant ptrdiff_t __ninp = this->gptr() - this->eback(); 5353e519524SHoward Hinnant if (this->pptr() == this->epptr()) 5363e519524SHoward Hinnant { 5373e519524SHoward Hinnant if (!(__mode_ & ios_base::out)) 5383e519524SHoward Hinnant return traits_type::eof(); 5393e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 5403e519524SHoward Hinnant try 5413e519524SHoward Hinnant { 542b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 5433e519524SHoward Hinnant ptrdiff_t __nout = this->pptr() - this->pbase(); 5443e519524SHoward Hinnant ptrdiff_t __hm = __hm_ - this->pbase(); 5453e519524SHoward Hinnant __str_.push_back(char_type()); 5463e519524SHoward Hinnant __str_.resize(__str_.capacity()); 5473e519524SHoward Hinnant char_type* __p = const_cast<char_type*>(__str_.data()); 5483e519524SHoward Hinnant this->setp(__p, __p + __str_.size()); 549d90758e2SMarshall Clow this->__pbump(__nout); 5503e519524SHoward Hinnant __hm_ = this->pbase() + __hm; 5513e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 5523e519524SHoward Hinnant } 5533e519524SHoward Hinnant catch (...) 5543e519524SHoward Hinnant { 5553e519524SHoward Hinnant return traits_type::eof(); 5563e519524SHoward Hinnant } 557b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 5583e519524SHoward Hinnant } 559ce48a113SHoward Hinnant __hm_ = _VSTD::max(this->pptr() + 1, __hm_); 5603e519524SHoward Hinnant if (__mode_ & ios_base::in) 5613e519524SHoward Hinnant { 5623e519524SHoward Hinnant char_type* __p = const_cast<char_type*>(__str_.data()); 5633e519524SHoward Hinnant this->setg(__p, __p + __ninp, __hm_); 5643e519524SHoward Hinnant } 5652e719bc4SMarshall Clow return this->sputc(traits_type::to_char_type(__c)); 5663e519524SHoward Hinnant } 5673e519524SHoward Hinnant return traits_type::not_eof(__c); 5683e519524SHoward Hinnant} 5693e519524SHoward Hinnant 5703e519524SHoward Hinnanttemplate <class _CharT, class _Traits, class _Allocator> 5713e519524SHoward Hinnanttypename basic_stringbuf<_CharT, _Traits, _Allocator>::pos_type 5723e519524SHoward Hinnantbasic_stringbuf<_CharT, _Traits, _Allocator>::seekoff(off_type __off, 5733e519524SHoward Hinnant ios_base::seekdir __way, 5743e519524SHoward Hinnant ios_base::openmode __wch) 5753e519524SHoward Hinnant{ 5763e519524SHoward Hinnant if (__hm_ < this->pptr()) 5773e519524SHoward Hinnant __hm_ = this->pptr(); 5783e519524SHoward Hinnant if ((__wch & (ios_base::in | ios_base::out)) == 0) 5793e519524SHoward Hinnant return pos_type(-1); 5803e519524SHoward Hinnant if ((__wch & (ios_base::in | ios_base::out)) == (ios_base::in | ios_base::out) 5813e519524SHoward Hinnant && __way == ios_base::cur) 5823e519524SHoward Hinnant return pos_type(-1); 58322c651c5SPeter Collingbourne const ptrdiff_t __hm = __hm_ == nullptr ? 0 : __hm_ - __str_.data(); 5843e519524SHoward Hinnant off_type __noff; 5853e519524SHoward Hinnant switch (__way) 5863e519524SHoward Hinnant { 5873e519524SHoward Hinnant case ios_base::beg: 5883e519524SHoward Hinnant __noff = 0; 5893e519524SHoward Hinnant break; 5903e519524SHoward Hinnant case ios_base::cur: 5913e519524SHoward Hinnant if (__wch & ios_base::in) 5923e519524SHoward Hinnant __noff = this->gptr() - this->eback(); 5933e519524SHoward Hinnant else 5943e519524SHoward Hinnant __noff = this->pptr() - this->pbase(); 5953e519524SHoward Hinnant break; 5963e519524SHoward Hinnant case ios_base::end: 59722c651c5SPeter Collingbourne __noff = __hm; 5983e519524SHoward Hinnant break; 5993e519524SHoward Hinnant default: 6003e519524SHoward Hinnant return pos_type(-1); 6013e519524SHoward Hinnant } 6023e519524SHoward Hinnant __noff += __off; 60322c651c5SPeter Collingbourne if (__noff < 0 || __hm < __noff) 6043e519524SHoward Hinnant return pos_type(-1); 6053e519524SHoward Hinnant if (__noff != 0) 6063e519524SHoward Hinnant { 607527a7fdfSBruce Mitchener if ((__wch & ios_base::in) && this->gptr() == nullptr) 6083e519524SHoward Hinnant return pos_type(-1); 609527a7fdfSBruce Mitchener if ((__wch & ios_base::out) && this->pptr() == nullptr) 6103e519524SHoward Hinnant return pos_type(-1); 6113e519524SHoward Hinnant } 6123e519524SHoward Hinnant if (__wch & ios_base::in) 6133e519524SHoward Hinnant this->setg(this->eback(), this->eback() + __noff, __hm_); 6143e519524SHoward Hinnant if (__wch & ios_base::out) 6153e519524SHoward Hinnant { 6163e519524SHoward Hinnant this->setp(this->pbase(), this->epptr()); 6173e519524SHoward Hinnant this->pbump(__noff); 6183e519524SHoward Hinnant } 6193e519524SHoward Hinnant return pos_type(__noff); 6203e519524SHoward Hinnant} 6213e519524SHoward Hinnant 6223e519524SHoward Hinnant// basic_istringstream 6233e519524SHoward Hinnant 6243e519524SHoward Hinnanttemplate <class _CharT, class _Traits, class _Allocator> 625e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS basic_istringstream 6263e519524SHoward Hinnant : public basic_istream<_CharT, _Traits> 6273e519524SHoward Hinnant{ 6283e519524SHoward Hinnantpublic: 6293e519524SHoward Hinnant typedef _CharT char_type; 6303e519524SHoward Hinnant typedef _Traits traits_type; 6313e519524SHoward Hinnant typedef typename traits_type::int_type int_type; 6323e519524SHoward Hinnant typedef typename traits_type::pos_type pos_type; 6333e519524SHoward Hinnant typedef typename traits_type::off_type off_type; 6343e519524SHoward Hinnant typedef _Allocator allocator_type; 6353e519524SHoward Hinnant 6363e519524SHoward Hinnant typedef basic_string<char_type, traits_type, allocator_type> string_type; 6373e519524SHoward Hinnant 6383e519524SHoward Hinnantprivate: 6393e519524SHoward Hinnant basic_stringbuf<char_type, traits_type, allocator_type> __sb_; 6403e519524SHoward Hinnant 6413e519524SHoward Hinnantpublic: 642a11f8b1aSMarek Kurdej // 30.8.3.1 [istringstream.cons], constructors 643a11f8b1aSMarek Kurdej _LIBCPP_INLINE_VISIBILITY 644a8d1182fSArthur O'Dwyer basic_istringstream() 645a8d1182fSArthur O'Dwyer : basic_istream<_CharT, _Traits>(&__sb_), __sb_(ios_base::in) {} 646a11f8b1aSMarek Kurdej 647a11f8b1aSMarek Kurdej _LIBCPP_INLINE_VISIBILITY 648a11f8b1aSMarek Kurdej explicit basic_istringstream(ios_base::openmode __wch) 649a11f8b1aSMarek Kurdej : basic_istream<_CharT, _Traits>(&__sb_), __sb_(__wch | ios_base::in) {} 650a11f8b1aSMarek Kurdej 6514abb5196SLouis Dionne _LIBCPP_INLINE_VISIBILITY 6523e519524SHoward Hinnant explicit basic_istringstream(const string_type& __s, 6534abb5196SLouis Dionne ios_base::openmode __wch = ios_base::in) 6544abb5196SLouis Dionne : basic_istream<_CharT, _Traits>(&__sb_) 6554abb5196SLouis Dionne , __sb_(__s, __wch | ios_base::in) 6564abb5196SLouis Dionne { } 6573e519524SHoward Hinnant 6584abb5196SLouis Dionne _LIBCPP_INLINE_VISIBILITY 6594abb5196SLouis Dionne basic_istringstream(basic_istringstream&& __rhs) 6604abb5196SLouis Dionne : basic_istream<_CharT, _Traits>(_VSTD::move(__rhs)) 6614abb5196SLouis Dionne , __sb_(_VSTD::move(__rhs.__sb_)) 6623e519524SHoward Hinnant { 6633e519524SHoward Hinnant basic_istream<_CharT, _Traits>::set_rdbuf(&__sb_); 6643e519524SHoward Hinnant } 6653e519524SHoward Hinnant 6664abb5196SLouis Dionne // 27.8.2.2 Assign and swap: 6674abb5196SLouis Dionne basic_istringstream& operator=(basic_istringstream&& __rhs) { 668ce48a113SHoward Hinnant basic_istream<char_type, traits_type>::operator=(_VSTD::move(__rhs)); 669ce48a113SHoward Hinnant __sb_ = _VSTD::move(__rhs.__sb_); 6703e519524SHoward Hinnant return *this; 6713e519524SHoward Hinnant } 6724abb5196SLouis Dionne _LIBCPP_INLINE_VISIBILITY 6734abb5196SLouis Dionne void swap(basic_istringstream& __rhs) { 6743e519524SHoward Hinnant basic_istream<char_type, traits_type>::swap(__rhs); 6753e519524SHoward Hinnant __sb_.swap(__rhs.__sb_); 6763e519524SHoward Hinnant } 6773e519524SHoward Hinnant 6784abb5196SLouis Dionne // 27.8.2.3 Members: 6794abb5196SLouis Dionne _LIBCPP_INLINE_VISIBILITY 6804abb5196SLouis Dionne basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const { 6814abb5196SLouis Dionne return const_cast<basic_stringbuf<char_type, traits_type, allocator_type>*>(&__sb_); 6824abb5196SLouis Dionne } 6834abb5196SLouis Dionne _LIBCPP_INLINE_VISIBILITY 6844abb5196SLouis Dionne string_type str() const { 6854abb5196SLouis Dionne return __sb_.str(); 6864abb5196SLouis Dionne } 6874abb5196SLouis Dionne _LIBCPP_INLINE_VISIBILITY 6884abb5196SLouis Dionne void str(const string_type& __s) { 6894abb5196SLouis Dionne __sb_.str(__s); 6904abb5196SLouis Dionne } 6914abb5196SLouis Dionne}; 6924abb5196SLouis Dionne 6933e519524SHoward Hinnanttemplate <class _CharT, class _Traits, class _Allocator> 694c86b3920SEvgeniy Stepanovinline _LIBCPP_INLINE_VISIBILITY 6953e519524SHoward Hinnantvoid 6963e519524SHoward Hinnantswap(basic_istringstream<_CharT, _Traits, _Allocator>& __x, 6973e519524SHoward Hinnant basic_istringstream<_CharT, _Traits, _Allocator>& __y) 6983e519524SHoward Hinnant{ 6993e519524SHoward Hinnant __x.swap(__y); 7003e519524SHoward Hinnant} 7013e519524SHoward Hinnant 7023e519524SHoward Hinnant// basic_ostringstream 7033e519524SHoward Hinnant 7043e519524SHoward Hinnanttemplate <class _CharT, class _Traits, class _Allocator> 705e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS basic_ostringstream 7063e519524SHoward Hinnant : public basic_ostream<_CharT, _Traits> 7073e519524SHoward Hinnant{ 7083e519524SHoward Hinnantpublic: 7093e519524SHoward Hinnant typedef _CharT char_type; 7103e519524SHoward Hinnant typedef _Traits traits_type; 7113e519524SHoward Hinnant typedef typename traits_type::int_type int_type; 7123e519524SHoward Hinnant typedef typename traits_type::pos_type pos_type; 7133e519524SHoward Hinnant typedef typename traits_type::off_type off_type; 7143e519524SHoward Hinnant typedef _Allocator allocator_type; 7153e519524SHoward Hinnant 7163e519524SHoward Hinnant typedef basic_string<char_type, traits_type, allocator_type> string_type; 7173e519524SHoward Hinnant 7183e519524SHoward Hinnantprivate: 7193e519524SHoward Hinnant basic_stringbuf<char_type, traits_type, allocator_type> __sb_; 7203e519524SHoward Hinnant 7213e519524SHoward Hinnantpublic: 722a11f8b1aSMarek Kurdej // 30.8.4.1 [ostringstream.cons], constructors 723a11f8b1aSMarek Kurdej _LIBCPP_INLINE_VISIBILITY 724a8d1182fSArthur O'Dwyer basic_ostringstream() 725a8d1182fSArthur O'Dwyer : basic_ostream<_CharT, _Traits>(&__sb_), __sb_(ios_base::out) {} 726a11f8b1aSMarek Kurdej 727a11f8b1aSMarek Kurdej _LIBCPP_INLINE_VISIBILITY 728a11f8b1aSMarek Kurdej explicit basic_ostringstream(ios_base::openmode __wch) 729a8d1182fSArthur O'Dwyer : basic_ostream<_CharT, _Traits>(&__sb_), __sb_(__wch | ios_base::out) {} 7304abb5196SLouis Dionne 7314abb5196SLouis Dionne _LIBCPP_INLINE_VISIBILITY 7323e519524SHoward Hinnant explicit basic_ostringstream(const string_type& __s, 7334abb5196SLouis Dionne ios_base::openmode __wch = ios_base::out) 7344abb5196SLouis Dionne : basic_ostream<_CharT, _Traits>(&__sb_) 7354abb5196SLouis Dionne , __sb_(__s, __wch | ios_base::out) 7364abb5196SLouis Dionne { } 7373e519524SHoward Hinnant 7384abb5196SLouis Dionne _LIBCPP_INLINE_VISIBILITY 7394abb5196SLouis Dionne basic_ostringstream(basic_ostringstream&& __rhs) 7404abb5196SLouis Dionne : basic_ostream<_CharT, _Traits>(_VSTD::move(__rhs)) 7414abb5196SLouis Dionne , __sb_(_VSTD::move(__rhs.__sb_)) 7423e519524SHoward Hinnant { 7433e519524SHoward Hinnant basic_ostream<_CharT, _Traits>::set_rdbuf(&__sb_); 7443e519524SHoward Hinnant } 7453e519524SHoward Hinnant 7464abb5196SLouis Dionne // 27.8.2.2 Assign and swap: 7474abb5196SLouis Dionne basic_ostringstream& operator=(basic_ostringstream&& __rhs) { 748ce48a113SHoward Hinnant basic_ostream<char_type, traits_type>::operator=(_VSTD::move(__rhs)); 749ce48a113SHoward Hinnant __sb_ = _VSTD::move(__rhs.__sb_); 7503e519524SHoward Hinnant return *this; 7513e519524SHoward Hinnant } 7523e519524SHoward Hinnant 7534abb5196SLouis Dionne _LIBCPP_INLINE_VISIBILITY 7544abb5196SLouis Dionne void swap(basic_ostringstream& __rhs) { 7553e519524SHoward Hinnant basic_ostream<char_type, traits_type>::swap(__rhs); 7563e519524SHoward Hinnant __sb_.swap(__rhs.__sb_); 7573e519524SHoward Hinnant } 7583e519524SHoward Hinnant 7594abb5196SLouis Dionne // 27.8.2.3 Members: 7604abb5196SLouis Dionne _LIBCPP_INLINE_VISIBILITY 7614abb5196SLouis Dionne basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const { 7624abb5196SLouis Dionne return const_cast<basic_stringbuf<char_type, traits_type, allocator_type>*>(&__sb_); 7634abb5196SLouis Dionne } 7644abb5196SLouis Dionne _LIBCPP_INLINE_VISIBILITY 7654abb5196SLouis Dionne string_type str() const { 7664abb5196SLouis Dionne return __sb_.str(); 7674abb5196SLouis Dionne } 7684abb5196SLouis Dionne _LIBCPP_INLINE_VISIBILITY 7694abb5196SLouis Dionne void str(const string_type& __s) { 7704abb5196SLouis Dionne __sb_.str(__s); 7714abb5196SLouis Dionne } 7724abb5196SLouis Dionne}; 7734abb5196SLouis Dionne 7743e519524SHoward Hinnanttemplate <class _CharT, class _Traits, class _Allocator> 775c86b3920SEvgeniy Stepanovinline _LIBCPP_INLINE_VISIBILITY 7763e519524SHoward Hinnantvoid 7773e519524SHoward Hinnantswap(basic_ostringstream<_CharT, _Traits, _Allocator>& __x, 7783e519524SHoward Hinnant basic_ostringstream<_CharT, _Traits, _Allocator>& __y) 7793e519524SHoward Hinnant{ 7803e519524SHoward Hinnant __x.swap(__y); 7813e519524SHoward Hinnant} 7823e519524SHoward Hinnant 7833e519524SHoward Hinnant// basic_stringstream 7843e519524SHoward Hinnant 7853e519524SHoward Hinnanttemplate <class _CharT, class _Traits, class _Allocator> 786e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS basic_stringstream 7873e519524SHoward Hinnant : public basic_iostream<_CharT, _Traits> 7883e519524SHoward Hinnant{ 7893e519524SHoward Hinnantpublic: 7903e519524SHoward Hinnant typedef _CharT char_type; 7913e519524SHoward Hinnant typedef _Traits traits_type; 7923e519524SHoward Hinnant typedef typename traits_type::int_type int_type; 7933e519524SHoward Hinnant typedef typename traits_type::pos_type pos_type; 7943e519524SHoward Hinnant typedef typename traits_type::off_type off_type; 7953e519524SHoward Hinnant typedef _Allocator allocator_type; 7963e519524SHoward Hinnant 7973e519524SHoward Hinnant typedef basic_string<char_type, traits_type, allocator_type> string_type; 7983e519524SHoward Hinnant 7993e519524SHoward Hinnantprivate: 8003e519524SHoward Hinnant basic_stringbuf<char_type, traits_type, allocator_type> __sb_; 8013e519524SHoward Hinnant 8023e519524SHoward Hinnantpublic: 803a11f8b1aSMarek Kurdej // 30.8.5.1 [stringstream.cons], constructors 8044abb5196SLouis Dionne _LIBCPP_INLINE_VISIBILITY 805a8d1182fSArthur O'Dwyer basic_stringstream() 806a8d1182fSArthur O'Dwyer : basic_iostream<_CharT, _Traits>(&__sb_), __sb_(ios_base::in | ios_base::out) {} 807a11f8b1aSMarek Kurdej 808a11f8b1aSMarek Kurdej _LIBCPP_INLINE_VISIBILITY 809a11f8b1aSMarek Kurdej explicit basic_stringstream(ios_base::openmode __wch) 810a11f8b1aSMarek Kurdej : basic_iostream<_CharT, _Traits>(&__sb_), __sb_(__wch) {} 8114abb5196SLouis Dionne 8124abb5196SLouis Dionne _LIBCPP_INLINE_VISIBILITY 8133e519524SHoward Hinnant explicit basic_stringstream(const string_type& __s, 8144abb5196SLouis Dionne ios_base::openmode __wch = ios_base::in | ios_base::out) 8154abb5196SLouis Dionne : basic_iostream<_CharT, _Traits>(&__sb_) 8164abb5196SLouis Dionne , __sb_(__s, __wch) 8174abb5196SLouis Dionne { } 8183e519524SHoward Hinnant 8194abb5196SLouis Dionne _LIBCPP_INLINE_VISIBILITY 8204abb5196SLouis Dionne basic_stringstream(basic_stringstream&& __rhs) 8214abb5196SLouis Dionne : basic_iostream<_CharT, _Traits>(_VSTD::move(__rhs)) 8224abb5196SLouis Dionne , __sb_(_VSTD::move(__rhs.__sb_)) 8233e519524SHoward Hinnant { 8243e519524SHoward Hinnant basic_istream<_CharT, _Traits>::set_rdbuf(&__sb_); 8253e519524SHoward Hinnant } 8263e519524SHoward Hinnant 8274abb5196SLouis Dionne // 27.8.2.2 Assign and swap: 8284abb5196SLouis Dionne basic_stringstream& operator=(basic_stringstream&& __rhs) { 829ce48a113SHoward Hinnant basic_iostream<char_type, traits_type>::operator=(_VSTD::move(__rhs)); 830ce48a113SHoward Hinnant __sb_ = _VSTD::move(__rhs.__sb_); 8313e519524SHoward Hinnant return *this; 8323e519524SHoward Hinnant } 8334abb5196SLouis Dionne _LIBCPP_INLINE_VISIBILITY 8344abb5196SLouis Dionne void swap(basic_stringstream& __rhs) { 8353e519524SHoward Hinnant basic_iostream<char_type, traits_type>::swap(__rhs); 8363e519524SHoward Hinnant __sb_.swap(__rhs.__sb_); 8373e519524SHoward Hinnant } 8383e519524SHoward Hinnant 8394abb5196SLouis Dionne // 27.8.2.3 Members: 8404abb5196SLouis Dionne _LIBCPP_INLINE_VISIBILITY 8414abb5196SLouis Dionne basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const { 8424abb5196SLouis Dionne return const_cast<basic_stringbuf<char_type, traits_type, allocator_type>*>(&__sb_); 8434abb5196SLouis Dionne } 8444abb5196SLouis Dionne _LIBCPP_INLINE_VISIBILITY 8454abb5196SLouis Dionne string_type str() const { 8464abb5196SLouis Dionne return __sb_.str(); 8474abb5196SLouis Dionne } 8484abb5196SLouis Dionne _LIBCPP_INLINE_VISIBILITY 8494abb5196SLouis Dionne void str(const string_type& __s) { 8504abb5196SLouis Dionne __sb_.str(__s); 8514abb5196SLouis Dionne } 8524abb5196SLouis Dionne}; 8534abb5196SLouis Dionne 8543e519524SHoward Hinnanttemplate <class _CharT, class _Traits, class _Allocator> 855c86b3920SEvgeniy Stepanovinline _LIBCPP_INLINE_VISIBILITY 8563e519524SHoward Hinnantvoid 8573e519524SHoward Hinnantswap(basic_stringstream<_CharT, _Traits, _Allocator>& __x, 8583e519524SHoward Hinnant basic_stringstream<_CharT, _Traits, _Allocator>& __y) 8593e519524SHoward Hinnant{ 8603e519524SHoward Hinnant __x.swap(__y); 8613e519524SHoward Hinnant} 8623e519524SHoward Hinnant 863997d41cdSLouis Dionne#if defined(_LIBCPP_ABI_ENABLE_ADDITIONAL_IOSTREAM_EXPLICIT_INSTANTIATIONS_1) 864*2ae52326SLouis Dionneextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_stringbuf<char>; 865*2ae52326SLouis Dionneextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_stringstream<char>; 866*2ae52326SLouis Dionneextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ostringstream<char>; 867*2ae52326SLouis Dionneextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istringstream<char>; 868997d41cdSLouis Dionne#endif 869997d41cdSLouis Dionne 8703e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 8713e519524SHoward Hinnant 872a016efb1SEric Fiselier_LIBCPP_POP_MACROS 873a016efb1SEric Fiselier 8743e519524SHoward Hinnant#endif // _LIBCPP_SSTREAM 875