1227825Stheraven// -*- C++ -*- 2227825Stheraven//===--------------------------- strstream --------------------------------===// 3227825Stheraven// 4227825Stheraven// The LLVM Compiler Infrastructure 5227825Stheraven// 6227825Stheraven// This file is dual licensed under the MIT and the University of Illinois Open 7227825Stheraven// Source Licenses. See LICENSE.TXT for details. 8227825Stheraven// 9227825Stheraven//===----------------------------------------------------------------------===// 10227825Stheraven 11227825Stheraven#ifndef _LIBCPP_STRSTREAM 12227825Stheraven#define _LIBCPP_STRSTREAM 13227825Stheraven 14227825Stheraven/* 15227825Stheraven strstream synopsis 16227825Stheraven 17227825Stheravenclass strstreambuf 18227825Stheraven : public basic_streambuf<char> 19227825Stheraven{ 20227825Stheravenpublic: 21227825Stheraven explicit strstreambuf(streamsize alsize_arg = 0); 22227825Stheraven strstreambuf(void* (*palloc_arg)(size_t), void (*pfree_arg)(void*)); 23227825Stheraven strstreambuf(char* gnext_arg, streamsize n, char* pbeg_arg = 0); 24227825Stheraven strstreambuf(const char* gnext_arg, streamsize n); 25227825Stheraven 26227825Stheraven strstreambuf(signed char* gnext_arg, streamsize n, signed char* pbeg_arg = 0); 27227825Stheraven strstreambuf(const signed char* gnext_arg, streamsize n); 28227825Stheraven strstreambuf(unsigned char* gnext_arg, streamsize n, unsigned char* pbeg_arg = 0); 29227825Stheraven strstreambuf(const unsigned char* gnext_arg, streamsize n); 30227825Stheraven 31227825Stheraven strstreambuf(strstreambuf&& rhs); 32227825Stheraven strstreambuf& operator=(strstreambuf&& rhs); 33227825Stheraven 34227825Stheraven virtual ~strstreambuf(); 35227825Stheraven 36227825Stheraven void swap(strstreambuf& rhs); 37227825Stheraven 38227825Stheraven void freeze(bool freezefl = true); 39227825Stheraven char* str(); 40227825Stheraven int pcount() const; 41227825Stheraven 42227825Stheravenprotected: 43227825Stheraven virtual int_type overflow (int_type c = EOF); 44227825Stheraven virtual int_type pbackfail(int_type c = EOF); 45227825Stheraven virtual int_type underflow(); 46227825Stheraven virtual pos_type seekoff(off_type off, ios_base::seekdir way, 47227825Stheraven ios_base::openmode which = ios_base::in | ios_base::out); 48227825Stheraven virtual pos_type seekpos(pos_type sp, 49227825Stheraven ios_base::openmode which = ios_base::in | ios_base::out); 50227825Stheraven virtual streambuf* setbuf(char* s, streamsize n); 51227825Stheraven 52227825Stheravenprivate: 53227825Stheraven typedef T1 strstate; // exposition only 54227825Stheraven static const strstate allocated; // exposition only 55227825Stheraven static const strstate constant; // exposition only 56227825Stheraven static const strstate dynamic; // exposition only 57227825Stheraven static const strstate frozen; // exposition only 58227825Stheraven strstate strmode; // exposition only 59227825Stheraven streamsize alsize; // exposition only 60227825Stheraven void* (*palloc)(size_t); // exposition only 61227825Stheraven void (*pfree)(void*); // exposition only 62227825Stheraven}; 63227825Stheraven 64227825Stheravenclass istrstream 65227825Stheraven : public basic_istream<char> 66227825Stheraven{ 67227825Stheravenpublic: 68227825Stheraven explicit istrstream(const char* s); 69227825Stheraven explicit istrstream(char* s); 70227825Stheraven istrstream(const char* s, streamsize n); 71227825Stheraven istrstream(char* s, streamsize n); 72227825Stheraven 73227825Stheraven virtual ~istrstream(); 74227825Stheraven 75227825Stheraven strstreambuf* rdbuf() const; 76227825Stheraven char *str(); 77227825Stheraven 78227825Stheravenprivate: 79227825Stheraven strstreambuf sb; // exposition only 80227825Stheraven}; 81227825Stheraven 82227825Stheravenclass ostrstream 83227825Stheraven : public basic_ostream<char> 84227825Stheraven{ 85227825Stheravenpublic: 86227825Stheraven ostrstream(); 87227825Stheraven ostrstream(char* s, int n, ios_base::openmode mode = ios_base::out); 88227825Stheraven 89227825Stheraven virtual ~ostrstream(); 90227825Stheraven 91227825Stheraven strstreambuf* rdbuf() const; 92227825Stheraven void freeze(bool freezefl = true); 93227825Stheraven char* str(); 94227825Stheraven int pcount() const; 95227825Stheraven 96227825Stheravenprivate: 97227825Stheraven strstreambuf sb; // exposition only 98227825Stheraven}; 99227825Stheraven 100227825Stheravenclass strstream 101227825Stheraven : public basic_iostream<char> 102227825Stheraven{ 103227825Stheravenpublic: 104227825Stheraven // Types 105227825Stheraven typedef char char_type; 106227825Stheraven typedef char_traits<char>::int_type int_type; 107227825Stheraven typedef char_traits<char>::pos_type pos_type; 108227825Stheraven typedef char_traits<char>::off_type off_type; 109227825Stheraven 110227825Stheraven // constructors/destructor 111227825Stheraven strstream(); 112227825Stheraven strstream(char* s, int n, ios_base::openmode mode = ios_base::in | ios_base::out); 113227825Stheraven 114227825Stheraven virtual ~strstream(); 115227825Stheraven 116227825Stheraven // Members: 117227825Stheraven strstreambuf* rdbuf() const; 118227825Stheraven void freeze(bool freezefl = true); 119227825Stheraven int pcount() const; 120227825Stheraven char* str(); 121227825Stheraven 122227825Stheravenprivate: 123227825Stheraven strstreambuf sb; // exposition only 124227825Stheraven}; 125227825Stheraven 126227825Stheraven} // std 127227825Stheraven 128227825Stheraven*/ 129227825Stheraven 130227825Stheraven#include <__config> 131227825Stheraven#include <ostream> 132227825Stheraven#include <istream> 133227825Stheraven 134227825Stheraven#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 135227825Stheraven#pragma GCC system_header 136227825Stheraven#endif 137227825Stheraven 138227825Stheraven_LIBCPP_BEGIN_NAMESPACE_STD 139227825Stheraven 140250514Sdimclass _LIBCPP_TYPE_VIS strstreambuf 141227825Stheraven : public streambuf 142227825Stheraven{ 143227825Stheravenpublic: 144227825Stheraven explicit strstreambuf(streamsize __alsize = 0); 145227825Stheraven strstreambuf(void* (*__palloc)(size_t), void (*__pfree)(void*)); 146227825Stheraven strstreambuf(char* __gnext, streamsize __n, char* __pbeg = 0); 147227825Stheraven strstreambuf(const char* __gnext, streamsize __n); 148227825Stheraven 149227825Stheraven strstreambuf(signed char* __gnext, streamsize __n, signed char* __pbeg = 0); 150227825Stheraven strstreambuf(const signed char* __gnext, streamsize __n); 151227825Stheraven strstreambuf(unsigned char* __gnext, streamsize __n, unsigned char* __pbeg = 0); 152227825Stheraven strstreambuf(const unsigned char* __gnext, streamsize __n); 153227825Stheraven 154227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 155227825Stheraven _LIBCPP_INLINE_VISIBILITY 156227825Stheraven strstreambuf(strstreambuf&& __rhs); 157227825Stheraven _LIBCPP_INLINE_VISIBILITY 158227825Stheraven strstreambuf& operator=(strstreambuf&& __rhs); 159227825Stheraven#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 160227825Stheraven 161227825Stheraven virtual ~strstreambuf(); 162227825Stheraven 163227825Stheraven void swap(strstreambuf& __rhs); 164227825Stheraven 165227825Stheraven void freeze(bool __freezefl = true); 166227825Stheraven char* str(); 167227825Stheraven int pcount() const; 168227825Stheraven 169227825Stheravenprotected: 170227825Stheraven virtual int_type overflow (int_type __c = EOF); 171227825Stheraven virtual int_type pbackfail(int_type __c = EOF); 172227825Stheraven virtual int_type underflow(); 173227825Stheraven virtual pos_type seekoff(off_type __off, ios_base::seekdir __way, 174227825Stheraven ios_base::openmode __which = ios_base::in | ios_base::out); 175227825Stheraven virtual pos_type seekpos(pos_type __sp, 176227825Stheraven ios_base::openmode __which = ios_base::in | ios_base::out); 177227825Stheraven 178227825Stheravenprivate: 179227825Stheraven typedef unsigned __mode_type; 180227825Stheraven static const __mode_type __allocated = 0x01; 181227825Stheraven static const __mode_type __constant = 0x02; 182227825Stheraven static const __mode_type __dynamic = 0x04; 183227825Stheraven static const __mode_type __frozen = 0x08; 184227825Stheraven static const streamsize __default_alsize = 4096; 185227825Stheraven 186227825Stheraven __mode_type __strmode_; 187227825Stheraven streamsize __alsize_; 188227825Stheraven void* (*__palloc_)(size_t); 189227825Stheraven void (*__pfree_)(void*); 190227825Stheraven 191227825Stheraven void __init(char* __gnext, streamsize __n, char* __pbeg); 192227825Stheraven}; 193227825Stheraven 194227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 195227825Stheraven 196227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 197227825Stheravenstrstreambuf::strstreambuf(strstreambuf&& __rhs) 198227825Stheraven : streambuf(__rhs), 199227825Stheraven __strmode_(__rhs.__strmode_), 200227825Stheraven __alsize_(__rhs.__alsize_), 201227825Stheraven __palloc_(__rhs.__palloc_), 202227825Stheraven __pfree_(__rhs.__pfree_) 203227825Stheraven{ 204227825Stheraven __rhs.setg(nullptr, nullptr, nullptr); 205227825Stheraven __rhs.setp(nullptr, nullptr); 206227825Stheraven} 207227825Stheraven 208227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 209227825Stheravenstrstreambuf& 210227825Stheravenstrstreambuf::operator=(strstreambuf&& __rhs) 211227825Stheraven{ 212227825Stheraven if (eback() && (__strmode_ & __allocated) != 0 && (__strmode_ & __frozen) == 0) 213227825Stheraven { 214227825Stheraven if (__pfree_) 215227825Stheraven __pfree_(eback()); 216227825Stheraven else 217227825Stheraven delete [] eback(); 218227825Stheraven } 219227825Stheraven streambuf::operator=(__rhs); 220227825Stheraven __strmode_ = __rhs.__strmode_; 221227825Stheraven __alsize_ = __rhs.__alsize_; 222227825Stheraven __palloc_ = __rhs.__palloc_; 223227825Stheraven __pfree_ = __rhs.__pfree_; 224227825Stheraven __rhs.setg(nullptr, nullptr, nullptr); 225227825Stheraven __rhs.setp(nullptr, nullptr); 226227825Stheraven return *this; 227227825Stheraven} 228227825Stheraven 229227825Stheraven#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 230227825Stheraven 231250514Sdimclass _LIBCPP_TYPE_VIS istrstream 232227825Stheraven : public istream 233227825Stheraven{ 234227825Stheravenpublic: 235227825Stheraven _LIBCPP_INLINE_VISIBILITY 236227825Stheraven explicit istrstream(const char* __s) 237227825Stheraven : istream(&__sb_), __sb_(__s, 0) {} 238227825Stheraven _LIBCPP_INLINE_VISIBILITY 239227825Stheraven explicit istrstream(char* __s) 240227825Stheraven : istream(&__sb_), __sb_(__s, 0) {} 241227825Stheraven _LIBCPP_INLINE_VISIBILITY 242227825Stheraven istrstream(const char* __s, streamsize __n) 243227825Stheraven : istream(&__sb_), __sb_(__s, __n) {} 244227825Stheraven _LIBCPP_INLINE_VISIBILITY 245227825Stheraven istrstream(char* __s, streamsize __n) 246227825Stheraven : istream(&__sb_), __sb_(__s, __n) {} 247227825Stheraven 248227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 249227825Stheraven _LIBCPP_INLINE_VISIBILITY 250227825Stheraven istrstream(istrstream&& __rhs) 251227825Stheraven : istream(_VSTD::move(__rhs)), 252227825Stheraven __sb_(_VSTD::move(__rhs.__sb_)) 253227825Stheraven { 254227825Stheraven istream::set_rdbuf(&__sb_); 255227825Stheraven } 256227825Stheraven 257227825Stheraven _LIBCPP_INLINE_VISIBILITY 258227825Stheraven istrstream& operator=(istrstream&& __rhs) 259227825Stheraven { 260227825Stheraven istream::operator=(_VSTD::move(__rhs)); 261227825Stheraven __sb_ = _VSTD::move(__rhs.__sb_); 262227825Stheraven return *this; 263227825Stheraven } 264227825Stheraven#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 265227825Stheraven 266227825Stheraven virtual ~istrstream(); 267227825Stheraven 268227825Stheraven _LIBCPP_INLINE_VISIBILITY 269227825Stheraven void swap(istrstream& __rhs) 270227825Stheraven { 271227825Stheraven istream::swap(__rhs); 272227825Stheraven __sb_.swap(__rhs.__sb_); 273227825Stheraven } 274227825Stheraven 275227825Stheraven _LIBCPP_INLINE_VISIBILITY 276227825Stheraven strstreambuf* rdbuf() const {return const_cast<strstreambuf*>(&__sb_);} 277227825Stheraven _LIBCPP_INLINE_VISIBILITY 278227825Stheraven char *str() {return __sb_.str();} 279227825Stheraven 280227825Stheravenprivate: 281227825Stheraven strstreambuf __sb_; 282227825Stheraven}; 283227825Stheraven 284250514Sdimclass _LIBCPP_TYPE_VIS ostrstream 285227825Stheraven : public ostream 286227825Stheraven{ 287227825Stheravenpublic: 288227825Stheraven _LIBCPP_INLINE_VISIBILITY 289227825Stheraven ostrstream() 290227825Stheraven : ostream(&__sb_) {} 291227825Stheraven _LIBCPP_INLINE_VISIBILITY 292227825Stheraven ostrstream(char* __s, int __n, ios_base::openmode __mode = ios_base::out) 293227825Stheraven : ostream(&__sb_), 294227825Stheraven __sb_(__s, __n, __s + (__mode & ios::app ? strlen(__s) : 0)) 295227825Stheraven {} 296227825Stheraven 297227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 298227825Stheraven _LIBCPP_INLINE_VISIBILITY 299227825Stheraven ostrstream(ostrstream&& __rhs) 300227825Stheraven : ostream(_VSTD::move(__rhs)), 301227825Stheraven __sb_(_VSTD::move(__rhs.__sb_)) 302227825Stheraven { 303227825Stheraven ostream::set_rdbuf(&__sb_); 304227825Stheraven } 305227825Stheraven 306227825Stheraven _LIBCPP_INLINE_VISIBILITY 307227825Stheraven ostrstream& operator=(ostrstream&& __rhs) 308227825Stheraven { 309227825Stheraven ostream::operator=(_VSTD::move(__rhs)); 310227825Stheraven __sb_ = _VSTD::move(__rhs.__sb_); 311227825Stheraven return *this; 312227825Stheraven } 313227825Stheraven#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 314227825Stheraven 315227825Stheraven virtual ~ostrstream(); 316227825Stheraven 317227825Stheraven _LIBCPP_INLINE_VISIBILITY 318227825Stheraven void swap(ostrstream& __rhs) 319227825Stheraven { 320227825Stheraven ostream::swap(__rhs); 321227825Stheraven __sb_.swap(__rhs.__sb_); 322227825Stheraven } 323227825Stheraven 324227825Stheraven _LIBCPP_INLINE_VISIBILITY 325227825Stheraven strstreambuf* rdbuf() const {return const_cast<strstreambuf*>(&__sb_);} 326227825Stheraven _LIBCPP_INLINE_VISIBILITY 327227825Stheraven void freeze(bool __freezefl = true) {__sb_.freeze(__freezefl);} 328227825Stheraven _LIBCPP_INLINE_VISIBILITY 329227825Stheraven char* str() {return __sb_.str();} 330227825Stheraven _LIBCPP_INLINE_VISIBILITY 331227825Stheraven int pcount() const {return __sb_.pcount();} 332227825Stheraven 333227825Stheravenprivate: 334227825Stheraven strstreambuf __sb_; // exposition only 335227825Stheraven}; 336227825Stheraven 337250514Sdimclass _LIBCPP_TYPE_VIS strstream 338227825Stheraven : public iostream 339227825Stheraven{ 340227825Stheravenpublic: 341227825Stheraven // Types 342227825Stheraven typedef char char_type; 343227825Stheraven typedef char_traits<char>::int_type int_type; 344227825Stheraven typedef char_traits<char>::pos_type pos_type; 345227825Stheraven typedef char_traits<char>::off_type off_type; 346227825Stheraven 347227825Stheraven // constructors/destructor 348227825Stheraven _LIBCPP_INLINE_VISIBILITY 349227825Stheraven strstream() 350227825Stheraven : iostream(&__sb_) {} 351227825Stheraven _LIBCPP_INLINE_VISIBILITY 352227825Stheraven strstream(char* __s, int __n, ios_base::openmode __mode = ios_base::in | ios_base::out) 353227825Stheraven : iostream(&__sb_), 354227825Stheraven __sb_(__s, __n, __s + (__mode & ios::app ? strlen(__s) : 0)) 355227825Stheraven {} 356227825Stheraven 357227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 358227825Stheraven _LIBCPP_INLINE_VISIBILITY 359227825Stheraven strstream(strstream&& __rhs) 360227825Stheraven : iostream(_VSTD::move(__rhs)), 361227825Stheraven __sb_(_VSTD::move(__rhs.__sb_)) 362227825Stheraven { 363227825Stheraven iostream::set_rdbuf(&__sb_); 364227825Stheraven } 365227825Stheraven 366227825Stheraven _LIBCPP_INLINE_VISIBILITY 367227825Stheraven strstream& operator=(strstream&& __rhs) 368227825Stheraven { 369227825Stheraven iostream::operator=(_VSTD::move(__rhs)); 370227825Stheraven __sb_ = _VSTD::move(__rhs.__sb_); 371227825Stheraven return *this; 372227825Stheraven } 373227825Stheraven#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 374227825Stheraven 375227825Stheraven virtual ~strstream(); 376227825Stheraven 377227825Stheraven _LIBCPP_INLINE_VISIBILITY 378227825Stheraven void swap(strstream& __rhs) 379227825Stheraven { 380227825Stheraven iostream::swap(__rhs); 381227825Stheraven __sb_.swap(__rhs.__sb_); 382227825Stheraven } 383227825Stheraven 384227825Stheraven // Members: 385227825Stheraven _LIBCPP_INLINE_VISIBILITY 386227825Stheraven strstreambuf* rdbuf() const {return const_cast<strstreambuf*>(&__sb_);} 387227825Stheraven _LIBCPP_INLINE_VISIBILITY 388227825Stheraven void freeze(bool __freezefl = true) {__sb_.freeze(__freezefl);} 389227825Stheraven _LIBCPP_INLINE_VISIBILITY 390227825Stheraven int pcount() const {return __sb_.pcount();} 391227825Stheraven _LIBCPP_INLINE_VISIBILITY 392227825Stheraven char* str() {return __sb_.str();} 393227825Stheraven 394227825Stheravenprivate: 395227825Stheraven strstreambuf __sb_; // exposition only 396227825Stheraven}; 397227825Stheraven 398227825Stheraven_LIBCPP_END_NAMESPACE_STD 399227825Stheraven 400227825Stheraven#endif // _LIBCPP_STRSTREAM 401