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