|  | // -*- 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                                    // Removed in C++26 | 
|  | : 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                                      // Removed in C++26 | 
|  | : 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                                      // Removed in C++26 | 
|  | : 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                                       // Removed in C++26 | 
|  | : 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 | 
|  |  | 
|  | */ | 
|  |  | 
|  | #if __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS) | 
|  | #  include <__cxx03/strstream> | 
|  | #else | 
|  | #  include <__config> | 
|  |  | 
|  | #  if _LIBCPP_HAS_LOCALIZATION | 
|  |  | 
|  | #    include <__ostream/basic_ostream.h> | 
|  | #    include <istream> | 
|  | #    include <streambuf> | 
|  | #    include <version> | 
|  |  | 
|  | #    if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) | 
|  | #      pragma GCC system_header | 
|  | #    endif | 
|  |  | 
|  | #    if _LIBCPP_STD_VER < 26 || defined(_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM) || defined(_LIBCPP_BUILDING_LIBRARY) | 
|  |  | 
|  | _LIBCPP_PUSH_MACROS | 
|  | #      include <__undef_macros> | 
|  |  | 
|  | _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_HIDE_FROM_ABI strstreambuf(strstreambuf&& __rhs); | 
|  | _LIBCPP_HIDE_FROM_ABI 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_HIDE_FROM_ABI 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_HIDE_FROM_ABI 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_HIDE_FROM_ABI explicit istrstream(const char* __s) : istream(&__sb_), __sb_(__s, 0) {} | 
|  | _LIBCPP_HIDE_FROM_ABI explicit istrstream(char* __s) : istream(&__sb_), __sb_(__s, 0) {} | 
|  | _LIBCPP_HIDE_FROM_ABI istrstream(const char* __s, streamsize __n) : istream(&__sb_), __sb_(__s, __n) {} | 
|  | _LIBCPP_HIDE_FROM_ABI istrstream(char* __s, streamsize __n) : istream(&__sb_), __sb_(__s, __n) {} | 
|  |  | 
|  | #      ifndef _LIBCPP_CXX03_LANG | 
|  | _LIBCPP_HIDE_FROM_ABI istrstream(istrstream&& __rhs) // extension | 
|  | : istream(std::move(static_cast<istream&>(__rhs))), __sb_(std::move(__rhs.__sb_)) { | 
|  | istream::set_rdbuf(&__sb_); | 
|  | } | 
|  |  | 
|  | _LIBCPP_HIDE_FROM_ABI istrstream& operator=(istrstream&& __rhs) { | 
|  | __sb_ = std::move(__rhs.__sb_); | 
|  | istream::operator=(std::move(__rhs)); | 
|  | return *this; | 
|  | } | 
|  | #      endif // _LIBCPP_CXX03_LANG | 
|  |  | 
|  | ~istrstream() override; | 
|  |  | 
|  | _LIBCPP_HIDE_FROM_ABI void swap(istrstream& __rhs) { | 
|  | istream::swap(__rhs); | 
|  | __sb_.swap(__rhs.__sb_); | 
|  | } | 
|  |  | 
|  | _LIBCPP_HIDE_FROM_ABI strstreambuf* rdbuf() const { return const_cast<strstreambuf*>(&__sb_); } | 
|  | _LIBCPP_HIDE_FROM_ABI char* str() { return __sb_.str(); } | 
|  |  | 
|  | private: | 
|  | strstreambuf __sb_; | 
|  | }; | 
|  |  | 
|  | class _LIBCPP_DEPRECATED _LIBCPP_EXPORTED_FROM_ABI ostrstream : public ostream { | 
|  | public: | 
|  | _LIBCPP_HIDE_FROM_ABI ostrstream() : ostream(&__sb_) {} | 
|  | _LIBCPP_HIDE_FROM_ABI ostrstream(char* __s, int __n, ios_base::openmode __mode = ios_base::out) | 
|  | : ostream(&__sb_), __sb_(__s, __n, __s + (__mode & ios::app ? std::strlen(__s) : 0)) {} | 
|  |  | 
|  | #      ifndef _LIBCPP_CXX03_LANG | 
|  | _LIBCPP_HIDE_FROM_ABI ostrstream(ostrstream&& __rhs) // extension | 
|  | : ostream(std::move(static_cast<ostream&>(__rhs))), __sb_(std::move(__rhs.__sb_)) { | 
|  | ostream::set_rdbuf(&__sb_); | 
|  | } | 
|  |  | 
|  | _LIBCPP_HIDE_FROM_ABI ostrstream& operator=(ostrstream&& __rhs) { | 
|  | __sb_ = std::move(__rhs.__sb_); | 
|  | ostream::operator=(std::move(__rhs)); | 
|  | return *this; | 
|  | } | 
|  | #      endif // _LIBCPP_CXX03_LANG | 
|  |  | 
|  | ~ostrstream() override; | 
|  |  | 
|  | _LIBCPP_HIDE_FROM_ABI void swap(ostrstream& __rhs) { | 
|  | ostream::swap(__rhs); | 
|  | __sb_.swap(__rhs.__sb_); | 
|  | } | 
|  |  | 
|  | _LIBCPP_HIDE_FROM_ABI strstreambuf* rdbuf() const { return const_cast<strstreambuf*>(&__sb_); } | 
|  | _LIBCPP_HIDE_FROM_ABI void freeze(bool __freezefl = true) { __sb_.freeze(__freezefl); } | 
|  | _LIBCPP_HIDE_FROM_ABI char* str() { return __sb_.str(); } | 
|  | _LIBCPP_HIDE_FROM_ABI 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_HIDE_FROM_ABI strstream() : iostream(&__sb_) {} | 
|  | _LIBCPP_HIDE_FROM_ABI strstream(char* __s, int __n, ios_base::openmode __mode = ios_base::in | ios_base::out) | 
|  | : iostream(&__sb_), __sb_(__s, __n, __s + (__mode & ios::app ? std::strlen(__s) : 0)) {} | 
|  |  | 
|  | #      ifndef _LIBCPP_CXX03_LANG | 
|  | _LIBCPP_HIDE_FROM_ABI strstream(strstream&& __rhs) // extension | 
|  | : iostream(std::move(static_cast<iostream&>(__rhs))), __sb_(std::move(__rhs.__sb_)) { | 
|  | iostream::set_rdbuf(&__sb_); | 
|  | } | 
|  |  | 
|  | _LIBCPP_HIDE_FROM_ABI strstream& operator=(strstream&& __rhs) { | 
|  | __sb_ = std::move(__rhs.__sb_); | 
|  | iostream::operator=(std::move(__rhs)); | 
|  | return *this; | 
|  | } | 
|  | #      endif // _LIBCPP_CXX03_LANG | 
|  |  | 
|  | ~strstream() override; | 
|  |  | 
|  | _LIBCPP_HIDE_FROM_ABI void swap(strstream& __rhs) { | 
|  | iostream::swap(__rhs); | 
|  | __sb_.swap(__rhs.__sb_); | 
|  | } | 
|  |  | 
|  | // Members: | 
|  | _LIBCPP_HIDE_FROM_ABI strstreambuf* rdbuf() const { return const_cast<strstreambuf*>(&__sb_); } | 
|  | _LIBCPP_HIDE_FROM_ABI void freeze(bool __freezefl = true) { __sb_.freeze(__freezefl); } | 
|  | _LIBCPP_HIDE_FROM_ABI int pcount() const { return __sb_.pcount(); } | 
|  | _LIBCPP_HIDE_FROM_ABI char* str() { return __sb_.str(); } | 
|  |  | 
|  | private: | 
|  | strstreambuf __sb_; // exposition only | 
|  | }; | 
|  |  | 
|  | _LIBCPP_END_NAMESPACE_STD | 
|  |  | 
|  | _LIBCPP_POP_MACROS | 
|  |  | 
|  | #    endif // _LIBCPP_STD_VER < 26 || defined(_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM) || | 
|  | // defined(_LIBCPP_BUILDING_LIBRARY) | 
|  |  | 
|  | #  endif // _LIBCPP_HAS_LOCALIZATION | 
|  |  | 
|  | #endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS) | 
|  |  | 
|  | #endif // _LIBCPP_STRSTREAM |