10b57cec5SDimitry Andric// -*- C++ -*- 2349cc55cSDimitry Andric//===----------------------------------------------------------------------===// 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> 185fe6060f1SDimitry Andric#include <ostream> 1860b57cec5SDimitry Andric#include <string> 187*04eeddc0SDimitry Andric#include <version> 1880b57cec5SDimitry Andric 1890b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 1900b57cec5SDimitry Andric#pragma GCC system_header 1910b57cec5SDimitry Andric#endif 1920b57cec5SDimitry Andric 1930b57cec5SDimitry Andric_LIBCPP_PUSH_MACROS 1940b57cec5SDimitry Andric#include <__undef_macros> 1950b57cec5SDimitry Andric 1960b57cec5SDimitry Andric 1970b57cec5SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD 1980b57cec5SDimitry Andric 1990b57cec5SDimitry Andric// basic_stringbuf 2000b57cec5SDimitry Andric 2010b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 2020b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_stringbuf 2030b57cec5SDimitry Andric : public basic_streambuf<_CharT, _Traits> 2040b57cec5SDimitry Andric{ 2050b57cec5SDimitry Andricpublic: 2060b57cec5SDimitry Andric typedef _CharT char_type; 2070b57cec5SDimitry Andric typedef _Traits traits_type; 2080b57cec5SDimitry Andric typedef typename traits_type::int_type int_type; 2090b57cec5SDimitry Andric typedef typename traits_type::pos_type pos_type; 2100b57cec5SDimitry Andric typedef typename traits_type::off_type off_type; 2110b57cec5SDimitry Andric typedef _Allocator allocator_type; 2120b57cec5SDimitry Andric 2130b57cec5SDimitry Andric typedef basic_string<char_type, traits_type, allocator_type> string_type; 2140b57cec5SDimitry Andric 2150b57cec5SDimitry Andricprivate: 2160b57cec5SDimitry Andric 2170b57cec5SDimitry Andric string_type __str_; 2180b57cec5SDimitry Andric mutable char_type* __hm_; 2190b57cec5SDimitry Andric ios_base::openmode __mode_; 2200b57cec5SDimitry Andric 2210b57cec5SDimitry Andricpublic: 222e8d8bef9SDimitry Andric // 30.8.2.1 [stringbuf.cons], constructors 223e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 224fe6060f1SDimitry Andric basic_stringbuf() 225fe6060f1SDimitry Andric : __hm_(nullptr), __mode_(ios_base::in | ios_base::out) {} 226e8d8bef9SDimitry Andric 227e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 228e8d8bef9SDimitry Andric explicit basic_stringbuf(ios_base::openmode __wch) 229e8d8bef9SDimitry Andric : __hm_(nullptr), __mode_(__wch) {} 230e8d8bef9SDimitry Andric 231e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 232e8d8bef9SDimitry Andric explicit basic_stringbuf(const string_type& __s, 233e8d8bef9SDimitry Andric ios_base::openmode __wch = ios_base::in | ios_base::out) 234e8d8bef9SDimitry Andric : __str_(__s.get_allocator()), __hm_(nullptr), __mode_(__wch) 235e8d8bef9SDimitry Andric { 236e8d8bef9SDimitry Andric str(__s); 237e8d8bef9SDimitry Andric } 238e8d8bef9SDimitry Andric 2390b57cec5SDimitry Andric basic_stringbuf(basic_stringbuf&& __rhs); 2400b57cec5SDimitry Andric 2410b57cec5SDimitry Andric // 27.8.1.2 Assign and swap: 2420b57cec5SDimitry Andric basic_stringbuf& operator=(basic_stringbuf&& __rhs); 2430b57cec5SDimitry Andric void swap(basic_stringbuf& __rhs); 2440b57cec5SDimitry Andric 2450b57cec5SDimitry Andric // 27.8.1.3 Get and set: 2460b57cec5SDimitry Andric string_type str() const; 2470b57cec5SDimitry Andric void str(const string_type& __s); 2480b57cec5SDimitry Andric 2490b57cec5SDimitry Andricprotected: 2500b57cec5SDimitry Andric // 27.8.1.4 Overridden virtual functions: 2510b57cec5SDimitry Andric virtual int_type underflow(); 2520b57cec5SDimitry Andric virtual int_type pbackfail(int_type __c = traits_type::eof()); 2530b57cec5SDimitry Andric virtual int_type overflow (int_type __c = traits_type::eof()); 2540b57cec5SDimitry Andric virtual pos_type seekoff(off_type __off, ios_base::seekdir __way, 2550b57cec5SDimitry Andric ios_base::openmode __wch = ios_base::in | ios_base::out); 256e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 2570b57cec5SDimitry Andric virtual pos_type seekpos(pos_type __sp, 258e8d8bef9SDimitry Andric ios_base::openmode __wch = ios_base::in | ios_base::out) { 259e8d8bef9SDimitry Andric return seekoff(__sp, ios_base::beg, __wch); 260e8d8bef9SDimitry Andric } 2610b57cec5SDimitry Andric}; 2620b57cec5SDimitry Andric 2630b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 2640b57cec5SDimitry Andricbasic_stringbuf<_CharT, _Traits, _Allocator>::basic_stringbuf(basic_stringbuf&& __rhs) 2650b57cec5SDimitry Andric : __mode_(__rhs.__mode_) 2660b57cec5SDimitry Andric{ 2670b57cec5SDimitry Andric char_type* __p = const_cast<char_type*>(__rhs.__str_.data()); 2680b57cec5SDimitry Andric ptrdiff_t __binp = -1; 2690b57cec5SDimitry Andric ptrdiff_t __ninp = -1; 2700b57cec5SDimitry Andric ptrdiff_t __einp = -1; 2710b57cec5SDimitry Andric if (__rhs.eback() != nullptr) 2720b57cec5SDimitry Andric { 2730b57cec5SDimitry Andric __binp = __rhs.eback() - __p; 2740b57cec5SDimitry Andric __ninp = __rhs.gptr() - __p; 2750b57cec5SDimitry Andric __einp = __rhs.egptr() - __p; 2760b57cec5SDimitry Andric } 2770b57cec5SDimitry Andric ptrdiff_t __bout = -1; 2780b57cec5SDimitry Andric ptrdiff_t __nout = -1; 2790b57cec5SDimitry Andric ptrdiff_t __eout = -1; 2800b57cec5SDimitry Andric if (__rhs.pbase() != nullptr) 2810b57cec5SDimitry Andric { 2820b57cec5SDimitry Andric __bout = __rhs.pbase() - __p; 2830b57cec5SDimitry Andric __nout = __rhs.pptr() - __p; 2840b57cec5SDimitry Andric __eout = __rhs.epptr() - __p; 2850b57cec5SDimitry Andric } 2860b57cec5SDimitry Andric ptrdiff_t __hm = __rhs.__hm_ == nullptr ? -1 : __rhs.__hm_ - __p; 2870b57cec5SDimitry Andric __str_ = _VSTD::move(__rhs.__str_); 2880b57cec5SDimitry Andric __p = const_cast<char_type*>(__str_.data()); 2890b57cec5SDimitry Andric if (__binp != -1) 2900b57cec5SDimitry Andric this->setg(__p + __binp, __p + __ninp, __p + __einp); 2910b57cec5SDimitry Andric if (__bout != -1) 2920b57cec5SDimitry Andric { 2930b57cec5SDimitry Andric this->setp(__p + __bout, __p + __eout); 2940b57cec5SDimitry Andric this->__pbump(__nout); 2950b57cec5SDimitry Andric } 2960b57cec5SDimitry Andric __hm_ = __hm == -1 ? nullptr : __p + __hm; 2970b57cec5SDimitry Andric __p = const_cast<char_type*>(__rhs.__str_.data()); 2980b57cec5SDimitry Andric __rhs.setg(__p, __p, __p); 2990b57cec5SDimitry Andric __rhs.setp(__p, __p); 3000b57cec5SDimitry Andric __rhs.__hm_ = __p; 3010b57cec5SDimitry Andric this->pubimbue(__rhs.getloc()); 3020b57cec5SDimitry Andric} 3030b57cec5SDimitry Andric 3040b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 3050b57cec5SDimitry Andricbasic_stringbuf<_CharT, _Traits, _Allocator>& 3060b57cec5SDimitry Andricbasic_stringbuf<_CharT, _Traits, _Allocator>::operator=(basic_stringbuf&& __rhs) 3070b57cec5SDimitry Andric{ 3080b57cec5SDimitry Andric char_type* __p = const_cast<char_type*>(__rhs.__str_.data()); 3090b57cec5SDimitry Andric ptrdiff_t __binp = -1; 3100b57cec5SDimitry Andric ptrdiff_t __ninp = -1; 3110b57cec5SDimitry Andric ptrdiff_t __einp = -1; 3120b57cec5SDimitry Andric if (__rhs.eback() != nullptr) 3130b57cec5SDimitry Andric { 3140b57cec5SDimitry Andric __binp = __rhs.eback() - __p; 3150b57cec5SDimitry Andric __ninp = __rhs.gptr() - __p; 3160b57cec5SDimitry Andric __einp = __rhs.egptr() - __p; 3170b57cec5SDimitry Andric } 3180b57cec5SDimitry Andric ptrdiff_t __bout = -1; 3190b57cec5SDimitry Andric ptrdiff_t __nout = -1; 3200b57cec5SDimitry Andric ptrdiff_t __eout = -1; 3210b57cec5SDimitry Andric if (__rhs.pbase() != nullptr) 3220b57cec5SDimitry Andric { 3230b57cec5SDimitry Andric __bout = __rhs.pbase() - __p; 3240b57cec5SDimitry Andric __nout = __rhs.pptr() - __p; 3250b57cec5SDimitry Andric __eout = __rhs.epptr() - __p; 3260b57cec5SDimitry Andric } 3270b57cec5SDimitry Andric ptrdiff_t __hm = __rhs.__hm_ == nullptr ? -1 : __rhs.__hm_ - __p; 3280b57cec5SDimitry Andric __str_ = _VSTD::move(__rhs.__str_); 3290b57cec5SDimitry Andric __p = const_cast<char_type*>(__str_.data()); 3300b57cec5SDimitry Andric if (__binp != -1) 3310b57cec5SDimitry Andric this->setg(__p + __binp, __p + __ninp, __p + __einp); 3320b57cec5SDimitry Andric else 3330b57cec5SDimitry Andric this->setg(nullptr, nullptr, nullptr); 3340b57cec5SDimitry Andric if (__bout != -1) 3350b57cec5SDimitry Andric { 3360b57cec5SDimitry Andric this->setp(__p + __bout, __p + __eout); 3370b57cec5SDimitry Andric this->__pbump(__nout); 3380b57cec5SDimitry Andric } 3390b57cec5SDimitry Andric else 3400b57cec5SDimitry Andric this->setp(nullptr, nullptr); 3410b57cec5SDimitry Andric 3420b57cec5SDimitry Andric __hm_ = __hm == -1 ? nullptr : __p + __hm; 3430b57cec5SDimitry Andric __mode_ = __rhs.__mode_; 3440b57cec5SDimitry Andric __p = const_cast<char_type*>(__rhs.__str_.data()); 3450b57cec5SDimitry Andric __rhs.setg(__p, __p, __p); 3460b57cec5SDimitry Andric __rhs.setp(__p, __p); 3470b57cec5SDimitry Andric __rhs.__hm_ = __p; 3480b57cec5SDimitry Andric this->pubimbue(__rhs.getloc()); 3490b57cec5SDimitry Andric return *this; 3500b57cec5SDimitry Andric} 3510b57cec5SDimitry Andric 3520b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 3530b57cec5SDimitry Andricvoid 3540b57cec5SDimitry Andricbasic_stringbuf<_CharT, _Traits, _Allocator>::swap(basic_stringbuf& __rhs) 3550b57cec5SDimitry Andric{ 3560b57cec5SDimitry Andric char_type* __p = const_cast<char_type*>(__rhs.__str_.data()); 3570b57cec5SDimitry Andric ptrdiff_t __rbinp = -1; 3580b57cec5SDimitry Andric ptrdiff_t __rninp = -1; 3590b57cec5SDimitry Andric ptrdiff_t __reinp = -1; 3600b57cec5SDimitry Andric if (__rhs.eback() != nullptr) 3610b57cec5SDimitry Andric { 3620b57cec5SDimitry Andric __rbinp = __rhs.eback() - __p; 3630b57cec5SDimitry Andric __rninp = __rhs.gptr() - __p; 3640b57cec5SDimitry Andric __reinp = __rhs.egptr() - __p; 3650b57cec5SDimitry Andric } 3660b57cec5SDimitry Andric ptrdiff_t __rbout = -1; 3670b57cec5SDimitry Andric ptrdiff_t __rnout = -1; 3680b57cec5SDimitry Andric ptrdiff_t __reout = -1; 3690b57cec5SDimitry Andric if (__rhs.pbase() != nullptr) 3700b57cec5SDimitry Andric { 3710b57cec5SDimitry Andric __rbout = __rhs.pbase() - __p; 3720b57cec5SDimitry Andric __rnout = __rhs.pptr() - __p; 3730b57cec5SDimitry Andric __reout = __rhs.epptr() - __p; 3740b57cec5SDimitry Andric } 3750b57cec5SDimitry Andric ptrdiff_t __rhm = __rhs.__hm_ == nullptr ? -1 : __rhs.__hm_ - __p; 3760b57cec5SDimitry Andric __p = const_cast<char_type*>(__str_.data()); 3770b57cec5SDimitry Andric ptrdiff_t __lbinp = -1; 3780b57cec5SDimitry Andric ptrdiff_t __lninp = -1; 3790b57cec5SDimitry Andric ptrdiff_t __leinp = -1; 3800b57cec5SDimitry Andric if (this->eback() != nullptr) 3810b57cec5SDimitry Andric { 3820b57cec5SDimitry Andric __lbinp = this->eback() - __p; 3830b57cec5SDimitry Andric __lninp = this->gptr() - __p; 3840b57cec5SDimitry Andric __leinp = this->egptr() - __p; 3850b57cec5SDimitry Andric } 3860b57cec5SDimitry Andric ptrdiff_t __lbout = -1; 3870b57cec5SDimitry Andric ptrdiff_t __lnout = -1; 3880b57cec5SDimitry Andric ptrdiff_t __leout = -1; 3890b57cec5SDimitry Andric if (this->pbase() != nullptr) 3900b57cec5SDimitry Andric { 3910b57cec5SDimitry Andric __lbout = this->pbase() - __p; 3920b57cec5SDimitry Andric __lnout = this->pptr() - __p; 3930b57cec5SDimitry Andric __leout = this->epptr() - __p; 3940b57cec5SDimitry Andric } 3950b57cec5SDimitry Andric ptrdiff_t __lhm = __hm_ == nullptr ? -1 : __hm_ - __p; 3960b57cec5SDimitry Andric _VSTD::swap(__mode_, __rhs.__mode_); 3970b57cec5SDimitry Andric __str_.swap(__rhs.__str_); 3980b57cec5SDimitry Andric __p = const_cast<char_type*>(__str_.data()); 3990b57cec5SDimitry Andric if (__rbinp != -1) 4000b57cec5SDimitry Andric this->setg(__p + __rbinp, __p + __rninp, __p + __reinp); 4010b57cec5SDimitry Andric else 4020b57cec5SDimitry Andric this->setg(nullptr, nullptr, nullptr); 4030b57cec5SDimitry Andric if (__rbout != -1) 4040b57cec5SDimitry Andric { 4050b57cec5SDimitry Andric this->setp(__p + __rbout, __p + __reout); 4060b57cec5SDimitry Andric this->__pbump(__rnout); 4070b57cec5SDimitry Andric } 4080b57cec5SDimitry Andric else 4090b57cec5SDimitry Andric this->setp(nullptr, nullptr); 4100b57cec5SDimitry Andric __hm_ = __rhm == -1 ? nullptr : __p + __rhm; 4110b57cec5SDimitry Andric __p = const_cast<char_type*>(__rhs.__str_.data()); 4120b57cec5SDimitry Andric if (__lbinp != -1) 4130b57cec5SDimitry Andric __rhs.setg(__p + __lbinp, __p + __lninp, __p + __leinp); 4140b57cec5SDimitry Andric else 4150b57cec5SDimitry Andric __rhs.setg(nullptr, nullptr, nullptr); 4160b57cec5SDimitry Andric if (__lbout != -1) 4170b57cec5SDimitry Andric { 4180b57cec5SDimitry Andric __rhs.setp(__p + __lbout, __p + __leout); 4190b57cec5SDimitry Andric __rhs.__pbump(__lnout); 4200b57cec5SDimitry Andric } 4210b57cec5SDimitry Andric else 4220b57cec5SDimitry Andric __rhs.setp(nullptr, nullptr); 4230b57cec5SDimitry Andric __rhs.__hm_ = __lhm == -1 ? nullptr : __p + __lhm; 4240b57cec5SDimitry Andric locale __tl = __rhs.getloc(); 4250b57cec5SDimitry Andric __rhs.pubimbue(this->getloc()); 4260b57cec5SDimitry Andric this->pubimbue(__tl); 4270b57cec5SDimitry Andric} 4280b57cec5SDimitry Andric 4290b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 4300b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 4310b57cec5SDimitry Andricvoid 4320b57cec5SDimitry Andricswap(basic_stringbuf<_CharT, _Traits, _Allocator>& __x, 4330b57cec5SDimitry Andric basic_stringbuf<_CharT, _Traits, _Allocator>& __y) 4340b57cec5SDimitry Andric{ 4350b57cec5SDimitry Andric __x.swap(__y); 4360b57cec5SDimitry Andric} 4370b57cec5SDimitry Andric 4380b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 4390b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator> 4400b57cec5SDimitry Andricbasic_stringbuf<_CharT, _Traits, _Allocator>::str() const 4410b57cec5SDimitry Andric{ 4420b57cec5SDimitry Andric if (__mode_ & ios_base::out) 4430b57cec5SDimitry Andric { 4440b57cec5SDimitry Andric if (__hm_ < this->pptr()) 4450b57cec5SDimitry Andric __hm_ = this->pptr(); 4460b57cec5SDimitry Andric return string_type(this->pbase(), __hm_, __str_.get_allocator()); 4470b57cec5SDimitry Andric } 4480b57cec5SDimitry Andric else if (__mode_ & ios_base::in) 4490b57cec5SDimitry Andric return string_type(this->eback(), this->egptr(), __str_.get_allocator()); 4500b57cec5SDimitry Andric return string_type(__str_.get_allocator()); 4510b57cec5SDimitry Andric} 4520b57cec5SDimitry Andric 4530b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 4540b57cec5SDimitry Andricvoid 4550b57cec5SDimitry Andricbasic_stringbuf<_CharT, _Traits, _Allocator>::str(const string_type& __s) 4560b57cec5SDimitry Andric{ 4570b57cec5SDimitry Andric __str_ = __s; 458e8d8bef9SDimitry Andric __hm_ = nullptr; 4590b57cec5SDimitry Andric if (__mode_ & ios_base::in) 4600b57cec5SDimitry Andric { 4610b57cec5SDimitry Andric __hm_ = const_cast<char_type*>(__str_.data()) + __str_.size(); 4620b57cec5SDimitry Andric this->setg(const_cast<char_type*>(__str_.data()), 4630b57cec5SDimitry Andric const_cast<char_type*>(__str_.data()), 4640b57cec5SDimitry Andric __hm_); 4650b57cec5SDimitry Andric } 4660b57cec5SDimitry Andric if (__mode_ & ios_base::out) 4670b57cec5SDimitry Andric { 4680b57cec5SDimitry Andric typename string_type::size_type __sz = __str_.size(); 4690b57cec5SDimitry Andric __hm_ = const_cast<char_type*>(__str_.data()) + __sz; 4700b57cec5SDimitry Andric __str_.resize(__str_.capacity()); 4710b57cec5SDimitry Andric this->setp(const_cast<char_type*>(__str_.data()), 4720b57cec5SDimitry Andric const_cast<char_type*>(__str_.data()) + __str_.size()); 4730b57cec5SDimitry Andric if (__mode_ & (ios_base::app | ios_base::ate)) 4740b57cec5SDimitry Andric { 4750b57cec5SDimitry Andric while (__sz > INT_MAX) 4760b57cec5SDimitry Andric { 4770b57cec5SDimitry Andric this->pbump(INT_MAX); 4780b57cec5SDimitry Andric __sz -= INT_MAX; 4790b57cec5SDimitry Andric } 4800b57cec5SDimitry Andric if (__sz > 0) 4810b57cec5SDimitry Andric this->pbump(__sz); 4820b57cec5SDimitry Andric } 4830b57cec5SDimitry Andric } 4840b57cec5SDimitry Andric} 4850b57cec5SDimitry Andric 4860b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 4870b57cec5SDimitry Andrictypename basic_stringbuf<_CharT, _Traits, _Allocator>::int_type 4880b57cec5SDimitry Andricbasic_stringbuf<_CharT, _Traits, _Allocator>::underflow() 4890b57cec5SDimitry Andric{ 4900b57cec5SDimitry Andric if (__hm_ < this->pptr()) 4910b57cec5SDimitry Andric __hm_ = this->pptr(); 4920b57cec5SDimitry Andric if (__mode_ & ios_base::in) 4930b57cec5SDimitry Andric { 4940b57cec5SDimitry Andric if (this->egptr() < __hm_) 4950b57cec5SDimitry Andric this->setg(this->eback(), this->gptr(), __hm_); 4960b57cec5SDimitry Andric if (this->gptr() < this->egptr()) 4970b57cec5SDimitry Andric return traits_type::to_int_type(*this->gptr()); 4980b57cec5SDimitry Andric } 4990b57cec5SDimitry Andric return traits_type::eof(); 5000b57cec5SDimitry Andric} 5010b57cec5SDimitry Andric 5020b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 5030b57cec5SDimitry Andrictypename basic_stringbuf<_CharT, _Traits, _Allocator>::int_type 5040b57cec5SDimitry Andricbasic_stringbuf<_CharT, _Traits, _Allocator>::pbackfail(int_type __c) 5050b57cec5SDimitry Andric{ 5060b57cec5SDimitry Andric if (__hm_ < this->pptr()) 5070b57cec5SDimitry Andric __hm_ = this->pptr(); 5080b57cec5SDimitry Andric if (this->eback() < this->gptr()) 5090b57cec5SDimitry Andric { 5100b57cec5SDimitry Andric if (traits_type::eq_int_type(__c, traits_type::eof())) 5110b57cec5SDimitry Andric { 5120b57cec5SDimitry Andric this->setg(this->eback(), this->gptr()-1, __hm_); 5130b57cec5SDimitry Andric return traits_type::not_eof(__c); 5140b57cec5SDimitry Andric } 5150b57cec5SDimitry Andric if ((__mode_ & ios_base::out) || 5160b57cec5SDimitry Andric traits_type::eq(traits_type::to_char_type(__c), this->gptr()[-1])) 5170b57cec5SDimitry Andric { 5180b57cec5SDimitry Andric this->setg(this->eback(), this->gptr()-1, __hm_); 5190b57cec5SDimitry Andric *this->gptr() = traits_type::to_char_type(__c); 5200b57cec5SDimitry Andric return __c; 5210b57cec5SDimitry Andric } 5220b57cec5SDimitry Andric } 5230b57cec5SDimitry Andric return traits_type::eof(); 5240b57cec5SDimitry Andric} 5250b57cec5SDimitry Andric 5260b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 5270b57cec5SDimitry Andrictypename basic_stringbuf<_CharT, _Traits, _Allocator>::int_type 5280b57cec5SDimitry Andricbasic_stringbuf<_CharT, _Traits, _Allocator>::overflow(int_type __c) 5290b57cec5SDimitry Andric{ 5300b57cec5SDimitry Andric if (!traits_type::eq_int_type(__c, traits_type::eof())) 5310b57cec5SDimitry Andric { 5320b57cec5SDimitry Andric ptrdiff_t __ninp = this->gptr() - this->eback(); 5330b57cec5SDimitry Andric if (this->pptr() == this->epptr()) 5340b57cec5SDimitry Andric { 5350b57cec5SDimitry Andric if (!(__mode_ & ios_base::out)) 5360b57cec5SDimitry Andric return traits_type::eof(); 5370b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS 5380b57cec5SDimitry Andric try 5390b57cec5SDimitry Andric { 5400b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS 5410b57cec5SDimitry Andric ptrdiff_t __nout = this->pptr() - this->pbase(); 5420b57cec5SDimitry Andric ptrdiff_t __hm = __hm_ - this->pbase(); 5430b57cec5SDimitry Andric __str_.push_back(char_type()); 5440b57cec5SDimitry Andric __str_.resize(__str_.capacity()); 5450b57cec5SDimitry Andric char_type* __p = const_cast<char_type*>(__str_.data()); 5460b57cec5SDimitry Andric this->setp(__p, __p + __str_.size()); 5470b57cec5SDimitry Andric this->__pbump(__nout); 5480b57cec5SDimitry Andric __hm_ = this->pbase() + __hm; 5490b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS 5500b57cec5SDimitry Andric } 5510b57cec5SDimitry Andric catch (...) 5520b57cec5SDimitry Andric { 5530b57cec5SDimitry Andric return traits_type::eof(); 5540b57cec5SDimitry Andric } 5550b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS 5560b57cec5SDimitry Andric } 5570b57cec5SDimitry Andric __hm_ = _VSTD::max(this->pptr() + 1, __hm_); 5580b57cec5SDimitry Andric if (__mode_ & ios_base::in) 5590b57cec5SDimitry Andric { 5600b57cec5SDimitry Andric char_type* __p = const_cast<char_type*>(__str_.data()); 5610b57cec5SDimitry Andric this->setg(__p, __p + __ninp, __hm_); 5620b57cec5SDimitry Andric } 5630b57cec5SDimitry Andric return this->sputc(traits_type::to_char_type(__c)); 5640b57cec5SDimitry Andric } 5650b57cec5SDimitry Andric return traits_type::not_eof(__c); 5660b57cec5SDimitry Andric} 5670b57cec5SDimitry Andric 5680b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 5690b57cec5SDimitry Andrictypename basic_stringbuf<_CharT, _Traits, _Allocator>::pos_type 5700b57cec5SDimitry Andricbasic_stringbuf<_CharT, _Traits, _Allocator>::seekoff(off_type __off, 5710b57cec5SDimitry Andric ios_base::seekdir __way, 5720b57cec5SDimitry Andric ios_base::openmode __wch) 5730b57cec5SDimitry Andric{ 5740b57cec5SDimitry Andric if (__hm_ < this->pptr()) 5750b57cec5SDimitry Andric __hm_ = this->pptr(); 5760b57cec5SDimitry Andric if ((__wch & (ios_base::in | ios_base::out)) == 0) 5770b57cec5SDimitry Andric return pos_type(-1); 5780b57cec5SDimitry Andric if ((__wch & (ios_base::in | ios_base::out)) == (ios_base::in | ios_base::out) 5790b57cec5SDimitry Andric && __way == ios_base::cur) 5800b57cec5SDimitry Andric return pos_type(-1); 5810b57cec5SDimitry Andric const ptrdiff_t __hm = __hm_ == nullptr ? 0 : __hm_ - __str_.data(); 5820b57cec5SDimitry Andric off_type __noff; 5830b57cec5SDimitry Andric switch (__way) 5840b57cec5SDimitry Andric { 5850b57cec5SDimitry Andric case ios_base::beg: 5860b57cec5SDimitry Andric __noff = 0; 5870b57cec5SDimitry Andric break; 5880b57cec5SDimitry Andric case ios_base::cur: 5890b57cec5SDimitry Andric if (__wch & ios_base::in) 5900b57cec5SDimitry Andric __noff = this->gptr() - this->eback(); 5910b57cec5SDimitry Andric else 5920b57cec5SDimitry Andric __noff = this->pptr() - this->pbase(); 5930b57cec5SDimitry Andric break; 5940b57cec5SDimitry Andric case ios_base::end: 5950b57cec5SDimitry Andric __noff = __hm; 5960b57cec5SDimitry Andric break; 5970b57cec5SDimitry Andric default: 5980b57cec5SDimitry Andric return pos_type(-1); 5990b57cec5SDimitry Andric } 6000b57cec5SDimitry Andric __noff += __off; 6010b57cec5SDimitry Andric if (__noff < 0 || __hm < __noff) 6020b57cec5SDimitry Andric return pos_type(-1); 6030b57cec5SDimitry Andric if (__noff != 0) 6040b57cec5SDimitry Andric { 605e8d8bef9SDimitry Andric if ((__wch & ios_base::in) && this->gptr() == nullptr) 6060b57cec5SDimitry Andric return pos_type(-1); 607e8d8bef9SDimitry Andric if ((__wch & ios_base::out) && this->pptr() == nullptr) 6080b57cec5SDimitry Andric return pos_type(-1); 6090b57cec5SDimitry Andric } 6100b57cec5SDimitry Andric if (__wch & ios_base::in) 6110b57cec5SDimitry Andric this->setg(this->eback(), this->eback() + __noff, __hm_); 6120b57cec5SDimitry Andric if (__wch & ios_base::out) 6130b57cec5SDimitry Andric { 6140b57cec5SDimitry Andric this->setp(this->pbase(), this->epptr()); 6150b57cec5SDimitry Andric this->pbump(__noff); 6160b57cec5SDimitry Andric } 6170b57cec5SDimitry Andric return pos_type(__noff); 6180b57cec5SDimitry Andric} 6190b57cec5SDimitry Andric 6200b57cec5SDimitry Andric// basic_istringstream 6210b57cec5SDimitry Andric 6220b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 6230b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_istringstream 6240b57cec5SDimitry Andric : public basic_istream<_CharT, _Traits> 6250b57cec5SDimitry Andric{ 6260b57cec5SDimitry Andricpublic: 6270b57cec5SDimitry Andric typedef _CharT char_type; 6280b57cec5SDimitry Andric typedef _Traits traits_type; 6290b57cec5SDimitry Andric typedef typename traits_type::int_type int_type; 6300b57cec5SDimitry Andric typedef typename traits_type::pos_type pos_type; 6310b57cec5SDimitry Andric typedef typename traits_type::off_type off_type; 6320b57cec5SDimitry Andric typedef _Allocator allocator_type; 6330b57cec5SDimitry Andric 6340b57cec5SDimitry Andric typedef basic_string<char_type, traits_type, allocator_type> string_type; 6350b57cec5SDimitry Andric 6360b57cec5SDimitry Andricprivate: 6370b57cec5SDimitry Andric basic_stringbuf<char_type, traits_type, allocator_type> __sb_; 6380b57cec5SDimitry Andric 6390b57cec5SDimitry Andricpublic: 640e8d8bef9SDimitry Andric // 30.8.3.1 [istringstream.cons], constructors 641e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 642fe6060f1SDimitry Andric basic_istringstream() 643fe6060f1SDimitry Andric : basic_istream<_CharT, _Traits>(&__sb_), __sb_(ios_base::in) {} 644e8d8bef9SDimitry Andric 645e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 646e8d8bef9SDimitry Andric explicit basic_istringstream(ios_base::openmode __wch) 647e8d8bef9SDimitry Andric : basic_istream<_CharT, _Traits>(&__sb_), __sb_(__wch | ios_base::in) {} 648e8d8bef9SDimitry Andric 649e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 6500b57cec5SDimitry Andric explicit basic_istringstream(const string_type& __s, 651e8d8bef9SDimitry Andric ios_base::openmode __wch = ios_base::in) 652e8d8bef9SDimitry Andric : basic_istream<_CharT, _Traits>(&__sb_) 653e8d8bef9SDimitry Andric , __sb_(__s, __wch | ios_base::in) 654e8d8bef9SDimitry Andric { } 6550b57cec5SDimitry Andric 656e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 657e8d8bef9SDimitry Andric basic_istringstream(basic_istringstream&& __rhs) 658e8d8bef9SDimitry Andric : basic_istream<_CharT, _Traits>(_VSTD::move(__rhs)) 659e8d8bef9SDimitry Andric , __sb_(_VSTD::move(__rhs.__sb_)) 6600b57cec5SDimitry Andric { 6610b57cec5SDimitry Andric basic_istream<_CharT, _Traits>::set_rdbuf(&__sb_); 6620b57cec5SDimitry Andric } 6630b57cec5SDimitry Andric 664e8d8bef9SDimitry Andric // 27.8.2.2 Assign and swap: 665e8d8bef9SDimitry Andric basic_istringstream& operator=(basic_istringstream&& __rhs) { 6660b57cec5SDimitry Andric basic_istream<char_type, traits_type>::operator=(_VSTD::move(__rhs)); 6670b57cec5SDimitry Andric __sb_ = _VSTD::move(__rhs.__sb_); 6680b57cec5SDimitry Andric return *this; 6690b57cec5SDimitry Andric } 670e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 671e8d8bef9SDimitry Andric void swap(basic_istringstream& __rhs) { 6720b57cec5SDimitry Andric basic_istream<char_type, traits_type>::swap(__rhs); 6730b57cec5SDimitry Andric __sb_.swap(__rhs.__sb_); 6740b57cec5SDimitry Andric } 6750b57cec5SDimitry Andric 676e8d8bef9SDimitry Andric // 27.8.2.3 Members: 677e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 678e8d8bef9SDimitry Andric basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const { 679e8d8bef9SDimitry Andric return const_cast<basic_stringbuf<char_type, traits_type, allocator_type>*>(&__sb_); 680e8d8bef9SDimitry Andric } 681e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 682e8d8bef9SDimitry Andric string_type str() const { 683e8d8bef9SDimitry Andric return __sb_.str(); 684e8d8bef9SDimitry Andric } 685e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 686e8d8bef9SDimitry Andric void str(const string_type& __s) { 687e8d8bef9SDimitry Andric __sb_.str(__s); 688e8d8bef9SDimitry Andric } 689e8d8bef9SDimitry Andric}; 690e8d8bef9SDimitry Andric 6910b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 6920b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 6930b57cec5SDimitry Andricvoid 6940b57cec5SDimitry Andricswap(basic_istringstream<_CharT, _Traits, _Allocator>& __x, 6950b57cec5SDimitry Andric basic_istringstream<_CharT, _Traits, _Allocator>& __y) 6960b57cec5SDimitry Andric{ 6970b57cec5SDimitry Andric __x.swap(__y); 6980b57cec5SDimitry Andric} 6990b57cec5SDimitry Andric 7000b57cec5SDimitry Andric// basic_ostringstream 7010b57cec5SDimitry Andric 7020b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 7030b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_ostringstream 7040b57cec5SDimitry Andric : public basic_ostream<_CharT, _Traits> 7050b57cec5SDimitry Andric{ 7060b57cec5SDimitry Andricpublic: 7070b57cec5SDimitry Andric typedef _CharT char_type; 7080b57cec5SDimitry Andric typedef _Traits traits_type; 7090b57cec5SDimitry Andric typedef typename traits_type::int_type int_type; 7100b57cec5SDimitry Andric typedef typename traits_type::pos_type pos_type; 7110b57cec5SDimitry Andric typedef typename traits_type::off_type off_type; 7120b57cec5SDimitry Andric typedef _Allocator allocator_type; 7130b57cec5SDimitry Andric 7140b57cec5SDimitry Andric typedef basic_string<char_type, traits_type, allocator_type> string_type; 7150b57cec5SDimitry Andric 7160b57cec5SDimitry Andricprivate: 7170b57cec5SDimitry Andric basic_stringbuf<char_type, traits_type, allocator_type> __sb_; 7180b57cec5SDimitry Andric 7190b57cec5SDimitry Andricpublic: 720e8d8bef9SDimitry Andric // 30.8.4.1 [ostringstream.cons], constructors 721e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 722fe6060f1SDimitry Andric basic_ostringstream() 723fe6060f1SDimitry Andric : basic_ostream<_CharT, _Traits>(&__sb_), __sb_(ios_base::out) {} 724e8d8bef9SDimitry Andric 725e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 726e8d8bef9SDimitry Andric explicit basic_ostringstream(ios_base::openmode __wch) 727fe6060f1SDimitry Andric : basic_ostream<_CharT, _Traits>(&__sb_), __sb_(__wch | ios_base::out) {} 728e8d8bef9SDimitry Andric 729e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 7300b57cec5SDimitry Andric explicit basic_ostringstream(const string_type& __s, 731e8d8bef9SDimitry Andric ios_base::openmode __wch = ios_base::out) 732e8d8bef9SDimitry Andric : basic_ostream<_CharT, _Traits>(&__sb_) 733e8d8bef9SDimitry Andric , __sb_(__s, __wch | ios_base::out) 734e8d8bef9SDimitry Andric { } 7350b57cec5SDimitry Andric 736e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 737e8d8bef9SDimitry Andric basic_ostringstream(basic_ostringstream&& __rhs) 738e8d8bef9SDimitry Andric : basic_ostream<_CharT, _Traits>(_VSTD::move(__rhs)) 739e8d8bef9SDimitry Andric , __sb_(_VSTD::move(__rhs.__sb_)) 7400b57cec5SDimitry Andric { 7410b57cec5SDimitry Andric basic_ostream<_CharT, _Traits>::set_rdbuf(&__sb_); 7420b57cec5SDimitry Andric } 7430b57cec5SDimitry Andric 744e8d8bef9SDimitry Andric // 27.8.2.2 Assign and swap: 745e8d8bef9SDimitry Andric basic_ostringstream& operator=(basic_ostringstream&& __rhs) { 7460b57cec5SDimitry Andric basic_ostream<char_type, traits_type>::operator=(_VSTD::move(__rhs)); 7470b57cec5SDimitry Andric __sb_ = _VSTD::move(__rhs.__sb_); 7480b57cec5SDimitry Andric return *this; 7490b57cec5SDimitry Andric } 7500b57cec5SDimitry Andric 751e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 752e8d8bef9SDimitry Andric void swap(basic_ostringstream& __rhs) { 7530b57cec5SDimitry Andric basic_ostream<char_type, traits_type>::swap(__rhs); 7540b57cec5SDimitry Andric __sb_.swap(__rhs.__sb_); 7550b57cec5SDimitry Andric } 7560b57cec5SDimitry Andric 757e8d8bef9SDimitry Andric // 27.8.2.3 Members: 758e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 759e8d8bef9SDimitry Andric basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const { 760e8d8bef9SDimitry Andric return const_cast<basic_stringbuf<char_type, traits_type, allocator_type>*>(&__sb_); 761e8d8bef9SDimitry Andric } 762e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 763e8d8bef9SDimitry Andric string_type str() const { 764e8d8bef9SDimitry Andric return __sb_.str(); 765e8d8bef9SDimitry Andric } 766e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 767e8d8bef9SDimitry Andric void str(const string_type& __s) { 768e8d8bef9SDimitry Andric __sb_.str(__s); 769e8d8bef9SDimitry Andric } 770e8d8bef9SDimitry Andric}; 771e8d8bef9SDimitry Andric 7720b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 7730b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 7740b57cec5SDimitry Andricvoid 7750b57cec5SDimitry Andricswap(basic_ostringstream<_CharT, _Traits, _Allocator>& __x, 7760b57cec5SDimitry Andric basic_ostringstream<_CharT, _Traits, _Allocator>& __y) 7770b57cec5SDimitry Andric{ 7780b57cec5SDimitry Andric __x.swap(__y); 7790b57cec5SDimitry Andric} 7800b57cec5SDimitry Andric 7810b57cec5SDimitry Andric// basic_stringstream 7820b57cec5SDimitry Andric 7830b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 7840b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_stringstream 7850b57cec5SDimitry Andric : public basic_iostream<_CharT, _Traits> 7860b57cec5SDimitry Andric{ 7870b57cec5SDimitry Andricpublic: 7880b57cec5SDimitry Andric typedef _CharT char_type; 7890b57cec5SDimitry Andric typedef _Traits traits_type; 7900b57cec5SDimitry Andric typedef typename traits_type::int_type int_type; 7910b57cec5SDimitry Andric typedef typename traits_type::pos_type pos_type; 7920b57cec5SDimitry Andric typedef typename traits_type::off_type off_type; 7930b57cec5SDimitry Andric typedef _Allocator allocator_type; 7940b57cec5SDimitry Andric 7950b57cec5SDimitry Andric typedef basic_string<char_type, traits_type, allocator_type> string_type; 7960b57cec5SDimitry Andric 7970b57cec5SDimitry Andricprivate: 7980b57cec5SDimitry Andric basic_stringbuf<char_type, traits_type, allocator_type> __sb_; 7990b57cec5SDimitry Andric 8000b57cec5SDimitry Andricpublic: 801e8d8bef9SDimitry Andric // 30.8.5.1 [stringstream.cons], constructors 802e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 803fe6060f1SDimitry Andric basic_stringstream() 804fe6060f1SDimitry Andric : basic_iostream<_CharT, _Traits>(&__sb_), __sb_(ios_base::in | ios_base::out) {} 805e8d8bef9SDimitry Andric 806e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 807e8d8bef9SDimitry Andric explicit basic_stringstream(ios_base::openmode __wch) 808e8d8bef9SDimitry Andric : basic_iostream<_CharT, _Traits>(&__sb_), __sb_(__wch) {} 809e8d8bef9SDimitry Andric 810e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 8110b57cec5SDimitry Andric explicit basic_stringstream(const string_type& __s, 812e8d8bef9SDimitry Andric ios_base::openmode __wch = ios_base::in | ios_base::out) 813e8d8bef9SDimitry Andric : basic_iostream<_CharT, _Traits>(&__sb_) 814e8d8bef9SDimitry Andric , __sb_(__s, __wch) 815e8d8bef9SDimitry Andric { } 8160b57cec5SDimitry Andric 817e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 818e8d8bef9SDimitry Andric basic_stringstream(basic_stringstream&& __rhs) 819e8d8bef9SDimitry Andric : basic_iostream<_CharT, _Traits>(_VSTD::move(__rhs)) 820e8d8bef9SDimitry Andric , __sb_(_VSTD::move(__rhs.__sb_)) 8210b57cec5SDimitry Andric { 8220b57cec5SDimitry Andric basic_istream<_CharT, _Traits>::set_rdbuf(&__sb_); 8230b57cec5SDimitry Andric } 8240b57cec5SDimitry Andric 825e8d8bef9SDimitry Andric // 27.8.2.2 Assign and swap: 826e8d8bef9SDimitry Andric basic_stringstream& operator=(basic_stringstream&& __rhs) { 8270b57cec5SDimitry Andric basic_iostream<char_type, traits_type>::operator=(_VSTD::move(__rhs)); 8280b57cec5SDimitry Andric __sb_ = _VSTD::move(__rhs.__sb_); 8290b57cec5SDimitry Andric return *this; 8300b57cec5SDimitry Andric } 831e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 832e8d8bef9SDimitry Andric void swap(basic_stringstream& __rhs) { 8330b57cec5SDimitry Andric basic_iostream<char_type, traits_type>::swap(__rhs); 8340b57cec5SDimitry Andric __sb_.swap(__rhs.__sb_); 8350b57cec5SDimitry Andric } 8360b57cec5SDimitry Andric 837e8d8bef9SDimitry Andric // 27.8.2.3 Members: 838e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 839e8d8bef9SDimitry Andric basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const { 840e8d8bef9SDimitry Andric return const_cast<basic_stringbuf<char_type, traits_type, allocator_type>*>(&__sb_); 841e8d8bef9SDimitry Andric } 842e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 843e8d8bef9SDimitry Andric string_type str() const { 844e8d8bef9SDimitry Andric return __sb_.str(); 845e8d8bef9SDimitry Andric } 846e8d8bef9SDimitry Andric _LIBCPP_INLINE_VISIBILITY 847e8d8bef9SDimitry Andric void str(const string_type& __s) { 848e8d8bef9SDimitry Andric __sb_.str(__s); 849e8d8bef9SDimitry Andric } 850e8d8bef9SDimitry Andric}; 851e8d8bef9SDimitry Andric 8520b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 8530b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 8540b57cec5SDimitry Andricvoid 8550b57cec5SDimitry Andricswap(basic_stringstream<_CharT, _Traits, _Allocator>& __x, 8560b57cec5SDimitry Andric basic_stringstream<_CharT, _Traits, _Allocator>& __y) 8570b57cec5SDimitry Andric{ 8580b57cec5SDimitry Andric __x.swap(__y); 8590b57cec5SDimitry Andric} 8600b57cec5SDimitry Andric 861e8d8bef9SDimitry Andric#if defined(_LIBCPP_ABI_ENABLE_ADDITIONAL_IOSTREAM_EXPLICIT_INSTANTIATIONS_1) 862e8d8bef9SDimitry Andric_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_stringbuf<char>) 863e8d8bef9SDimitry Andric_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_stringstream<char>) 864e8d8bef9SDimitry Andric_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ostringstream<char>) 865e8d8bef9SDimitry Andric_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istringstream<char>) 866e8d8bef9SDimitry Andric#endif 8670b57cec5SDimitry Andric 8680b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD 8690b57cec5SDimitry Andric 8700b57cec5SDimitry Andric_LIBCPP_POP_MACROS 8710b57cec5SDimitry Andric 8720b57cec5SDimitry Andric#endif // _LIBCPP_SSTREAM 873