10b57cec5SDimitry Andric// -*- C++ -*- 20b57cec5SDimitry Andric//===--------------------------- sstream ----------------------------------===// 30b57cec5SDimitry Andric// 40b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 50b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 60b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 70b57cec5SDimitry Andric// 80b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 90b57cec5SDimitry Andric 100b57cec5SDimitry Andric#ifndef _LIBCPP_SSTREAM 110b57cec5SDimitry Andric#define _LIBCPP_SSTREAM 120b57cec5SDimitry Andric 130b57cec5SDimitry Andric/* 140b57cec5SDimitry Andric sstream synopsis 150b57cec5SDimitry Andric 160b57cec5SDimitry Andrictemplate <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > 170b57cec5SDimitry Andricclass basic_stringbuf 180b57cec5SDimitry Andric : public basic_streambuf<charT, traits> 190b57cec5SDimitry Andric{ 200b57cec5SDimitry Andricpublic: 210b57cec5SDimitry Andric typedef charT char_type; 220b57cec5SDimitry Andric typedef traits traits_type; 230b57cec5SDimitry Andric typedef typename traits_type::int_type int_type; 240b57cec5SDimitry Andric typedef typename traits_type::pos_type pos_type; 250b57cec5SDimitry Andric typedef typename traits_type::off_type off_type; 260b57cec5SDimitry Andric typedef Allocator allocator_type; 270b57cec5SDimitry Andric 28e8d8bef9SDimitry Andric // 27.8.1.1 [stringbuf.cons], constructors: 29e8d8bef9SDimitry Andric explicit basic_stringbuf(ios_base::openmode which = ios_base::in | ios_base::out); // before C++20 30e8d8bef9SDimitry Andric basic_stringbuf() : basic_stringbuf(ios_base::in | ios_base::out) {} // C++20 31e8d8bef9SDimitry Andric explicit basic_stringbuf(ios_base::openmode which); // C++20 320b57cec5SDimitry Andric explicit basic_stringbuf(const basic_string<char_type, traits_type, allocator_type>& str, 330b57cec5SDimitry Andric ios_base::openmode which = ios_base::in | ios_base::out); 340b57cec5SDimitry Andric basic_stringbuf(basic_stringbuf&& rhs); 350b57cec5SDimitry Andric 360b57cec5SDimitry Andric // 27.8.1.2 Assign and swap: 370b57cec5SDimitry Andric basic_stringbuf& operator=(basic_stringbuf&& rhs); 380b57cec5SDimitry Andric void swap(basic_stringbuf& rhs); 390b57cec5SDimitry Andric 400b57cec5SDimitry Andric // 27.8.1.3 Get and set: 410b57cec5SDimitry Andric basic_string<char_type, traits_type, allocator_type> str() const; 420b57cec5SDimitry Andric void str(const basic_string<char_type, traits_type, allocator_type>& s); 430b57cec5SDimitry Andric 440b57cec5SDimitry Andricprotected: 450b57cec5SDimitry Andric // 27.8.1.4 Overridden virtual functions: 460b57cec5SDimitry Andric virtual int_type underflow(); 470b57cec5SDimitry Andric virtual int_type pbackfail(int_type c = traits_type::eof()); 480b57cec5SDimitry Andric virtual int_type overflow (int_type c = traits_type::eof()); 490b57cec5SDimitry Andric virtual basic_streambuf<char_type, traits_type>* setbuf(char_type*, streamsize); 500b57cec5SDimitry Andric virtual pos_type seekoff(off_type off, ios_base::seekdir way, 510b57cec5SDimitry Andric ios_base::openmode which = ios_base::in | ios_base::out); 520b57cec5SDimitry Andric virtual pos_type seekpos(pos_type sp, 530b57cec5SDimitry Andric ios_base::openmode which = ios_base::in | ios_base::out); 540b57cec5SDimitry Andric}; 550b57cec5SDimitry Andric 560b57cec5SDimitry Andrictemplate <class charT, class traits, class Allocator> 570b57cec5SDimitry Andric void swap(basic_stringbuf<charT, traits, Allocator>& x, 580b57cec5SDimitry Andric basic_stringbuf<charT, traits, Allocator>& y); 590b57cec5SDimitry Andric 600b57cec5SDimitry Andrictypedef basic_stringbuf<char> stringbuf; 610b57cec5SDimitry Andrictypedef basic_stringbuf<wchar_t> wstringbuf; 620b57cec5SDimitry Andric 630b57cec5SDimitry Andrictemplate <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > 640b57cec5SDimitry Andricclass basic_istringstream 650b57cec5SDimitry Andric : public basic_istream<charT, traits> 660b57cec5SDimitry Andric{ 670b57cec5SDimitry Andricpublic: 680b57cec5SDimitry Andric typedef charT char_type; 690b57cec5SDimitry Andric typedef traits traits_type; 700b57cec5SDimitry Andric typedef typename traits_type::int_type int_type; 710b57cec5SDimitry Andric typedef typename traits_type::pos_type pos_type; 720b57cec5SDimitry Andric typedef typename traits_type::off_type off_type; 730b57cec5SDimitry Andric typedef Allocator allocator_type; 740b57cec5SDimitry Andric 750b57cec5SDimitry Andric // 27.8.2.1 Constructors: 76e8d8bef9SDimitry Andric explicit basic_istringstream(ios_base::openmode which = ios_base::in); // before C++20 77e8d8bef9SDimitry Andric basic_istringstream() : basic_istringstream(ios_base::in) {} // C++20 78e8d8bef9SDimitry Andric explicit basic_istringstream(ios_base::openmode which); // C++20 79e8d8bef9SDimitry Andric 800b57cec5SDimitry Andric explicit basic_istringstream(const basic_string<char_type, traits_type,allocator_type>& str, 810b57cec5SDimitry Andric ios_base::openmode which = ios_base::in); 820b57cec5SDimitry Andric basic_istringstream(basic_istringstream&& rhs); 830b57cec5SDimitry Andric 840b57cec5SDimitry Andric // 27.8.2.2 Assign and swap: 850b57cec5SDimitry Andric basic_istringstream& operator=(basic_istringstream&& rhs); 860b57cec5SDimitry Andric void swap(basic_istringstream& rhs); 870b57cec5SDimitry Andric 880b57cec5SDimitry Andric // 27.8.2.3 Members: 890b57cec5SDimitry Andric basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const; 900b57cec5SDimitry Andric basic_string<char_type, traits_type, allocator_type> str() const; 910b57cec5SDimitry Andric void str(const basic_string<char_type, traits_type, allocator_type>& s); 920b57cec5SDimitry Andric}; 930b57cec5SDimitry Andric 940b57cec5SDimitry Andrictemplate <class charT, class traits, class Allocator> 950b57cec5SDimitry Andric void swap(basic_istringstream<charT, traits, Allocator>& x, 960b57cec5SDimitry Andric basic_istringstream<charT, traits, Allocator>& y); 970b57cec5SDimitry Andric 980b57cec5SDimitry Andrictypedef basic_istringstream<char> istringstream; 990b57cec5SDimitry Andrictypedef basic_istringstream<wchar_t> wistringstream; 1000b57cec5SDimitry Andric 1010b57cec5SDimitry Andrictemplate <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > 1020b57cec5SDimitry Andricclass basic_ostringstream 1030b57cec5SDimitry Andric : public basic_ostream<charT, traits> 1040b57cec5SDimitry Andric{ 1050b57cec5SDimitry Andricpublic: 1060b57cec5SDimitry Andric // types: 1070b57cec5SDimitry Andric typedef charT char_type; 1080b57cec5SDimitry Andric typedef traits traits_type; 1090b57cec5SDimitry Andric typedef typename traits_type::int_type int_type; 1100b57cec5SDimitry Andric typedef typename traits_type::pos_type pos_type; 1110b57cec5SDimitry Andric typedef typename traits_type::off_type off_type; 1120b57cec5SDimitry Andric typedef Allocator allocator_type; 1130b57cec5SDimitry Andric 1140b57cec5SDimitry Andric // 27.8.3.1 Constructors/destructor: 115e8d8bef9SDimitry Andric explicit basic_ostringstream(ios_base::openmode which = ios_base::out); // before C++20 116e8d8bef9SDimitry Andric basic_ostringstream() : basic_ostringstream(ios_base::out) {} // C++20 117e8d8bef9SDimitry Andric explicit basic_ostringstream(ios_base::openmode which); // C++20 118e8d8bef9SDimitry Andric 1190b57cec5SDimitry Andric explicit basic_ostringstream(const basic_string<char_type, traits_type, allocator_type>& str, 1200b57cec5SDimitry Andric ios_base::openmode which = ios_base::out); 1210b57cec5SDimitry Andric basic_ostringstream(basic_ostringstream&& rhs); 1220b57cec5SDimitry Andric 1230b57cec5SDimitry Andric // 27.8.3.2 Assign/swap: 1240b57cec5SDimitry Andric basic_ostringstream& operator=(basic_ostringstream&& rhs); 1250b57cec5SDimitry Andric void swap(basic_ostringstream& rhs); 1260b57cec5SDimitry Andric 1270b57cec5SDimitry Andric // 27.8.3.3 Members: 1280b57cec5SDimitry Andric basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const; 1290b57cec5SDimitry Andric basic_string<char_type, traits_type, allocator_type> str() const; 1300b57cec5SDimitry Andric void str(const basic_string<char_type, traits_type, allocator_type>& s); 1310b57cec5SDimitry Andric}; 1320b57cec5SDimitry Andric 1330b57cec5SDimitry Andrictemplate <class charT, class traits, class Allocator> 1340b57cec5SDimitry Andric void swap(basic_ostringstream<charT, traits, Allocator>& x, 1350b57cec5SDimitry Andric basic_ostringstream<charT, traits, Allocator>& y); 1360b57cec5SDimitry Andric 1370b57cec5SDimitry Andrictypedef basic_ostringstream<char> ostringstream; 1380b57cec5SDimitry Andrictypedef basic_ostringstream<wchar_t> wostringstream; 1390b57cec5SDimitry Andric 1400b57cec5SDimitry Andrictemplate <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > 1410b57cec5SDimitry Andricclass basic_stringstream 1420b57cec5SDimitry Andric : public basic_iostream<charT, traits> 1430b57cec5SDimitry Andric{ 1440b57cec5SDimitry Andricpublic: 1450b57cec5SDimitry Andric // types: 1460b57cec5SDimitry Andric typedef charT char_type; 1470b57cec5SDimitry Andric typedef traits traits_type; 1480b57cec5SDimitry Andric typedef typename traits_type::int_type int_type; 1490b57cec5SDimitry Andric typedef typename traits_type::pos_type pos_type; 1500b57cec5SDimitry Andric typedef typename traits_type::off_type off_type; 1510b57cec5SDimitry Andric typedef Allocator allocator_type; 1520b57cec5SDimitry Andric 1530b57cec5SDimitry Andric // constructors/destructor 154e8d8bef9SDimitry Andric explicit basic_stringstream(ios_base::openmode which = ios_base::out | ios_base::in); // before C++20 155e8d8bef9SDimitry Andric basic_stringstream() : basic_stringstream(ios_base::out | ios_base::in) {} // C++20 156e8d8bef9SDimitry Andric explicit basic_stringstream(ios_base::openmode which); // C++20 157e8d8bef9SDimitry Andric 1580b57cec5SDimitry Andric explicit basic_stringstream(const basic_string<char_type, traits_type, allocator_type>& str, 1590b57cec5SDimitry Andric ios_base::openmode which = ios_base::out|ios_base::in); 1600b57cec5SDimitry Andric basic_stringstream(basic_stringstream&& rhs); 1610b57cec5SDimitry Andric 1620b57cec5SDimitry Andric // 27.8.5.1 Assign/swap: 1630b57cec5SDimitry Andric basic_stringstream& operator=(basic_stringstream&& rhs); 1640b57cec5SDimitry Andric void swap(basic_stringstream& rhs); 1650b57cec5SDimitry Andric 1660b57cec5SDimitry Andric // Members: 1670b57cec5SDimitry Andric basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const; 1680b57cec5SDimitry Andric basic_string<char_type, traits_type, allocator_type> str() const; 1690b57cec5SDimitry Andric void str(const basic_string<char_type, traits_type, allocator_type>& str); 1700b57cec5SDimitry Andric}; 1710b57cec5SDimitry Andric 1720b57cec5SDimitry Andrictemplate <class charT, class traits, class Allocator> 1730b57cec5SDimitry Andric void swap(basic_stringstream<charT, traits, Allocator>& x, 1740b57cec5SDimitry Andric basic_stringstream<charT, traits, Allocator>& y); 1750b57cec5SDimitry Andric 1760b57cec5SDimitry Andrictypedef basic_stringstream<char> stringstream; 1770b57cec5SDimitry Andrictypedef basic_stringstream<wchar_t> wstringstream; 1780b57cec5SDimitry Andric 1790b57cec5SDimitry Andric} // std 1800b57cec5SDimitry Andric 1810b57cec5SDimitry Andric*/ 1820b57cec5SDimitry Andric 1830b57cec5SDimitry Andric#include <__config> 1840b57cec5SDimitry Andric#include <istream> 185*fe6060f1SDimitry Andric#include <ostream> 1860b57cec5SDimitry Andric#include <string> 1870b57cec5SDimitry Andric 1880b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 1890b57cec5SDimitry Andric#pragma GCC system_header 1900b57cec5SDimitry Andric#endif 1910b57cec5SDimitry Andric 1920b57cec5SDimitry Andric_LIBCPP_PUSH_MACROS 1930b57cec5SDimitry Andric#include <__undef_macros> 1940b57cec5SDimitry Andric 1950b57cec5SDimitry Andric 1960b57cec5SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD 1970b57cec5SDimitry Andric 1980b57cec5SDimitry Andric// basic_stringbuf 1990b57cec5SDimitry Andric 2000b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 2010b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_stringbuf 2020b57cec5SDimitry Andric : public basic_streambuf<_CharT, _Traits> 2030b57cec5SDimitry Andric{ 2040b57cec5SDimitry Andricpublic: 2050b57cec5SDimitry Andric typedef _CharT char_type; 2060b57cec5SDimitry Andric typedef _Traits traits_type; 2070b57cec5SDimitry Andric typedef typename traits_type::int_type int_type; 2080b57cec5SDimitry Andric typedef typename traits_type::pos_type pos_type; 2090b57cec5SDimitry Andric typedef typename traits_type::off_type off_type; 2100b57cec5SDimitry Andric typedef _Allocator allocator_type; 2110b57cec5SDimitry Andric 2120b57cec5SDimitry Andric typedef basic_string<char_type, traits_type, allocator_type> string_type; 2130b57cec5SDimitry Andric 2140b57cec5SDimitry Andricprivate: 2150b57cec5SDimitry Andric 2160b57cec5SDimitry Andric string_type __str_; 2170b57cec5SDimitry Andric mutable char_type* __hm_; 2180b57cec5SDimitry Andric ios_base::openmode __mode_; 2190b57cec5SDimitry Andric 2200b57cec5SDimitry Andricpublic: 221e8d8bef9SDimitry Andric // 30.8.2.1 [stringbuf.cons], constructors 222e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 223*fe6060f1SDimitry Andric basic_stringbuf() 224*fe6060f1SDimitry Andric : __hm_(nullptr), __mode_(ios_base::in | ios_base::out) {} 225e8d8bef9SDimitry Andric 226e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 227e8d8bef9SDimitry Andric explicit basic_stringbuf(ios_base::openmode __wch) 228e8d8bef9SDimitry Andric : __hm_(nullptr), __mode_(__wch) {} 229e8d8bef9SDimitry Andric 230e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 231e8d8bef9SDimitry Andric explicit basic_stringbuf(const string_type& __s, 232e8d8bef9SDimitry Andric ios_base::openmode __wch = ios_base::in | ios_base::out) 233e8d8bef9SDimitry Andric : __str_(__s.get_allocator()), __hm_(nullptr), __mode_(__wch) 234e8d8bef9SDimitry Andric { 235e8d8bef9SDimitry Andric str(__s); 236e8d8bef9SDimitry Andric } 237e8d8bef9SDimitry Andric 2380b57cec5SDimitry Andric basic_stringbuf(basic_stringbuf&& __rhs); 2390b57cec5SDimitry Andric 2400b57cec5SDimitry Andric // 27.8.1.2 Assign and swap: 2410b57cec5SDimitry Andric basic_stringbuf& operator=(basic_stringbuf&& __rhs); 2420b57cec5SDimitry Andric void swap(basic_stringbuf& __rhs); 2430b57cec5SDimitry Andric 2440b57cec5SDimitry Andric // 27.8.1.3 Get and set: 2450b57cec5SDimitry Andric string_type str() const; 2460b57cec5SDimitry Andric void str(const string_type& __s); 2470b57cec5SDimitry Andric 2480b57cec5SDimitry Andricprotected: 2490b57cec5SDimitry Andric // 27.8.1.4 Overridden virtual functions: 2500b57cec5SDimitry Andric virtual int_type underflow(); 2510b57cec5SDimitry Andric virtual int_type pbackfail(int_type __c = traits_type::eof()); 2520b57cec5SDimitry Andric virtual int_type overflow (int_type __c = traits_type::eof()); 2530b57cec5SDimitry Andric virtual pos_type seekoff(off_type __off, ios_base::seekdir __way, 2540b57cec5SDimitry Andric ios_base::openmode __wch = ios_base::in | ios_base::out); 255e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 2560b57cec5SDimitry Andric virtual pos_type seekpos(pos_type __sp, 257e8d8bef9SDimitry Andric ios_base::openmode __wch = ios_base::in | ios_base::out) { 258e8d8bef9SDimitry Andric return seekoff(__sp, ios_base::beg, __wch); 259e8d8bef9SDimitry Andric } 2600b57cec5SDimitry Andric}; 2610b57cec5SDimitry Andric 2620b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 2630b57cec5SDimitry Andricbasic_stringbuf<_CharT, _Traits, _Allocator>::basic_stringbuf(basic_stringbuf&& __rhs) 2640b57cec5SDimitry Andric : __mode_(__rhs.__mode_) 2650b57cec5SDimitry Andric{ 2660b57cec5SDimitry Andric char_type* __p = const_cast<char_type*>(__rhs.__str_.data()); 2670b57cec5SDimitry Andric ptrdiff_t __binp = -1; 2680b57cec5SDimitry Andric ptrdiff_t __ninp = -1; 2690b57cec5SDimitry Andric ptrdiff_t __einp = -1; 2700b57cec5SDimitry Andric if (__rhs.eback() != nullptr) 2710b57cec5SDimitry Andric { 2720b57cec5SDimitry Andric __binp = __rhs.eback() - __p; 2730b57cec5SDimitry Andric __ninp = __rhs.gptr() - __p; 2740b57cec5SDimitry Andric __einp = __rhs.egptr() - __p; 2750b57cec5SDimitry Andric } 2760b57cec5SDimitry Andric ptrdiff_t __bout = -1; 2770b57cec5SDimitry Andric ptrdiff_t __nout = -1; 2780b57cec5SDimitry Andric ptrdiff_t __eout = -1; 2790b57cec5SDimitry Andric if (__rhs.pbase() != nullptr) 2800b57cec5SDimitry Andric { 2810b57cec5SDimitry Andric __bout = __rhs.pbase() - __p; 2820b57cec5SDimitry Andric __nout = __rhs.pptr() - __p; 2830b57cec5SDimitry Andric __eout = __rhs.epptr() - __p; 2840b57cec5SDimitry Andric } 2850b57cec5SDimitry Andric ptrdiff_t __hm = __rhs.__hm_ == nullptr ? -1 : __rhs.__hm_ - __p; 2860b57cec5SDimitry Andric __str_ = _VSTD::move(__rhs.__str_); 2870b57cec5SDimitry Andric __p = const_cast<char_type*>(__str_.data()); 2880b57cec5SDimitry Andric if (__binp != -1) 2890b57cec5SDimitry Andric this->setg(__p + __binp, __p + __ninp, __p + __einp); 2900b57cec5SDimitry Andric if (__bout != -1) 2910b57cec5SDimitry Andric { 2920b57cec5SDimitry Andric this->setp(__p + __bout, __p + __eout); 2930b57cec5SDimitry Andric this->__pbump(__nout); 2940b57cec5SDimitry Andric } 2950b57cec5SDimitry Andric __hm_ = __hm == -1 ? nullptr : __p + __hm; 2960b57cec5SDimitry Andric __p = const_cast<char_type*>(__rhs.__str_.data()); 2970b57cec5SDimitry Andric __rhs.setg(__p, __p, __p); 2980b57cec5SDimitry Andric __rhs.setp(__p, __p); 2990b57cec5SDimitry Andric __rhs.__hm_ = __p; 3000b57cec5SDimitry Andric this->pubimbue(__rhs.getloc()); 3010b57cec5SDimitry Andric} 3020b57cec5SDimitry Andric 3030b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 3040b57cec5SDimitry Andricbasic_stringbuf<_CharT, _Traits, _Allocator>& 3050b57cec5SDimitry Andricbasic_stringbuf<_CharT, _Traits, _Allocator>::operator=(basic_stringbuf&& __rhs) 3060b57cec5SDimitry Andric{ 3070b57cec5SDimitry Andric char_type* __p = const_cast<char_type*>(__rhs.__str_.data()); 3080b57cec5SDimitry Andric ptrdiff_t __binp = -1; 3090b57cec5SDimitry Andric ptrdiff_t __ninp = -1; 3100b57cec5SDimitry Andric ptrdiff_t __einp = -1; 3110b57cec5SDimitry Andric if (__rhs.eback() != nullptr) 3120b57cec5SDimitry Andric { 3130b57cec5SDimitry Andric __binp = __rhs.eback() - __p; 3140b57cec5SDimitry Andric __ninp = __rhs.gptr() - __p; 3150b57cec5SDimitry Andric __einp = __rhs.egptr() - __p; 3160b57cec5SDimitry Andric } 3170b57cec5SDimitry Andric ptrdiff_t __bout = -1; 3180b57cec5SDimitry Andric ptrdiff_t __nout = -1; 3190b57cec5SDimitry Andric ptrdiff_t __eout = -1; 3200b57cec5SDimitry Andric if (__rhs.pbase() != nullptr) 3210b57cec5SDimitry Andric { 3220b57cec5SDimitry Andric __bout = __rhs.pbase() - __p; 3230b57cec5SDimitry Andric __nout = __rhs.pptr() - __p; 3240b57cec5SDimitry Andric __eout = __rhs.epptr() - __p; 3250b57cec5SDimitry Andric } 3260b57cec5SDimitry Andric ptrdiff_t __hm = __rhs.__hm_ == nullptr ? -1 : __rhs.__hm_ - __p; 3270b57cec5SDimitry Andric __str_ = _VSTD::move(__rhs.__str_); 3280b57cec5SDimitry Andric __p = const_cast<char_type*>(__str_.data()); 3290b57cec5SDimitry Andric if (__binp != -1) 3300b57cec5SDimitry Andric this->setg(__p + __binp, __p + __ninp, __p + __einp); 3310b57cec5SDimitry Andric else 3320b57cec5SDimitry Andric this->setg(nullptr, nullptr, nullptr); 3330b57cec5SDimitry Andric if (__bout != -1) 3340b57cec5SDimitry Andric { 3350b57cec5SDimitry Andric this->setp(__p + __bout, __p + __eout); 3360b57cec5SDimitry Andric this->__pbump(__nout); 3370b57cec5SDimitry Andric } 3380b57cec5SDimitry Andric else 3390b57cec5SDimitry Andric this->setp(nullptr, nullptr); 3400b57cec5SDimitry Andric 3410b57cec5SDimitry Andric __hm_ = __hm == -1 ? nullptr : __p + __hm; 3420b57cec5SDimitry Andric __mode_ = __rhs.__mode_; 3430b57cec5SDimitry Andric __p = const_cast<char_type*>(__rhs.__str_.data()); 3440b57cec5SDimitry Andric __rhs.setg(__p, __p, __p); 3450b57cec5SDimitry Andric __rhs.setp(__p, __p); 3460b57cec5SDimitry Andric __rhs.__hm_ = __p; 3470b57cec5SDimitry Andric this->pubimbue(__rhs.getloc()); 3480b57cec5SDimitry Andric return *this; 3490b57cec5SDimitry Andric} 3500b57cec5SDimitry Andric 3510b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 3520b57cec5SDimitry Andricvoid 3530b57cec5SDimitry Andricbasic_stringbuf<_CharT, _Traits, _Allocator>::swap(basic_stringbuf& __rhs) 3540b57cec5SDimitry Andric{ 3550b57cec5SDimitry Andric char_type* __p = const_cast<char_type*>(__rhs.__str_.data()); 3560b57cec5SDimitry Andric ptrdiff_t __rbinp = -1; 3570b57cec5SDimitry Andric ptrdiff_t __rninp = -1; 3580b57cec5SDimitry Andric ptrdiff_t __reinp = -1; 3590b57cec5SDimitry Andric if (__rhs.eback() != nullptr) 3600b57cec5SDimitry Andric { 3610b57cec5SDimitry Andric __rbinp = __rhs.eback() - __p; 3620b57cec5SDimitry Andric __rninp = __rhs.gptr() - __p; 3630b57cec5SDimitry Andric __reinp = __rhs.egptr() - __p; 3640b57cec5SDimitry Andric } 3650b57cec5SDimitry Andric ptrdiff_t __rbout = -1; 3660b57cec5SDimitry Andric ptrdiff_t __rnout = -1; 3670b57cec5SDimitry Andric ptrdiff_t __reout = -1; 3680b57cec5SDimitry Andric if (__rhs.pbase() != nullptr) 3690b57cec5SDimitry Andric { 3700b57cec5SDimitry Andric __rbout = __rhs.pbase() - __p; 3710b57cec5SDimitry Andric __rnout = __rhs.pptr() - __p; 3720b57cec5SDimitry Andric __reout = __rhs.epptr() - __p; 3730b57cec5SDimitry Andric } 3740b57cec5SDimitry Andric ptrdiff_t __rhm = __rhs.__hm_ == nullptr ? -1 : __rhs.__hm_ - __p; 3750b57cec5SDimitry Andric __p = const_cast<char_type*>(__str_.data()); 3760b57cec5SDimitry Andric ptrdiff_t __lbinp = -1; 3770b57cec5SDimitry Andric ptrdiff_t __lninp = -1; 3780b57cec5SDimitry Andric ptrdiff_t __leinp = -1; 3790b57cec5SDimitry Andric if (this->eback() != nullptr) 3800b57cec5SDimitry Andric { 3810b57cec5SDimitry Andric __lbinp = this->eback() - __p; 3820b57cec5SDimitry Andric __lninp = this->gptr() - __p; 3830b57cec5SDimitry Andric __leinp = this->egptr() - __p; 3840b57cec5SDimitry Andric } 3850b57cec5SDimitry Andric ptrdiff_t __lbout = -1; 3860b57cec5SDimitry Andric ptrdiff_t __lnout = -1; 3870b57cec5SDimitry Andric ptrdiff_t __leout = -1; 3880b57cec5SDimitry Andric if (this->pbase() != nullptr) 3890b57cec5SDimitry Andric { 3900b57cec5SDimitry Andric __lbout = this->pbase() - __p; 3910b57cec5SDimitry Andric __lnout = this->pptr() - __p; 3920b57cec5SDimitry Andric __leout = this->epptr() - __p; 3930b57cec5SDimitry Andric } 3940b57cec5SDimitry Andric ptrdiff_t __lhm = __hm_ == nullptr ? -1 : __hm_ - __p; 3950b57cec5SDimitry Andric _VSTD::swap(__mode_, __rhs.__mode_); 3960b57cec5SDimitry Andric __str_.swap(__rhs.__str_); 3970b57cec5SDimitry Andric __p = const_cast<char_type*>(__str_.data()); 3980b57cec5SDimitry Andric if (__rbinp != -1) 3990b57cec5SDimitry Andric this->setg(__p + __rbinp, __p + __rninp, __p + __reinp); 4000b57cec5SDimitry Andric else 4010b57cec5SDimitry Andric this->setg(nullptr, nullptr, nullptr); 4020b57cec5SDimitry Andric if (__rbout != -1) 4030b57cec5SDimitry Andric { 4040b57cec5SDimitry Andric this->setp(__p + __rbout, __p + __reout); 4050b57cec5SDimitry Andric this->__pbump(__rnout); 4060b57cec5SDimitry Andric } 4070b57cec5SDimitry Andric else 4080b57cec5SDimitry Andric this->setp(nullptr, nullptr); 4090b57cec5SDimitry Andric __hm_ = __rhm == -1 ? nullptr : __p + __rhm; 4100b57cec5SDimitry Andric __p = const_cast<char_type*>(__rhs.__str_.data()); 4110b57cec5SDimitry Andric if (__lbinp != -1) 4120b57cec5SDimitry Andric __rhs.setg(__p + __lbinp, __p + __lninp, __p + __leinp); 4130b57cec5SDimitry Andric else 4140b57cec5SDimitry Andric __rhs.setg(nullptr, nullptr, nullptr); 4150b57cec5SDimitry Andric if (__lbout != -1) 4160b57cec5SDimitry Andric { 4170b57cec5SDimitry Andric __rhs.setp(__p + __lbout, __p + __leout); 4180b57cec5SDimitry Andric __rhs.__pbump(__lnout); 4190b57cec5SDimitry Andric } 4200b57cec5SDimitry Andric else 4210b57cec5SDimitry Andric __rhs.setp(nullptr, nullptr); 4220b57cec5SDimitry Andric __rhs.__hm_ = __lhm == -1 ? nullptr : __p + __lhm; 4230b57cec5SDimitry Andric locale __tl = __rhs.getloc(); 4240b57cec5SDimitry Andric __rhs.pubimbue(this->getloc()); 4250b57cec5SDimitry Andric this->pubimbue(__tl); 4260b57cec5SDimitry Andric} 4270b57cec5SDimitry Andric 4280b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 4290b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 4300b57cec5SDimitry Andricvoid 4310b57cec5SDimitry Andricswap(basic_stringbuf<_CharT, _Traits, _Allocator>& __x, 4320b57cec5SDimitry Andric basic_stringbuf<_CharT, _Traits, _Allocator>& __y) 4330b57cec5SDimitry Andric{ 4340b57cec5SDimitry Andric __x.swap(__y); 4350b57cec5SDimitry Andric} 4360b57cec5SDimitry Andric 4370b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 4380b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator> 4390b57cec5SDimitry Andricbasic_stringbuf<_CharT, _Traits, _Allocator>::str() const 4400b57cec5SDimitry Andric{ 4410b57cec5SDimitry Andric if (__mode_ & ios_base::out) 4420b57cec5SDimitry Andric { 4430b57cec5SDimitry Andric if (__hm_ < this->pptr()) 4440b57cec5SDimitry Andric __hm_ = this->pptr(); 4450b57cec5SDimitry Andric return string_type(this->pbase(), __hm_, __str_.get_allocator()); 4460b57cec5SDimitry Andric } 4470b57cec5SDimitry Andric else if (__mode_ & ios_base::in) 4480b57cec5SDimitry Andric return string_type(this->eback(), this->egptr(), __str_.get_allocator()); 4490b57cec5SDimitry Andric return string_type(__str_.get_allocator()); 4500b57cec5SDimitry Andric} 4510b57cec5SDimitry Andric 4520b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 4530b57cec5SDimitry Andricvoid 4540b57cec5SDimitry Andricbasic_stringbuf<_CharT, _Traits, _Allocator>::str(const string_type& __s) 4550b57cec5SDimitry Andric{ 4560b57cec5SDimitry Andric __str_ = __s; 457e8d8bef9SDimitry Andric __hm_ = nullptr; 4580b57cec5SDimitry Andric if (__mode_ & ios_base::in) 4590b57cec5SDimitry Andric { 4600b57cec5SDimitry Andric __hm_ = const_cast<char_type*>(__str_.data()) + __str_.size(); 4610b57cec5SDimitry Andric this->setg(const_cast<char_type*>(__str_.data()), 4620b57cec5SDimitry Andric const_cast<char_type*>(__str_.data()), 4630b57cec5SDimitry Andric __hm_); 4640b57cec5SDimitry Andric } 4650b57cec5SDimitry Andric if (__mode_ & ios_base::out) 4660b57cec5SDimitry Andric { 4670b57cec5SDimitry Andric typename string_type::size_type __sz = __str_.size(); 4680b57cec5SDimitry Andric __hm_ = const_cast<char_type*>(__str_.data()) + __sz; 4690b57cec5SDimitry Andric __str_.resize(__str_.capacity()); 4700b57cec5SDimitry Andric this->setp(const_cast<char_type*>(__str_.data()), 4710b57cec5SDimitry Andric const_cast<char_type*>(__str_.data()) + __str_.size()); 4720b57cec5SDimitry Andric if (__mode_ & (ios_base::app | ios_base::ate)) 4730b57cec5SDimitry Andric { 4740b57cec5SDimitry Andric while (__sz > INT_MAX) 4750b57cec5SDimitry Andric { 4760b57cec5SDimitry Andric this->pbump(INT_MAX); 4770b57cec5SDimitry Andric __sz -= INT_MAX; 4780b57cec5SDimitry Andric } 4790b57cec5SDimitry Andric if (__sz > 0) 4800b57cec5SDimitry Andric this->pbump(__sz); 4810b57cec5SDimitry Andric } 4820b57cec5SDimitry Andric } 4830b57cec5SDimitry Andric} 4840b57cec5SDimitry Andric 4850b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 4860b57cec5SDimitry Andrictypename basic_stringbuf<_CharT, _Traits, _Allocator>::int_type 4870b57cec5SDimitry Andricbasic_stringbuf<_CharT, _Traits, _Allocator>::underflow() 4880b57cec5SDimitry Andric{ 4890b57cec5SDimitry Andric if (__hm_ < this->pptr()) 4900b57cec5SDimitry Andric __hm_ = this->pptr(); 4910b57cec5SDimitry Andric if (__mode_ & ios_base::in) 4920b57cec5SDimitry Andric { 4930b57cec5SDimitry Andric if (this->egptr() < __hm_) 4940b57cec5SDimitry Andric this->setg(this->eback(), this->gptr(), __hm_); 4950b57cec5SDimitry Andric if (this->gptr() < this->egptr()) 4960b57cec5SDimitry Andric return traits_type::to_int_type(*this->gptr()); 4970b57cec5SDimitry Andric } 4980b57cec5SDimitry Andric return traits_type::eof(); 4990b57cec5SDimitry Andric} 5000b57cec5SDimitry Andric 5010b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 5020b57cec5SDimitry Andrictypename basic_stringbuf<_CharT, _Traits, _Allocator>::int_type 5030b57cec5SDimitry Andricbasic_stringbuf<_CharT, _Traits, _Allocator>::pbackfail(int_type __c) 5040b57cec5SDimitry Andric{ 5050b57cec5SDimitry Andric if (__hm_ < this->pptr()) 5060b57cec5SDimitry Andric __hm_ = this->pptr(); 5070b57cec5SDimitry Andric if (this->eback() < this->gptr()) 5080b57cec5SDimitry Andric { 5090b57cec5SDimitry Andric if (traits_type::eq_int_type(__c, traits_type::eof())) 5100b57cec5SDimitry Andric { 5110b57cec5SDimitry Andric this->setg(this->eback(), this->gptr()-1, __hm_); 5120b57cec5SDimitry Andric return traits_type::not_eof(__c); 5130b57cec5SDimitry Andric } 5140b57cec5SDimitry Andric if ((__mode_ & ios_base::out) || 5150b57cec5SDimitry Andric traits_type::eq(traits_type::to_char_type(__c), this->gptr()[-1])) 5160b57cec5SDimitry Andric { 5170b57cec5SDimitry Andric this->setg(this->eback(), this->gptr()-1, __hm_); 5180b57cec5SDimitry Andric *this->gptr() = traits_type::to_char_type(__c); 5190b57cec5SDimitry Andric return __c; 5200b57cec5SDimitry Andric } 5210b57cec5SDimitry Andric } 5220b57cec5SDimitry Andric return traits_type::eof(); 5230b57cec5SDimitry Andric} 5240b57cec5SDimitry Andric 5250b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 5260b57cec5SDimitry Andrictypename basic_stringbuf<_CharT, _Traits, _Allocator>::int_type 5270b57cec5SDimitry Andricbasic_stringbuf<_CharT, _Traits, _Allocator>::overflow(int_type __c) 5280b57cec5SDimitry Andric{ 5290b57cec5SDimitry Andric if (!traits_type::eq_int_type(__c, traits_type::eof())) 5300b57cec5SDimitry Andric { 5310b57cec5SDimitry Andric ptrdiff_t __ninp = this->gptr() - this->eback(); 5320b57cec5SDimitry Andric if (this->pptr() == this->epptr()) 5330b57cec5SDimitry Andric { 5340b57cec5SDimitry Andric if (!(__mode_ & ios_base::out)) 5350b57cec5SDimitry Andric return traits_type::eof(); 5360b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS 5370b57cec5SDimitry Andric try 5380b57cec5SDimitry Andric { 5390b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS 5400b57cec5SDimitry Andric ptrdiff_t __nout = this->pptr() - this->pbase(); 5410b57cec5SDimitry Andric ptrdiff_t __hm = __hm_ - this->pbase(); 5420b57cec5SDimitry Andric __str_.push_back(char_type()); 5430b57cec5SDimitry Andric __str_.resize(__str_.capacity()); 5440b57cec5SDimitry Andric char_type* __p = const_cast<char_type*>(__str_.data()); 5450b57cec5SDimitry Andric this->setp(__p, __p + __str_.size()); 5460b57cec5SDimitry Andric this->__pbump(__nout); 5470b57cec5SDimitry Andric __hm_ = this->pbase() + __hm; 5480b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS 5490b57cec5SDimitry Andric } 5500b57cec5SDimitry Andric catch (...) 5510b57cec5SDimitry Andric { 5520b57cec5SDimitry Andric return traits_type::eof(); 5530b57cec5SDimitry Andric } 5540b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS 5550b57cec5SDimitry Andric } 5560b57cec5SDimitry Andric __hm_ = _VSTD::max(this->pptr() + 1, __hm_); 5570b57cec5SDimitry Andric if (__mode_ & ios_base::in) 5580b57cec5SDimitry Andric { 5590b57cec5SDimitry Andric char_type* __p = const_cast<char_type*>(__str_.data()); 5600b57cec5SDimitry Andric this->setg(__p, __p + __ninp, __hm_); 5610b57cec5SDimitry Andric } 5620b57cec5SDimitry Andric return this->sputc(traits_type::to_char_type(__c)); 5630b57cec5SDimitry Andric } 5640b57cec5SDimitry Andric return traits_type::not_eof(__c); 5650b57cec5SDimitry Andric} 5660b57cec5SDimitry Andric 5670b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 5680b57cec5SDimitry Andrictypename basic_stringbuf<_CharT, _Traits, _Allocator>::pos_type 5690b57cec5SDimitry Andricbasic_stringbuf<_CharT, _Traits, _Allocator>::seekoff(off_type __off, 5700b57cec5SDimitry Andric ios_base::seekdir __way, 5710b57cec5SDimitry Andric ios_base::openmode __wch) 5720b57cec5SDimitry Andric{ 5730b57cec5SDimitry Andric if (__hm_ < this->pptr()) 5740b57cec5SDimitry Andric __hm_ = this->pptr(); 5750b57cec5SDimitry Andric if ((__wch & (ios_base::in | ios_base::out)) == 0) 5760b57cec5SDimitry Andric return pos_type(-1); 5770b57cec5SDimitry Andric if ((__wch & (ios_base::in | ios_base::out)) == (ios_base::in | ios_base::out) 5780b57cec5SDimitry Andric && __way == ios_base::cur) 5790b57cec5SDimitry Andric return pos_type(-1); 5800b57cec5SDimitry Andric const ptrdiff_t __hm = __hm_ == nullptr ? 0 : __hm_ - __str_.data(); 5810b57cec5SDimitry Andric off_type __noff; 5820b57cec5SDimitry Andric switch (__way) 5830b57cec5SDimitry Andric { 5840b57cec5SDimitry Andric case ios_base::beg: 5850b57cec5SDimitry Andric __noff = 0; 5860b57cec5SDimitry Andric break; 5870b57cec5SDimitry Andric case ios_base::cur: 5880b57cec5SDimitry Andric if (__wch & ios_base::in) 5890b57cec5SDimitry Andric __noff = this->gptr() - this->eback(); 5900b57cec5SDimitry Andric else 5910b57cec5SDimitry Andric __noff = this->pptr() - this->pbase(); 5920b57cec5SDimitry Andric break; 5930b57cec5SDimitry Andric case ios_base::end: 5940b57cec5SDimitry Andric __noff = __hm; 5950b57cec5SDimitry Andric break; 5960b57cec5SDimitry Andric default: 5970b57cec5SDimitry Andric return pos_type(-1); 5980b57cec5SDimitry Andric } 5990b57cec5SDimitry Andric __noff += __off; 6000b57cec5SDimitry Andric if (__noff < 0 || __hm < __noff) 6010b57cec5SDimitry Andric return pos_type(-1); 6020b57cec5SDimitry Andric if (__noff != 0) 6030b57cec5SDimitry Andric { 604e8d8bef9SDimitry Andric if ((__wch & ios_base::in) && this->gptr() == nullptr) 6050b57cec5SDimitry Andric return pos_type(-1); 606e8d8bef9SDimitry Andric if ((__wch & ios_base::out) && this->pptr() == nullptr) 6070b57cec5SDimitry Andric return pos_type(-1); 6080b57cec5SDimitry Andric } 6090b57cec5SDimitry Andric if (__wch & ios_base::in) 6100b57cec5SDimitry Andric this->setg(this->eback(), this->eback() + __noff, __hm_); 6110b57cec5SDimitry Andric if (__wch & ios_base::out) 6120b57cec5SDimitry Andric { 6130b57cec5SDimitry Andric this->setp(this->pbase(), this->epptr()); 6140b57cec5SDimitry Andric this->pbump(__noff); 6150b57cec5SDimitry Andric } 6160b57cec5SDimitry Andric return pos_type(__noff); 6170b57cec5SDimitry Andric} 6180b57cec5SDimitry Andric 6190b57cec5SDimitry Andric// basic_istringstream 6200b57cec5SDimitry Andric 6210b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 6220b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_istringstream 6230b57cec5SDimitry Andric : public basic_istream<_CharT, _Traits> 6240b57cec5SDimitry Andric{ 6250b57cec5SDimitry Andricpublic: 6260b57cec5SDimitry Andric typedef _CharT char_type; 6270b57cec5SDimitry Andric typedef _Traits traits_type; 6280b57cec5SDimitry Andric typedef typename traits_type::int_type int_type; 6290b57cec5SDimitry Andric typedef typename traits_type::pos_type pos_type; 6300b57cec5SDimitry Andric typedef typename traits_type::off_type off_type; 6310b57cec5SDimitry Andric typedef _Allocator allocator_type; 6320b57cec5SDimitry Andric 6330b57cec5SDimitry Andric typedef basic_string<char_type, traits_type, allocator_type> string_type; 6340b57cec5SDimitry Andric 6350b57cec5SDimitry Andricprivate: 6360b57cec5SDimitry Andric basic_stringbuf<char_type, traits_type, allocator_type> __sb_; 6370b57cec5SDimitry Andric 6380b57cec5SDimitry Andricpublic: 639e8d8bef9SDimitry Andric // 30.8.3.1 [istringstream.cons], constructors 640e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 641*fe6060f1SDimitry Andric basic_istringstream() 642*fe6060f1SDimitry Andric : basic_istream<_CharT, _Traits>(&__sb_), __sb_(ios_base::in) {} 643e8d8bef9SDimitry Andric 644e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 645e8d8bef9SDimitry Andric explicit basic_istringstream(ios_base::openmode __wch) 646e8d8bef9SDimitry Andric : basic_istream<_CharT, _Traits>(&__sb_), __sb_(__wch | ios_base::in) {} 647e8d8bef9SDimitry Andric 648e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 6490b57cec5SDimitry Andric explicit basic_istringstream(const string_type& __s, 650e8d8bef9SDimitry Andric ios_base::openmode __wch = ios_base::in) 651e8d8bef9SDimitry Andric : basic_istream<_CharT, _Traits>(&__sb_) 652e8d8bef9SDimitry Andric , __sb_(__s, __wch | ios_base::in) 653e8d8bef9SDimitry Andric { } 6540b57cec5SDimitry Andric 655e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 656e8d8bef9SDimitry Andric basic_istringstream(basic_istringstream&& __rhs) 657e8d8bef9SDimitry Andric : basic_istream<_CharT, _Traits>(_VSTD::move(__rhs)) 658e8d8bef9SDimitry Andric , __sb_(_VSTD::move(__rhs.__sb_)) 6590b57cec5SDimitry Andric { 6600b57cec5SDimitry Andric basic_istream<_CharT, _Traits>::set_rdbuf(&__sb_); 6610b57cec5SDimitry Andric } 6620b57cec5SDimitry Andric 663e8d8bef9SDimitry Andric // 27.8.2.2 Assign and swap: 664e8d8bef9SDimitry Andric basic_istringstream& operator=(basic_istringstream&& __rhs) { 6650b57cec5SDimitry Andric basic_istream<char_type, traits_type>::operator=(_VSTD::move(__rhs)); 6660b57cec5SDimitry Andric __sb_ = _VSTD::move(__rhs.__sb_); 6670b57cec5SDimitry Andric return *this; 6680b57cec5SDimitry Andric } 669e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 670e8d8bef9SDimitry Andric void swap(basic_istringstream& __rhs) { 6710b57cec5SDimitry Andric basic_istream<char_type, traits_type>::swap(__rhs); 6720b57cec5SDimitry Andric __sb_.swap(__rhs.__sb_); 6730b57cec5SDimitry Andric } 6740b57cec5SDimitry Andric 675e8d8bef9SDimitry Andric // 27.8.2.3 Members: 676e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 677e8d8bef9SDimitry Andric basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const { 678e8d8bef9SDimitry Andric return const_cast<basic_stringbuf<char_type, traits_type, allocator_type>*>(&__sb_); 679e8d8bef9SDimitry Andric } 680e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 681e8d8bef9SDimitry Andric string_type str() const { 682e8d8bef9SDimitry Andric return __sb_.str(); 683e8d8bef9SDimitry Andric } 684e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 685e8d8bef9SDimitry Andric void str(const string_type& __s) { 686e8d8bef9SDimitry Andric __sb_.str(__s); 687e8d8bef9SDimitry Andric } 688e8d8bef9SDimitry Andric}; 689e8d8bef9SDimitry Andric 6900b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 6910b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 6920b57cec5SDimitry Andricvoid 6930b57cec5SDimitry Andricswap(basic_istringstream<_CharT, _Traits, _Allocator>& __x, 6940b57cec5SDimitry Andric basic_istringstream<_CharT, _Traits, _Allocator>& __y) 6950b57cec5SDimitry Andric{ 6960b57cec5SDimitry Andric __x.swap(__y); 6970b57cec5SDimitry Andric} 6980b57cec5SDimitry Andric 6990b57cec5SDimitry Andric// basic_ostringstream 7000b57cec5SDimitry Andric 7010b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 7020b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_ostringstream 7030b57cec5SDimitry Andric : public basic_ostream<_CharT, _Traits> 7040b57cec5SDimitry Andric{ 7050b57cec5SDimitry Andricpublic: 7060b57cec5SDimitry Andric typedef _CharT char_type; 7070b57cec5SDimitry Andric typedef _Traits traits_type; 7080b57cec5SDimitry Andric typedef typename traits_type::int_type int_type; 7090b57cec5SDimitry Andric typedef typename traits_type::pos_type pos_type; 7100b57cec5SDimitry Andric typedef typename traits_type::off_type off_type; 7110b57cec5SDimitry Andric typedef _Allocator allocator_type; 7120b57cec5SDimitry Andric 7130b57cec5SDimitry Andric typedef basic_string<char_type, traits_type, allocator_type> string_type; 7140b57cec5SDimitry Andric 7150b57cec5SDimitry Andricprivate: 7160b57cec5SDimitry Andric basic_stringbuf<char_type, traits_type, allocator_type> __sb_; 7170b57cec5SDimitry Andric 7180b57cec5SDimitry Andricpublic: 719e8d8bef9SDimitry Andric // 30.8.4.1 [ostringstream.cons], constructors 720e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 721*fe6060f1SDimitry Andric basic_ostringstream() 722*fe6060f1SDimitry Andric : basic_ostream<_CharT, _Traits>(&__sb_), __sb_(ios_base::out) {} 723e8d8bef9SDimitry Andric 724e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 725e8d8bef9SDimitry Andric explicit basic_ostringstream(ios_base::openmode __wch) 726*fe6060f1SDimitry Andric : basic_ostream<_CharT, _Traits>(&__sb_), __sb_(__wch | ios_base::out) {} 727e8d8bef9SDimitry Andric 728e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 7290b57cec5SDimitry Andric explicit basic_ostringstream(const string_type& __s, 730e8d8bef9SDimitry Andric ios_base::openmode __wch = ios_base::out) 731e8d8bef9SDimitry Andric : basic_ostream<_CharT, _Traits>(&__sb_) 732e8d8bef9SDimitry Andric , __sb_(__s, __wch | ios_base::out) 733e8d8bef9SDimitry Andric { } 7340b57cec5SDimitry Andric 735e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 736e8d8bef9SDimitry Andric basic_ostringstream(basic_ostringstream&& __rhs) 737e8d8bef9SDimitry Andric : basic_ostream<_CharT, _Traits>(_VSTD::move(__rhs)) 738e8d8bef9SDimitry Andric , __sb_(_VSTD::move(__rhs.__sb_)) 7390b57cec5SDimitry Andric { 7400b57cec5SDimitry Andric basic_ostream<_CharT, _Traits>::set_rdbuf(&__sb_); 7410b57cec5SDimitry Andric } 7420b57cec5SDimitry Andric 743e8d8bef9SDimitry Andric // 27.8.2.2 Assign and swap: 744e8d8bef9SDimitry Andric basic_ostringstream& operator=(basic_ostringstream&& __rhs) { 7450b57cec5SDimitry Andric basic_ostream<char_type, traits_type>::operator=(_VSTD::move(__rhs)); 7460b57cec5SDimitry Andric __sb_ = _VSTD::move(__rhs.__sb_); 7470b57cec5SDimitry Andric return *this; 7480b57cec5SDimitry Andric } 7490b57cec5SDimitry Andric 750e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 751e8d8bef9SDimitry Andric void swap(basic_ostringstream& __rhs) { 7520b57cec5SDimitry Andric basic_ostream<char_type, traits_type>::swap(__rhs); 7530b57cec5SDimitry Andric __sb_.swap(__rhs.__sb_); 7540b57cec5SDimitry Andric } 7550b57cec5SDimitry Andric 756e8d8bef9SDimitry Andric // 27.8.2.3 Members: 757e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 758e8d8bef9SDimitry Andric basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const { 759e8d8bef9SDimitry Andric return const_cast<basic_stringbuf<char_type, traits_type, allocator_type>*>(&__sb_); 760e8d8bef9SDimitry Andric } 761e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 762e8d8bef9SDimitry Andric string_type str() const { 763e8d8bef9SDimitry Andric return __sb_.str(); 764e8d8bef9SDimitry Andric } 765e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 766e8d8bef9SDimitry Andric void str(const string_type& __s) { 767e8d8bef9SDimitry Andric __sb_.str(__s); 768e8d8bef9SDimitry Andric } 769e8d8bef9SDimitry Andric}; 770e8d8bef9SDimitry Andric 7710b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 7720b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 7730b57cec5SDimitry Andricvoid 7740b57cec5SDimitry Andricswap(basic_ostringstream<_CharT, _Traits, _Allocator>& __x, 7750b57cec5SDimitry Andric basic_ostringstream<_CharT, _Traits, _Allocator>& __y) 7760b57cec5SDimitry Andric{ 7770b57cec5SDimitry Andric __x.swap(__y); 7780b57cec5SDimitry Andric} 7790b57cec5SDimitry Andric 7800b57cec5SDimitry Andric// basic_stringstream 7810b57cec5SDimitry Andric 7820b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 7830b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_stringstream 7840b57cec5SDimitry Andric : public basic_iostream<_CharT, _Traits> 7850b57cec5SDimitry Andric{ 7860b57cec5SDimitry Andricpublic: 7870b57cec5SDimitry Andric typedef _CharT char_type; 7880b57cec5SDimitry Andric typedef _Traits traits_type; 7890b57cec5SDimitry Andric typedef typename traits_type::int_type int_type; 7900b57cec5SDimitry Andric typedef typename traits_type::pos_type pos_type; 7910b57cec5SDimitry Andric typedef typename traits_type::off_type off_type; 7920b57cec5SDimitry Andric typedef _Allocator allocator_type; 7930b57cec5SDimitry Andric 7940b57cec5SDimitry Andric typedef basic_string<char_type, traits_type, allocator_type> string_type; 7950b57cec5SDimitry Andric 7960b57cec5SDimitry Andricprivate: 7970b57cec5SDimitry Andric basic_stringbuf<char_type, traits_type, allocator_type> __sb_; 7980b57cec5SDimitry Andric 7990b57cec5SDimitry Andricpublic: 800e8d8bef9SDimitry Andric // 30.8.5.1 [stringstream.cons], constructors 801e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 802*fe6060f1SDimitry Andric basic_stringstream() 803*fe6060f1SDimitry Andric : basic_iostream<_CharT, _Traits>(&__sb_), __sb_(ios_base::in | ios_base::out) {} 804e8d8bef9SDimitry Andric 805e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 806e8d8bef9SDimitry Andric explicit basic_stringstream(ios_base::openmode __wch) 807e8d8bef9SDimitry Andric : basic_iostream<_CharT, _Traits>(&__sb_), __sb_(__wch) {} 808e8d8bef9SDimitry Andric 809e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 8100b57cec5SDimitry Andric explicit basic_stringstream(const string_type& __s, 811e8d8bef9SDimitry Andric ios_base::openmode __wch = ios_base::in | ios_base::out) 812e8d8bef9SDimitry Andric : basic_iostream<_CharT, _Traits>(&__sb_) 813e8d8bef9SDimitry Andric , __sb_(__s, __wch) 814e8d8bef9SDimitry Andric { } 8150b57cec5SDimitry Andric 816e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 817e8d8bef9SDimitry Andric basic_stringstream(basic_stringstream&& __rhs) 818e8d8bef9SDimitry Andric : basic_iostream<_CharT, _Traits>(_VSTD::move(__rhs)) 819e8d8bef9SDimitry Andric , __sb_(_VSTD::move(__rhs.__sb_)) 8200b57cec5SDimitry Andric { 8210b57cec5SDimitry Andric basic_istream<_CharT, _Traits>::set_rdbuf(&__sb_); 8220b57cec5SDimitry Andric } 8230b57cec5SDimitry Andric 824e8d8bef9SDimitry Andric // 27.8.2.2 Assign and swap: 825e8d8bef9SDimitry Andric basic_stringstream& operator=(basic_stringstream&& __rhs) { 8260b57cec5SDimitry Andric basic_iostream<char_type, traits_type>::operator=(_VSTD::move(__rhs)); 8270b57cec5SDimitry Andric __sb_ = _VSTD::move(__rhs.__sb_); 8280b57cec5SDimitry Andric return *this; 8290b57cec5SDimitry Andric } 830e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 831e8d8bef9SDimitry Andric void swap(basic_stringstream& __rhs) { 8320b57cec5SDimitry Andric basic_iostream<char_type, traits_type>::swap(__rhs); 8330b57cec5SDimitry Andric __sb_.swap(__rhs.__sb_); 8340b57cec5SDimitry Andric } 8350b57cec5SDimitry Andric 836e8d8bef9SDimitry Andric // 27.8.2.3 Members: 837e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 838e8d8bef9SDimitry Andric basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const { 839e8d8bef9SDimitry Andric return const_cast<basic_stringbuf<char_type, traits_type, allocator_type>*>(&__sb_); 840e8d8bef9SDimitry Andric } 841e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 842e8d8bef9SDimitry Andric string_type str() const { 843e8d8bef9SDimitry Andric return __sb_.str(); 844e8d8bef9SDimitry Andric } 845e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 846e8d8bef9SDimitry Andric void str(const string_type& __s) { 847e8d8bef9SDimitry Andric __sb_.str(__s); 848e8d8bef9SDimitry Andric } 849e8d8bef9SDimitry Andric}; 850e8d8bef9SDimitry Andric 8510b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 8520b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 8530b57cec5SDimitry Andricvoid 8540b57cec5SDimitry Andricswap(basic_stringstream<_CharT, _Traits, _Allocator>& __x, 8550b57cec5SDimitry Andric basic_stringstream<_CharT, _Traits, _Allocator>& __y) 8560b57cec5SDimitry Andric{ 8570b57cec5SDimitry Andric __x.swap(__y); 8580b57cec5SDimitry Andric} 8590b57cec5SDimitry Andric 860e8d8bef9SDimitry Andric#if defined(_LIBCPP_ABI_ENABLE_ADDITIONAL_IOSTREAM_EXPLICIT_INSTANTIATIONS_1) 861e8d8bef9SDimitry Andric_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_stringbuf<char>) 862e8d8bef9SDimitry Andric_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_stringstream<char>) 863e8d8bef9SDimitry Andric_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ostringstream<char>) 864e8d8bef9SDimitry Andric_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istringstream<char>) 865e8d8bef9SDimitry Andric#endif 8660b57cec5SDimitry Andric 8670b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD 8680b57cec5SDimitry Andric 8690b57cec5SDimitry Andric_LIBCPP_POP_MACROS 8700b57cec5SDimitry Andric 8710b57cec5SDimitry Andric#endif // _LIBCPP_SSTREAM 872