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