| // -*- C++ -*- | 
 | //===----------------------------------------------------------------------===// | 
 | // | 
 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
 | // See https://llvm.org/LICENSE.txt for license information. | 
 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 |  | 
 | #ifndef _LIBCPP_STRSTREAM | 
 | #define _LIBCPP_STRSTREAM | 
 |  | 
 | /* | 
 |     strstream synopsis | 
 |  | 
 | class strstreambuf | 
 |     : public basic_streambuf<char> | 
 | { | 
 | public: | 
 |     explicit strstreambuf(streamsize alsize_arg = 0); // before C++20 | 
 |     strstreambuf() : strstreambuf(0) {}               // C++20 | 
 |     explicit strstreambuf(streamsize alsize_arg);     // C++20 | 
 |  | 
 |     strstreambuf(void* (*palloc_arg)(size_t), void (*pfree_arg)(void*)); | 
 |     strstreambuf(char* gnext_arg, streamsize n, char* pbeg_arg = nullptr); | 
 |     strstreambuf(const char* gnext_arg, streamsize n); | 
 |  | 
 |     strstreambuf(signed char* gnext_arg, streamsize n, signed char* pbeg_arg = nullptr); | 
 |     strstreambuf(const signed char* gnext_arg, streamsize n); | 
 |     strstreambuf(unsigned char* gnext_arg, streamsize n, unsigned char* pbeg_arg = nullptr); | 
 |     strstreambuf(const unsigned char* gnext_arg, streamsize n); | 
 |  | 
 |     strstreambuf(strstreambuf&& rhs); | 
 |     strstreambuf& operator=(strstreambuf&& rhs); | 
 |  | 
 |     virtual ~strstreambuf(); | 
 |  | 
 |     void swap(strstreambuf& rhs); | 
 |  | 
 |     void freeze(bool freezefl = true); | 
 |     char* str(); | 
 |     int pcount() const; | 
 |  | 
 | protected: | 
 |     virtual int_type overflow (int_type c = EOF); | 
 |     virtual int_type pbackfail(int_type c = EOF); | 
 |     virtual int_type underflow(); | 
 |     virtual pos_type seekoff(off_type off, ios_base::seekdir way, | 
 |                              ios_base::openmode which = ios_base::in | ios_base::out); | 
 |     virtual pos_type seekpos(pos_type sp, | 
 |                              ios_base::openmode which = ios_base::in | ios_base::out); | 
 |     virtual streambuf* setbuf(char* s, streamsize n); | 
 |  | 
 | private: | 
 |     typedef T1 strstate;                // exposition only | 
 |     static const strstate allocated;    // exposition only | 
 |     static const strstate constant;     // exposition only | 
 |     static const strstate dynamic;      // exposition only | 
 |     static const strstate frozen;       // exposition only | 
 |     strstate strmode;                   // exposition only | 
 |     streamsize alsize;                  // exposition only | 
 |     void* (*palloc)(size_t);            // exposition only | 
 |     void (*pfree)(void*);               // exposition only | 
 | }; | 
 |  | 
 | class istrstream | 
 |     : public basic_istream<char> | 
 | { | 
 | public: | 
 |     explicit istrstream(const char* s); | 
 |     explicit istrstream(char* s); | 
 |     istrstream(const char* s, streamsize n); | 
 |     istrstream(char* s, streamsize n); | 
 |  | 
 |     virtual ~istrstream(); | 
 |  | 
 |     strstreambuf* rdbuf() const; | 
 |     char *str(); | 
 |  | 
 | private: | 
 |     strstreambuf sb; // exposition only | 
 | }; | 
 |  | 
 | class ostrstream | 
 |     : public basic_ostream<char> | 
 | { | 
 | public: | 
 |     ostrstream(); | 
 |     ostrstream(char* s, int n, ios_base::openmode mode = ios_base::out); | 
 |  | 
 |     virtual ~ostrstream(); | 
 |  | 
 |     strstreambuf* rdbuf() const; | 
 |     void freeze(bool freezefl = true); | 
 |     char* str(); | 
 |     int pcount() const; | 
 |  | 
 | private: | 
 |     strstreambuf sb; // exposition only | 
 | }; | 
 |  | 
 | class strstream | 
 |     : public basic_iostream<char> | 
 | { | 
 | public: | 
 |     // Types | 
 |     typedef char                        char_type; | 
 |     typedef char_traits<char>::int_type int_type; | 
 |     typedef char_traits<char>::pos_type pos_type; | 
 |     typedef char_traits<char>::off_type off_type; | 
 |  | 
 |     // constructors/destructor | 
 |     strstream(); | 
 |     strstream(char* s, int n, ios_base::openmode mode = ios_base::in | ios_base::out); | 
 |  | 
 |     virtual ~strstream(); | 
 |  | 
 |     // Members: | 
 |     strstreambuf* rdbuf() const; | 
 |     void freeze(bool freezefl = true); | 
 |     int pcount() const; | 
 |     char* str(); | 
 |  | 
 | private: | 
 |     strstreambuf sb; // exposition only | 
 | }; | 
 |  | 
 | }  // std | 
 |  | 
 | */ | 
 |  | 
 | #include <__assert> // all public C++ headers provide the assertion handler | 
 | #include <__config> | 
 | #include <istream> | 
 | #include <ostream> | 
 | #include <version> | 
 |  | 
 | #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) | 
 | #  pragma GCC system_header | 
 | #endif | 
 |  | 
 | _LIBCPP_BEGIN_NAMESPACE_STD | 
 |  | 
 | class _LIBCPP_DEPRECATED _LIBCPP_EXPORTED_FROM_ABI strstreambuf | 
 |     : public streambuf | 
 | { | 
 | public: | 
 | #ifndef _LIBCPP_CXX03_LANG | 
 |     _LIBCPP_HIDE_FROM_ABI strstreambuf() : strstreambuf(0) {} | 
 |     explicit strstreambuf(streamsize __alsize); | 
 | #else | 
 |     explicit strstreambuf(streamsize __alsize = 0); | 
 | #endif | 
 |     strstreambuf(void* (*__palloc)(size_t), void (*__pfree)(void*)); | 
 |     strstreambuf(char* __gnext, streamsize __n, char* __pbeg = nullptr); | 
 |     strstreambuf(const char* __gnext, streamsize __n); | 
 |  | 
 |     strstreambuf(signed char* __gnext, streamsize __n, signed char* __pbeg = nullptr); | 
 |     strstreambuf(const signed char* __gnext, streamsize __n); | 
 |     strstreambuf(unsigned char* __gnext, streamsize __n, unsigned char* __pbeg = nullptr); | 
 |     strstreambuf(const unsigned char* __gnext, streamsize __n); | 
 |  | 
 | #ifndef _LIBCPP_CXX03_LANG | 
 |     _LIBCPP_INLINE_VISIBILITY | 
 |     strstreambuf(strstreambuf&& __rhs); | 
 |     _LIBCPP_INLINE_VISIBILITY | 
 |     strstreambuf& operator=(strstreambuf&& __rhs); | 
 | #endif // _LIBCPP_CXX03_LANG | 
 |  | 
 |     ~strstreambuf() override; | 
 |  | 
 |     void swap(strstreambuf& __rhs); | 
 |  | 
 |     void freeze(bool __freezefl = true); | 
 |     char* str(); | 
 |     int pcount() const; | 
 |  | 
 | protected: | 
 |     int_type overflow (int_type __c = EOF) override; | 
 |     int_type pbackfail(int_type __c = EOF) override; | 
 |     int_type underflow() override; | 
 |     pos_type seekoff(off_type __off, ios_base::seekdir __way, | 
 |                      ios_base::openmode __which = ios_base::in | ios_base::out) override; | 
 |     pos_type seekpos(pos_type __sp, | 
 |                      ios_base::openmode __which = ios_base::in | ios_base::out) override; | 
 |  | 
 | private: | 
 |     typedef unsigned __mode_type; | 
 |     static const __mode_type __allocated = 0x01; | 
 |     static const __mode_type __constant  = 0x02; | 
 |     static const __mode_type __dynamic   = 0x04; | 
 |     static const __mode_type __frozen    = 0x08; | 
 |     static const streamsize    __default_alsize = 4096; | 
 |  | 
 |     __mode_type __strmode_; | 
 |     streamsize __alsize_; | 
 |     void* (*__palloc_)(size_t); | 
 |     void (*__pfree_)(void*); | 
 |  | 
 |     void __init(char* __gnext, streamsize __n, char* __pbeg); | 
 | }; | 
 |  | 
 | #ifndef _LIBCPP_CXX03_LANG | 
 |  | 
 | inline _LIBCPP_INLINE_VISIBILITY | 
 | strstreambuf::strstreambuf(strstreambuf&& __rhs) | 
 |     : streambuf(__rhs), | 
 |       __strmode_(__rhs.__strmode_), | 
 |       __alsize_(__rhs.__alsize_), | 
 |       __palloc_(__rhs.__palloc_), | 
 |       __pfree_(__rhs.__pfree_) | 
 | { | 
 |     __rhs.setg(nullptr, nullptr, nullptr); | 
 |     __rhs.setp(nullptr, nullptr); | 
 | } | 
 |  | 
 | inline _LIBCPP_INLINE_VISIBILITY | 
 | strstreambuf& | 
 | strstreambuf::operator=(strstreambuf&& __rhs) | 
 | { | 
 |     if (eback() && (__strmode_ & __allocated) != 0 && (__strmode_ & __frozen) == 0) | 
 |     { | 
 |         if (__pfree_) | 
 |             __pfree_(eback()); | 
 |         else | 
 |             delete [] eback(); | 
 |     } | 
 |     streambuf::operator=(__rhs); | 
 |     __strmode_ = __rhs.__strmode_; | 
 |     __alsize_ = __rhs.__alsize_; | 
 |     __palloc_ = __rhs.__palloc_; | 
 |     __pfree_ = __rhs.__pfree_; | 
 |     __rhs.setg(nullptr, nullptr, nullptr); | 
 |     __rhs.setp(nullptr, nullptr); | 
 |     return *this; | 
 | } | 
 |  | 
 | #endif // _LIBCPP_CXX03_LANG | 
 |  | 
 | class _LIBCPP_DEPRECATED _LIBCPP_EXPORTED_FROM_ABI istrstream | 
 |     : public istream | 
 | { | 
 | public: | 
 |     _LIBCPP_INLINE_VISIBILITY | 
 |     explicit istrstream(const char* __s) | 
 |         : istream(&__sb_), __sb_(__s, 0) {} | 
 |     _LIBCPP_INLINE_VISIBILITY | 
 |     explicit istrstream(char* __s) | 
 |         : istream(&__sb_), __sb_(__s, 0) {} | 
 |     _LIBCPP_INLINE_VISIBILITY | 
 |     istrstream(const char* __s, streamsize __n) | 
 |         : istream(&__sb_), __sb_(__s, __n) {} | 
 |     _LIBCPP_INLINE_VISIBILITY | 
 |     istrstream(char* __s, streamsize __n) | 
 |         : istream(&__sb_), __sb_(__s, __n) {} | 
 |  | 
 | #ifndef _LIBCPP_CXX03_LANG | 
 |     _LIBCPP_INLINE_VISIBILITY | 
 |     istrstream(istrstream&& __rhs)  // extension | 
 |         : istream(_VSTD::move(static_cast<istream&>(__rhs))), | 
 |           __sb_(_VSTD::move(__rhs.__sb_)) | 
 |     { | 
 |         istream::set_rdbuf(&__sb_); | 
 |     } | 
 |  | 
 |     _LIBCPP_INLINE_VISIBILITY | 
 |     istrstream& operator=(istrstream&& __rhs) | 
 |     { | 
 |         __sb_ = _VSTD::move(__rhs.__sb_); | 
 |         istream::operator=(_VSTD::move(__rhs)); | 
 |         return *this; | 
 |     } | 
 | #endif // _LIBCPP_CXX03_LANG | 
 |  | 
 |     ~istrstream() override; | 
 |  | 
 |     _LIBCPP_INLINE_VISIBILITY | 
 |     void swap(istrstream& __rhs) | 
 |     { | 
 |         istream::swap(__rhs); | 
 |         __sb_.swap(__rhs.__sb_); | 
 |     } | 
 |  | 
 |     _LIBCPP_INLINE_VISIBILITY | 
 |     strstreambuf* rdbuf() const {return const_cast<strstreambuf*>(&__sb_);} | 
 |     _LIBCPP_INLINE_VISIBILITY | 
 |     char *str() {return __sb_.str();} | 
 |  | 
 | private: | 
 |     strstreambuf __sb_; | 
 | }; | 
 |  | 
 | class _LIBCPP_DEPRECATED _LIBCPP_EXPORTED_FROM_ABI ostrstream | 
 |     : public ostream | 
 | { | 
 | public: | 
 |     _LIBCPP_INLINE_VISIBILITY | 
 |     ostrstream() | 
 |         : ostream(&__sb_) {} | 
 |     _LIBCPP_INLINE_VISIBILITY | 
 |     ostrstream(char* __s, int __n, ios_base::openmode __mode = ios_base::out) | 
 |         : ostream(&__sb_), | 
 |           __sb_(__s, __n, __s + (__mode & ios::app ? _VSTD::strlen(__s) : 0)) | 
 |         {} | 
 |  | 
 | #ifndef _LIBCPP_CXX03_LANG | 
 |     _LIBCPP_INLINE_VISIBILITY | 
 |     ostrstream(ostrstream&& __rhs)  // extension | 
 |         : ostream(_VSTD::move(static_cast<ostream&>(__rhs))), | 
 |           __sb_(_VSTD::move(__rhs.__sb_)) | 
 |     { | 
 |         ostream::set_rdbuf(&__sb_); | 
 |     } | 
 |  | 
 |     _LIBCPP_INLINE_VISIBILITY | 
 |     ostrstream& operator=(ostrstream&& __rhs) | 
 |     { | 
 |         __sb_ = _VSTD::move(__rhs.__sb_); | 
 |         ostream::operator=(_VSTD::move(__rhs)); | 
 |         return *this; | 
 |     } | 
 | #endif // _LIBCPP_CXX03_LANG | 
 |  | 
 |     ~ostrstream() override; | 
 |  | 
 |     _LIBCPP_INLINE_VISIBILITY | 
 |     void swap(ostrstream& __rhs) | 
 |     { | 
 |         ostream::swap(__rhs); | 
 |         __sb_.swap(__rhs.__sb_); | 
 |     } | 
 |  | 
 |     _LIBCPP_INLINE_VISIBILITY | 
 |     strstreambuf* rdbuf() const {return const_cast<strstreambuf*>(&__sb_);} | 
 |     _LIBCPP_INLINE_VISIBILITY | 
 |     void freeze(bool __freezefl = true) {__sb_.freeze(__freezefl);} | 
 |     _LIBCPP_INLINE_VISIBILITY | 
 |     char* str()         {return __sb_.str();} | 
 |     _LIBCPP_INLINE_VISIBILITY | 
 |     int pcount() const  {return __sb_.pcount();} | 
 |  | 
 | private: | 
 |     strstreambuf __sb_; // exposition only | 
 | }; | 
 |  | 
 | class _LIBCPP_DEPRECATED _LIBCPP_EXPORTED_FROM_ABI strstream | 
 |     : public iostream | 
 | { | 
 | public: | 
 |     // Types | 
 |     typedef char                        char_type; | 
 |     typedef char_traits<char>::int_type int_type; | 
 |     typedef char_traits<char>::pos_type pos_type; | 
 |     typedef char_traits<char>::off_type off_type; | 
 |  | 
 |     // constructors/destructor | 
 |     _LIBCPP_INLINE_VISIBILITY | 
 |     strstream() | 
 |         : iostream(&__sb_) {} | 
 |     _LIBCPP_INLINE_VISIBILITY | 
 |     strstream(char* __s, int __n, ios_base::openmode __mode = ios_base::in | ios_base::out) | 
 |         : iostream(&__sb_), | 
 |           __sb_(__s, __n, __s + (__mode & ios::app ? _VSTD::strlen(__s) : 0)) | 
 |         {} | 
 |  | 
 | #ifndef _LIBCPP_CXX03_LANG | 
 |     _LIBCPP_INLINE_VISIBILITY | 
 |     strstream(strstream&& __rhs)  // extension | 
 |         : iostream(_VSTD::move(static_cast<iostream&>(__rhs))), | 
 |           __sb_(_VSTD::move(__rhs.__sb_)) | 
 |     { | 
 |         iostream::set_rdbuf(&__sb_); | 
 |     } | 
 |  | 
 |     _LIBCPP_INLINE_VISIBILITY | 
 |     strstream& operator=(strstream&& __rhs) | 
 |     { | 
 |         __sb_ = _VSTD::move(__rhs.__sb_); | 
 |         iostream::operator=(_VSTD::move(__rhs)); | 
 |         return *this; | 
 |     } | 
 | #endif // _LIBCPP_CXX03_LANG | 
 |  | 
 |     ~strstream() override; | 
 |  | 
 |     _LIBCPP_INLINE_VISIBILITY | 
 |     void swap(strstream& __rhs) | 
 |     { | 
 |         iostream::swap(__rhs); | 
 |         __sb_.swap(__rhs.__sb_); | 
 |     } | 
 |  | 
 |     // Members: | 
 |     _LIBCPP_INLINE_VISIBILITY | 
 |     strstreambuf* rdbuf() const {return const_cast<strstreambuf*>(&__sb_);} | 
 |     _LIBCPP_INLINE_VISIBILITY | 
 |     void freeze(bool __freezefl = true) {__sb_.freeze(__freezefl);} | 
 |     _LIBCPP_INLINE_VISIBILITY | 
 |     int pcount() const {return __sb_.pcount();} | 
 |     _LIBCPP_INLINE_VISIBILITY | 
 |     char* str()        {return __sb_.str();} | 
 |  | 
 | private: | 
 |     strstreambuf __sb_; // exposition only | 
 | }; | 
 |  | 
 | _LIBCPP_END_NAMESPACE_STD | 
 |  | 
 | #endif // _LIBCPP_STRSTREAM |