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_STRSTREAM
113e519524SHoward Hinnant#define _LIBCPP_STRSTREAM
123e519524SHoward Hinnant
133e519524SHoward Hinnant/*
143e519524SHoward Hinnant    strstream synopsis
153e519524SHoward Hinnant
163e519524SHoward Hinnantclass strstreambuf
173e519524SHoward Hinnant    : public basic_streambuf<char>
183e519524SHoward Hinnant{
193e519524SHoward Hinnantpublic:
20a11f8b1aSMarek Kurdej    explicit strstreambuf(streamsize alsize_arg = 0); // before C++20
21a11f8b1aSMarek Kurdej    strstreambuf() : strstreambuf(0) {}               // C++20
22a11f8b1aSMarek Kurdej    explicit strstreambuf(streamsize alsize_arg);     // C++20
23a11f8b1aSMarek Kurdej
243e519524SHoward Hinnant    strstreambuf(void* (*palloc_arg)(size_t), void (*pfree_arg)(void*));
25527a7fdfSBruce Mitchener    strstreambuf(char* gnext_arg, streamsize n, char* pbeg_arg = nullptr);
263e519524SHoward Hinnant    strstreambuf(const char* gnext_arg, streamsize n);
273e519524SHoward Hinnant
28527a7fdfSBruce Mitchener    strstreambuf(signed char* gnext_arg, streamsize n, signed char* pbeg_arg = nullptr);
293e519524SHoward Hinnant    strstreambuf(const signed char* gnext_arg, streamsize n);
30527a7fdfSBruce Mitchener    strstreambuf(unsigned char* gnext_arg, streamsize n, unsigned char* pbeg_arg = nullptr);
313e519524SHoward Hinnant    strstreambuf(const unsigned char* gnext_arg, streamsize n);
323e519524SHoward Hinnant
333e519524SHoward Hinnant    strstreambuf(strstreambuf&& rhs);
343e519524SHoward Hinnant    strstreambuf& operator=(strstreambuf&& rhs);
353e519524SHoward Hinnant
363e519524SHoward Hinnant    virtual ~strstreambuf();
373e519524SHoward Hinnant
383e519524SHoward Hinnant    void swap(strstreambuf& rhs);
393e519524SHoward Hinnant
403e519524SHoward Hinnant    void freeze(bool freezefl = true);
413e519524SHoward Hinnant    char* str();
423e519524SHoward Hinnant    int pcount() const;
433e519524SHoward Hinnant
443e519524SHoward Hinnantprotected:
453e519524SHoward Hinnant    virtual int_type overflow (int_type c = EOF);
463e519524SHoward Hinnant    virtual int_type pbackfail(int_type c = EOF);
473e519524SHoward Hinnant    virtual int_type underflow();
483e519524SHoward Hinnant    virtual pos_type seekoff(off_type off, ios_base::seekdir way,
493e519524SHoward Hinnant                             ios_base::openmode which = ios_base::in | ios_base::out);
503e519524SHoward Hinnant    virtual pos_type seekpos(pos_type sp,
513e519524SHoward Hinnant                             ios_base::openmode which = ios_base::in | ios_base::out);
523e519524SHoward Hinnant    virtual streambuf* setbuf(char* s, streamsize n);
533e519524SHoward Hinnant
543e519524SHoward Hinnantprivate:
553e519524SHoward Hinnant    typedef T1 strstate;                // exposition only
563e519524SHoward Hinnant    static const strstate allocated;    // exposition only
573e519524SHoward Hinnant    static const strstate constant;     // exposition only
583e519524SHoward Hinnant    static const strstate dynamic;      // exposition only
593e519524SHoward Hinnant    static const strstate frozen;       // exposition only
603e519524SHoward Hinnant    strstate strmode;                   // exposition only
613e519524SHoward Hinnant    streamsize alsize;                  // exposition only
623e519524SHoward Hinnant    void* (*palloc)(size_t);            // exposition only
633e519524SHoward Hinnant    void (*pfree)(void*);               // exposition only
643e519524SHoward Hinnant};
653e519524SHoward Hinnant
663e519524SHoward Hinnantclass istrstream
673e519524SHoward Hinnant    : public basic_istream<char>
683e519524SHoward Hinnant{
693e519524SHoward Hinnantpublic:
703e519524SHoward Hinnant    explicit istrstream(const char* s);
713e519524SHoward Hinnant    explicit istrstream(char* s);
723e519524SHoward Hinnant    istrstream(const char* s, streamsize n);
733e519524SHoward Hinnant    istrstream(char* s, streamsize n);
743e519524SHoward Hinnant
753e519524SHoward Hinnant    virtual ~istrstream();
763e519524SHoward Hinnant
773e519524SHoward Hinnant    strstreambuf* rdbuf() const;
783e519524SHoward Hinnant    char *str();
793e519524SHoward Hinnant
803e519524SHoward Hinnantprivate:
813e519524SHoward Hinnant    strstreambuf sb; // exposition only
823e519524SHoward Hinnant};
833e519524SHoward Hinnant
843e519524SHoward Hinnantclass ostrstream
853e519524SHoward Hinnant    : public basic_ostream<char>
863e519524SHoward Hinnant{
873e519524SHoward Hinnantpublic:
883e519524SHoward Hinnant    ostrstream();
893e519524SHoward Hinnant    ostrstream(char* s, int n, ios_base::openmode mode = ios_base::out);
903e519524SHoward Hinnant
913e519524SHoward Hinnant    virtual ~ostrstream();
923e519524SHoward Hinnant
933e519524SHoward Hinnant    strstreambuf* rdbuf() const;
943e519524SHoward Hinnant    void freeze(bool freezefl = true);
953e519524SHoward Hinnant    char* str();
963e519524SHoward Hinnant    int pcount() const;
973e519524SHoward Hinnant
983e519524SHoward Hinnantprivate:
993e519524SHoward Hinnant    strstreambuf sb; // exposition only
1003e519524SHoward Hinnant};
1013e519524SHoward Hinnant
1023e519524SHoward Hinnantclass strstream
1033e519524SHoward Hinnant    : public basic_iostream<char>
1043e519524SHoward Hinnant{
1053e519524SHoward Hinnantpublic:
1063e519524SHoward Hinnant    // Types
1073e519524SHoward Hinnant    typedef char                        char_type;
1083e519524SHoward Hinnant    typedef char_traits<char>::int_type int_type;
1093e519524SHoward Hinnant    typedef char_traits<char>::pos_type pos_type;
1103e519524SHoward Hinnant    typedef char_traits<char>::off_type off_type;
1113e519524SHoward Hinnant
1123e519524SHoward Hinnant    // constructors/destructor
1133e519524SHoward Hinnant    strstream();
1143e519524SHoward Hinnant    strstream(char* s, int n, ios_base::openmode mode = ios_base::in | ios_base::out);
1153e519524SHoward Hinnant
1163e519524SHoward Hinnant    virtual ~strstream();
1173e519524SHoward Hinnant
1183e519524SHoward Hinnant    // Members:
1193e519524SHoward Hinnant    strstreambuf* rdbuf() const;
1203e519524SHoward Hinnant    void freeze(bool freezefl = true);
1213e519524SHoward Hinnant    int pcount() const;
1223e519524SHoward Hinnant    char* str();
1233e519524SHoward Hinnant
1243e519524SHoward Hinnantprivate:
1253e519524SHoward Hinnant    strstreambuf sb; // exposition only
1263e519524SHoward Hinnant};
1273e519524SHoward Hinnant
1283e519524SHoward Hinnant}  // std
1293e519524SHoward Hinnant
1303e519524SHoward Hinnant*/
1313e519524SHoward Hinnant
132385cc25aSLouis Dionne#include <__assert> // all public C++ headers provide the assertion handler
1333e519524SHoward Hinnant#include <__config>
1343e519524SHoward Hinnant#include <istream>
135bfbd73f8SArthur O'Dwyer#include <ostream>
136bd6e6846SMark de Wever#include <version>
1373e519524SHoward Hinnant
138073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
1393e519524SHoward Hinnant#  pragma GCC system_header
140073458b1SHoward Hinnant#endif
1413e519524SHoward Hinnant
1423e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
1433e519524SHoward Hinnant
1446e41256fSHoward Hinnantclass _LIBCPP_TYPE_VIS strstreambuf
1453e519524SHoward Hinnant    : public streambuf
1463e519524SHoward Hinnant{
1473e519524SHoward Hinnantpublic:
148a11f8b1aSMarek Kurdej#ifndef _LIBCPP_CXX03_LANG
149a11f8b1aSMarek Kurdej    strstreambuf() : strstreambuf(0) {}
150a11f8b1aSMarek Kurdej    explicit strstreambuf(streamsize __alsize);
151a11f8b1aSMarek Kurdej#else
1523e519524SHoward Hinnant    explicit strstreambuf(streamsize __alsize = 0);
153a11f8b1aSMarek Kurdej#endif
1543e519524SHoward Hinnant    strstreambuf(void* (*__palloc)(size_t), void (*__pfree)(void*));
155527a7fdfSBruce Mitchener    strstreambuf(char* __gnext, streamsize __n, char* __pbeg = nullptr);
1563e519524SHoward Hinnant    strstreambuf(const char* __gnext, streamsize __n);
1573e519524SHoward Hinnant
158527a7fdfSBruce Mitchener    strstreambuf(signed char* __gnext, streamsize __n, signed char* __pbeg = nullptr);
1593e519524SHoward Hinnant    strstreambuf(const signed char* __gnext, streamsize __n);
160527a7fdfSBruce Mitchener    strstreambuf(unsigned char* __gnext, streamsize __n, unsigned char* __pbeg = nullptr);
1613e519524SHoward Hinnant    strstreambuf(const unsigned char* __gnext, streamsize __n);
1623e519524SHoward Hinnant
163f0aca21eSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
16411af28bdSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1653e519524SHoward Hinnant    strstreambuf(strstreambuf&& __rhs);
16611af28bdSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1673e519524SHoward Hinnant    strstreambuf& operator=(strstreambuf&& __rhs);
168f0aca21eSEric Fiselier#endif // _LIBCPP_CXX03_LANG
1693e519524SHoward Hinnant
1703e519524SHoward Hinnant    virtual ~strstreambuf();
1713e519524SHoward Hinnant
1723e519524SHoward Hinnant    void swap(strstreambuf& __rhs);
1733e519524SHoward Hinnant
1743e519524SHoward Hinnant    void freeze(bool __freezefl = true);
1753e519524SHoward Hinnant    char* str();
1763e519524SHoward Hinnant    int pcount() const;
1773e519524SHoward Hinnant
1783e519524SHoward Hinnantprotected:
1793e519524SHoward Hinnant    virtual int_type overflow (int_type __c = EOF);
1803e519524SHoward Hinnant    virtual int_type pbackfail(int_type __c = EOF);
1813e519524SHoward Hinnant    virtual int_type underflow();
1823e519524SHoward Hinnant    virtual pos_type seekoff(off_type __off, ios_base::seekdir __way,
1833e519524SHoward Hinnant                             ios_base::openmode __which = ios_base::in | ios_base::out);
1843e519524SHoward Hinnant    virtual pos_type seekpos(pos_type __sp,
1853e519524SHoward Hinnant                             ios_base::openmode __which = ios_base::in | ios_base::out);
1863e519524SHoward Hinnant
1873e519524SHoward Hinnantprivate:
1883e519524SHoward Hinnant    typedef unsigned __mode_type;
1893e519524SHoward Hinnant    static const __mode_type __allocated = 0x01;
1903e519524SHoward Hinnant    static const __mode_type __constant  = 0x02;
1913e519524SHoward Hinnant    static const __mode_type __dynamic   = 0x04;
1923e519524SHoward Hinnant    static const __mode_type __frozen    = 0x08;
1933e519524SHoward Hinnant    static const streamsize    __default_alsize = 4096;
1943e519524SHoward Hinnant
1953e519524SHoward Hinnant    __mode_type __strmode_;
1963e519524SHoward Hinnant    streamsize __alsize_;
1973e519524SHoward Hinnant    void* (*__palloc_)(size_t);
1983e519524SHoward Hinnant    void (*__pfree_)(void*);
1993e519524SHoward Hinnant
2003e519524SHoward Hinnant    void __init(char* __gnext, streamsize __n, char* __pbeg);
2013e519524SHoward Hinnant};
2023e519524SHoward Hinnant
203f0aca21eSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
20411af28bdSHoward Hinnant
20511af28bdSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
20611af28bdSHoward Hinnantstrstreambuf::strstreambuf(strstreambuf&& __rhs)
20711af28bdSHoward Hinnant    : streambuf(__rhs),
20811af28bdSHoward Hinnant      __strmode_(__rhs.__strmode_),
20911af28bdSHoward Hinnant      __alsize_(__rhs.__alsize_),
21011af28bdSHoward Hinnant      __palloc_(__rhs.__palloc_),
21111af28bdSHoward Hinnant      __pfree_(__rhs.__pfree_)
21211af28bdSHoward Hinnant{
21311af28bdSHoward Hinnant    __rhs.setg(nullptr, nullptr, nullptr);
21411af28bdSHoward Hinnant    __rhs.setp(nullptr, nullptr);
21511af28bdSHoward Hinnant}
21611af28bdSHoward Hinnant
21711af28bdSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
21811af28bdSHoward Hinnantstrstreambuf&
21911af28bdSHoward Hinnantstrstreambuf::operator=(strstreambuf&& __rhs)
22011af28bdSHoward Hinnant{
22111af28bdSHoward Hinnant    if (eback() && (__strmode_ & __allocated) != 0 && (__strmode_ & __frozen) == 0)
22211af28bdSHoward Hinnant    {
22311af28bdSHoward Hinnant        if (__pfree_)
22411af28bdSHoward Hinnant            __pfree_(eback());
22511af28bdSHoward Hinnant        else
22611af28bdSHoward Hinnant            delete [] eback();
22711af28bdSHoward Hinnant    }
22811af28bdSHoward Hinnant    streambuf::operator=(__rhs);
22911af28bdSHoward Hinnant    __strmode_ = __rhs.__strmode_;
23011af28bdSHoward Hinnant    __alsize_ = __rhs.__alsize_;
23111af28bdSHoward Hinnant    __palloc_ = __rhs.__palloc_;
23211af28bdSHoward Hinnant    __pfree_ = __rhs.__pfree_;
23311af28bdSHoward Hinnant    __rhs.setg(nullptr, nullptr, nullptr);
23411af28bdSHoward Hinnant    __rhs.setp(nullptr, nullptr);
23511af28bdSHoward Hinnant    return *this;
23611af28bdSHoward Hinnant}
23711af28bdSHoward Hinnant
238f0aca21eSEric Fiselier#endif // _LIBCPP_CXX03_LANG
23911af28bdSHoward Hinnant
2406e41256fSHoward Hinnantclass _LIBCPP_TYPE_VIS istrstream
2413e519524SHoward Hinnant    : public istream
2423e519524SHoward Hinnant{
2433e519524SHoward Hinnantpublic:
244e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2453e519524SHoward Hinnant    explicit istrstream(const char* __s)
2463e519524SHoward Hinnant        : istream(&__sb_), __sb_(__s, 0) {}
247e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2483e519524SHoward Hinnant    explicit istrstream(char* __s)
2493e519524SHoward Hinnant        : istream(&__sb_), __sb_(__s, 0) {}
250e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2513e519524SHoward Hinnant    istrstream(const char* __s, streamsize __n)
2523e519524SHoward Hinnant        : istream(&__sb_), __sb_(__s, __n) {}
253e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2543e519524SHoward Hinnant    istrstream(char* __s, streamsize __n)
2553e519524SHoward Hinnant        : istream(&__sb_), __sb_(__s, __n) {}
2563e519524SHoward Hinnant
257f0aca21eSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
258e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2593e519524SHoward Hinnant    istrstream(istrstream&& __rhs)
260ce48a113SHoward Hinnant        : istream(_VSTD::move(__rhs)),
261ce48a113SHoward Hinnant          __sb_(_VSTD::move(__rhs.__sb_))
2623e519524SHoward Hinnant    {
2633e519524SHoward Hinnant        istream::set_rdbuf(&__sb_);
2643e519524SHoward Hinnant    }
2653e519524SHoward Hinnant
266e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2673e519524SHoward Hinnant    istrstream& operator=(istrstream&& __rhs)
2683e519524SHoward Hinnant    {
269ce48a113SHoward Hinnant        __sb_ = _VSTD::move(__rhs.__sb_);
270*26ac9cbfSNikolas Klauser        istream::operator=(_VSTD::move(__rhs));
2713e519524SHoward Hinnant        return *this;
2723e519524SHoward Hinnant    }
273f0aca21eSEric Fiselier#endif // _LIBCPP_CXX03_LANG
2743e519524SHoward Hinnant
2753e519524SHoward Hinnant    virtual ~istrstream();
2763e519524SHoward Hinnant
277e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2783e519524SHoward Hinnant    void swap(istrstream& __rhs)
2793e519524SHoward Hinnant    {
2803e519524SHoward Hinnant        istream::swap(__rhs);
2813e519524SHoward Hinnant        __sb_.swap(__rhs.__sb_);
2823e519524SHoward Hinnant    }
2833e519524SHoward Hinnant
284e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2853e519524SHoward Hinnant    strstreambuf* rdbuf() const {return const_cast<strstreambuf*>(&__sb_);}
286e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2873e519524SHoward Hinnant    char *str() {return __sb_.str();}
2883e519524SHoward Hinnant
2893e519524SHoward Hinnantprivate:
2903e519524SHoward Hinnant    strstreambuf __sb_;
2913e519524SHoward Hinnant};
2923e519524SHoward Hinnant
2936e41256fSHoward Hinnantclass _LIBCPP_TYPE_VIS ostrstream
2943e519524SHoward Hinnant    : public ostream
2953e519524SHoward Hinnant{
2963e519524SHoward Hinnantpublic:
297e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2983e519524SHoward Hinnant    ostrstream()
2993e519524SHoward Hinnant        : ostream(&__sb_) {}
300e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3013e519524SHoward Hinnant    ostrstream(char* __s, int __n, ios_base::openmode __mode = ios_base::out)
3023e519524SHoward Hinnant        : ostream(&__sb_),
3033696227cSArthur O'Dwyer          __sb_(__s, __n, __s + (__mode & ios::app ? _VSTD::strlen(__s) : 0))
3043e519524SHoward Hinnant        {}
3053e519524SHoward Hinnant
306f0aca21eSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
307e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3083e519524SHoward Hinnant    ostrstream(ostrstream&& __rhs)
309ce48a113SHoward Hinnant        : ostream(_VSTD::move(__rhs)),
310ce48a113SHoward Hinnant          __sb_(_VSTD::move(__rhs.__sb_))
3113e519524SHoward Hinnant    {
3123e519524SHoward Hinnant        ostream::set_rdbuf(&__sb_);
3133e519524SHoward Hinnant    }
3143e519524SHoward Hinnant
315e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3163e519524SHoward Hinnant    ostrstream& operator=(ostrstream&& __rhs)
3173e519524SHoward Hinnant    {
318ce48a113SHoward Hinnant        __sb_ = _VSTD::move(__rhs.__sb_);
319*26ac9cbfSNikolas Klauser        ostream::operator=(_VSTD::move(__rhs));
3203e519524SHoward Hinnant        return *this;
3213e519524SHoward Hinnant    }
322f0aca21eSEric Fiselier#endif // _LIBCPP_CXX03_LANG
3233e519524SHoward Hinnant
3243e519524SHoward Hinnant    virtual ~ostrstream();
3253e519524SHoward Hinnant
326e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3273e519524SHoward Hinnant    void swap(ostrstream& __rhs)
3283e519524SHoward Hinnant    {
3293e519524SHoward Hinnant        ostream::swap(__rhs);
3303e519524SHoward Hinnant        __sb_.swap(__rhs.__sb_);
3313e519524SHoward Hinnant    }
3323e519524SHoward Hinnant
333e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3343e519524SHoward Hinnant    strstreambuf* rdbuf() const {return const_cast<strstreambuf*>(&__sb_);}
335e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3363e519524SHoward Hinnant    void freeze(bool __freezefl = true) {__sb_.freeze(__freezefl);}
337e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3383e519524SHoward Hinnant    char* str()         {return __sb_.str();}
339e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3403e519524SHoward Hinnant    int pcount() const  {return __sb_.pcount();}
3413e519524SHoward Hinnant
3423e519524SHoward Hinnantprivate:
3433e519524SHoward Hinnant    strstreambuf __sb_; // exposition only
3443e519524SHoward Hinnant};
3453e519524SHoward Hinnant
3466e41256fSHoward Hinnantclass _LIBCPP_TYPE_VIS strstream
3473e519524SHoward Hinnant    : public iostream
3483e519524SHoward Hinnant{
3493e519524SHoward Hinnantpublic:
3503e519524SHoward Hinnant    // Types
3513e519524SHoward Hinnant    typedef char                        char_type;
3523e519524SHoward Hinnant    typedef char_traits<char>::int_type int_type;
3533e519524SHoward Hinnant    typedef char_traits<char>::pos_type pos_type;
3543e519524SHoward Hinnant    typedef char_traits<char>::off_type off_type;
3553e519524SHoward Hinnant
3563e519524SHoward Hinnant    // constructors/destructor
357e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3583e519524SHoward Hinnant    strstream()
3593e519524SHoward Hinnant        : iostream(&__sb_) {}
360e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3613e519524SHoward Hinnant    strstream(char* __s, int __n, ios_base::openmode __mode = ios_base::in | ios_base::out)
3623e519524SHoward Hinnant        : iostream(&__sb_),
3633696227cSArthur O'Dwyer          __sb_(__s, __n, __s + (__mode & ios::app ? _VSTD::strlen(__s) : 0))
3643e519524SHoward Hinnant        {}
3653e519524SHoward Hinnant
366f0aca21eSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
367e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3683e519524SHoward Hinnant    strstream(strstream&& __rhs)
369ce48a113SHoward Hinnant        : iostream(_VSTD::move(__rhs)),
370ce48a113SHoward Hinnant          __sb_(_VSTD::move(__rhs.__sb_))
3713e519524SHoward Hinnant    {
3723e519524SHoward Hinnant        iostream::set_rdbuf(&__sb_);
3733e519524SHoward Hinnant    }
3743e519524SHoward Hinnant
375e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3763e519524SHoward Hinnant    strstream& operator=(strstream&& __rhs)
3773e519524SHoward Hinnant    {
378ce48a113SHoward Hinnant        __sb_ = _VSTD::move(__rhs.__sb_);
379*26ac9cbfSNikolas Klauser        iostream::operator=(_VSTD::move(__rhs));
3803e519524SHoward Hinnant        return *this;
3813e519524SHoward Hinnant    }
382f0aca21eSEric Fiselier#endif // _LIBCPP_CXX03_LANG
3833e519524SHoward Hinnant
3843e519524SHoward Hinnant    virtual ~strstream();
3853e519524SHoward Hinnant
386e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3873e519524SHoward Hinnant    void swap(strstream& __rhs)
3883e519524SHoward Hinnant    {
3893e519524SHoward Hinnant        iostream::swap(__rhs);
3903e519524SHoward Hinnant        __sb_.swap(__rhs.__sb_);
3913e519524SHoward Hinnant    }
3923e519524SHoward Hinnant
3933e519524SHoward Hinnant    // Members:
394e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3953e519524SHoward Hinnant    strstreambuf* rdbuf() const {return const_cast<strstreambuf*>(&__sb_);}
396e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3973e519524SHoward Hinnant    void freeze(bool __freezefl = true) {__sb_.freeze(__freezefl);}
398e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3993e519524SHoward Hinnant    int pcount() const {return __sb_.pcount();}
400e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4013e519524SHoward Hinnant    char* str()        {return __sb_.str();}
4023e519524SHoward Hinnant
4033e519524SHoward Hinnantprivate:
4043e519524SHoward Hinnant    strstreambuf __sb_; // exposition only
4053e519524SHoward Hinnant};
4063e519524SHoward Hinnant
4073e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
4083e519524SHoward Hinnant
4093e519524SHoward Hinnant#endif // _LIBCPP_STRSTREAM
410