]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/libc++/include/strstream
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / libc++ / include / strstream
1 // -*- C++ -*-
2 //===--------------------------- strstream --------------------------------===//
3 //
4 //                     The LLVM Compiler Infrastructure
5 //
6 // This file is dual licensed under the MIT and the University of Illinois Open
7 // Source Licenses. See LICENSE.TXT for details.
8 //
9 //===----------------------------------------------------------------------===//
10
11 #ifndef _LIBCPP_STRSTREAM
12 #define _LIBCPP_STRSTREAM
13
14 /*
15     strstream synopsis
16
17 class strstreambuf
18     : public basic_streambuf<char>
19 {
20 public:
21     explicit strstreambuf(streamsize alsize_arg = 0);
22     strstreambuf(void* (*palloc_arg)(size_t), void (*pfree_arg)(void*));
23     strstreambuf(char* gnext_arg, streamsize n, char* pbeg_arg = 0);
24     strstreambuf(const char* gnext_arg, streamsize n);
25
26     strstreambuf(signed char* gnext_arg, streamsize n, signed char* pbeg_arg = 0);
27     strstreambuf(const signed char* gnext_arg, streamsize n);
28     strstreambuf(unsigned char* gnext_arg, streamsize n, unsigned char* pbeg_arg = 0);
29     strstreambuf(const unsigned char* gnext_arg, streamsize n);
30
31     strstreambuf(strstreambuf&& rhs);
32     strstreambuf& operator=(strstreambuf&& rhs);
33
34     virtual ~strstreambuf();
35
36     void swap(strstreambuf& rhs);
37
38     void freeze(bool freezefl = true);
39     char* str();
40     int pcount() const;
41
42 protected:
43     virtual int_type overflow (int_type c = EOF);
44     virtual int_type pbackfail(int_type c = EOF);
45     virtual int_type underflow();
46     virtual pos_type seekoff(off_type off, ios_base::seekdir way,
47                              ios_base::openmode which = ios_base::in | ios_base::out);
48     virtual pos_type seekpos(pos_type sp,
49                              ios_base::openmode which = ios_base::in | ios_base::out);
50     virtual streambuf* setbuf(char* s, streamsize n);
51
52 private:
53     typedef T1 strstate;                // exposition only
54     static const strstate allocated;    // exposition only
55     static const strstate constant;     // exposition only
56     static const strstate dynamic;      // exposition only
57     static const strstate frozen;       // exposition only
58     strstate strmode;                   // exposition only
59     streamsize alsize;                  // exposition only
60     void* (*palloc)(size_t);            // exposition only
61     void (*pfree)(void*);               // exposition only
62 };
63
64 class istrstream
65     : public basic_istream<char>
66 {
67 public:
68     explicit istrstream(const char* s);
69     explicit istrstream(char* s);
70     istrstream(const char* s, streamsize n);
71     istrstream(char* s, streamsize n);
72
73     virtual ~istrstream();
74
75     strstreambuf* rdbuf() const;
76     char *str();
77
78 private:
79     strstreambuf sb; // exposition only
80 };
81
82 class ostrstream
83     : public basic_ostream<char>
84 {
85 public:
86     ostrstream();
87     ostrstream(char* s, int n, ios_base::openmode mode = ios_base::out);
88
89     virtual ~ostrstream();
90
91     strstreambuf* rdbuf() const;
92     void freeze(bool freezefl = true);
93     char* str();
94     int pcount() const;
95
96 private:
97     strstreambuf sb; // exposition only
98 };
99
100 class strstream
101     : public basic_iostream<char>
102 {
103 public:
104     // Types
105     typedef char                        char_type;
106     typedef char_traits<char>::int_type int_type;
107     typedef char_traits<char>::pos_type pos_type;
108     typedef char_traits<char>::off_type off_type;
109
110     // constructors/destructor
111     strstream();
112     strstream(char* s, int n, ios_base::openmode mode = ios_base::in | ios_base::out);
113
114     virtual ~strstream();
115
116     // Members:
117     strstreambuf* rdbuf() const;
118     void freeze(bool freezefl = true);
119     int pcount() const;
120     char* str();
121
122 private:
123     strstreambuf sb; // exposition only
124 };
125
126 }  // std
127
128 */
129
130 #include <__config>
131 #include <ostream>
132 #include <istream>
133
134 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
135 #pragma GCC system_header
136 #endif
137
138 _LIBCPP_BEGIN_NAMESPACE_STD
139
140 class _LIBCPP_TYPE_VIS strstreambuf
141     : public streambuf
142 {
143 public:
144     explicit strstreambuf(streamsize __alsize = 0);
145     strstreambuf(void* (*__palloc)(size_t), void (*__pfree)(void*));
146     strstreambuf(char* __gnext, streamsize __n, char* __pbeg = 0);
147     strstreambuf(const char* __gnext, streamsize __n);
148
149     strstreambuf(signed char* __gnext, streamsize __n, signed char* __pbeg = 0);
150     strstreambuf(const signed char* __gnext, streamsize __n);
151     strstreambuf(unsigned char* __gnext, streamsize __n, unsigned char* __pbeg = 0);
152     strstreambuf(const unsigned char* __gnext, streamsize __n);
153
154 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
155     _LIBCPP_INLINE_VISIBILITY
156     strstreambuf(strstreambuf&& __rhs);
157     _LIBCPP_INLINE_VISIBILITY
158     strstreambuf& operator=(strstreambuf&& __rhs);
159 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
160
161     virtual ~strstreambuf();
162
163     void swap(strstreambuf& __rhs);
164
165     void freeze(bool __freezefl = true);
166     char* str();
167     int pcount() const;
168
169 protected:
170     virtual int_type overflow (int_type __c = EOF);
171     virtual int_type pbackfail(int_type __c = EOF);
172     virtual int_type underflow();
173     virtual pos_type seekoff(off_type __off, ios_base::seekdir __way,
174                              ios_base::openmode __which = ios_base::in | ios_base::out);
175     virtual pos_type seekpos(pos_type __sp,
176                              ios_base::openmode __which = ios_base::in | ios_base::out);
177
178 private:
179     typedef unsigned __mode_type;
180     static const __mode_type __allocated = 0x01;
181     static const __mode_type __constant  = 0x02;
182     static const __mode_type __dynamic   = 0x04;
183     static const __mode_type __frozen    = 0x08;
184     static const streamsize    __default_alsize = 4096;
185
186     __mode_type __strmode_;
187     streamsize __alsize_;
188     void* (*__palloc_)(size_t);
189     void (*__pfree_)(void*);
190
191     void __init(char* __gnext, streamsize __n, char* __pbeg);
192 };
193
194 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
195
196 inline _LIBCPP_INLINE_VISIBILITY
197 strstreambuf::strstreambuf(strstreambuf&& __rhs)
198     : streambuf(__rhs),
199       __strmode_(__rhs.__strmode_),
200       __alsize_(__rhs.__alsize_),
201       __palloc_(__rhs.__palloc_),
202       __pfree_(__rhs.__pfree_)
203 {
204     __rhs.setg(nullptr, nullptr, nullptr);
205     __rhs.setp(nullptr, nullptr);
206 }
207
208 inline _LIBCPP_INLINE_VISIBILITY
209 strstreambuf&
210 strstreambuf::operator=(strstreambuf&& __rhs)
211 {
212     if (eback() && (__strmode_ & __allocated) != 0 && (__strmode_ & __frozen) == 0)
213     {
214         if (__pfree_)
215             __pfree_(eback());
216         else
217             delete [] eback();
218     }
219     streambuf::operator=(__rhs);
220     __strmode_ = __rhs.__strmode_;
221     __alsize_ = __rhs.__alsize_;
222     __palloc_ = __rhs.__palloc_;
223     __pfree_ = __rhs.__pfree_;
224     __rhs.setg(nullptr, nullptr, nullptr);
225     __rhs.setp(nullptr, nullptr);
226     return *this;
227 }
228
229 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
230
231 class _LIBCPP_TYPE_VIS istrstream
232     : public istream
233 {
234 public:
235     _LIBCPP_INLINE_VISIBILITY
236     explicit istrstream(const char* __s)
237         : istream(&__sb_), __sb_(__s, 0) {}
238     _LIBCPP_INLINE_VISIBILITY
239     explicit istrstream(char* __s)
240         : istream(&__sb_), __sb_(__s, 0) {}
241     _LIBCPP_INLINE_VISIBILITY
242     istrstream(const char* __s, streamsize __n)
243         : istream(&__sb_), __sb_(__s, __n) {}
244     _LIBCPP_INLINE_VISIBILITY
245     istrstream(char* __s, streamsize __n)
246         : istream(&__sb_), __sb_(__s, __n) {}
247
248 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
249     _LIBCPP_INLINE_VISIBILITY
250     istrstream(istrstream&& __rhs)
251         : istream(_VSTD::move(__rhs)),
252           __sb_(_VSTD::move(__rhs.__sb_))
253     {
254         istream::set_rdbuf(&__sb_);
255     }
256
257     _LIBCPP_INLINE_VISIBILITY
258     istrstream& operator=(istrstream&& __rhs)
259     {
260         istream::operator=(_VSTD::move(__rhs));
261         __sb_ = _VSTD::move(__rhs.__sb_);
262         return *this;
263     }
264 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
265
266     virtual ~istrstream();
267
268     _LIBCPP_INLINE_VISIBILITY
269     void swap(istrstream& __rhs)
270     {
271         istream::swap(__rhs);
272         __sb_.swap(__rhs.__sb_);
273     }
274
275     _LIBCPP_INLINE_VISIBILITY
276     strstreambuf* rdbuf() const {return const_cast<strstreambuf*>(&__sb_);}
277     _LIBCPP_INLINE_VISIBILITY
278     char *str() {return __sb_.str();}
279
280 private:
281     strstreambuf __sb_;
282 };
283
284 class _LIBCPP_TYPE_VIS ostrstream
285     : public ostream
286 {
287 public:
288     _LIBCPP_INLINE_VISIBILITY
289     ostrstream()
290         : ostream(&__sb_) {}
291     _LIBCPP_INLINE_VISIBILITY
292     ostrstream(char* __s, int __n, ios_base::openmode __mode = ios_base::out)
293         : ostream(&__sb_),
294           __sb_(__s, __n, __s + (__mode & ios::app ? strlen(__s) : 0))
295         {}
296
297 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
298     _LIBCPP_INLINE_VISIBILITY
299     ostrstream(ostrstream&& __rhs)
300         : ostream(_VSTD::move(__rhs)),
301           __sb_(_VSTD::move(__rhs.__sb_))
302     {
303         ostream::set_rdbuf(&__sb_);
304     }
305
306     _LIBCPP_INLINE_VISIBILITY
307     ostrstream& operator=(ostrstream&& __rhs)
308     {
309         ostream::operator=(_VSTD::move(__rhs));
310         __sb_ = _VSTD::move(__rhs.__sb_);
311         return *this;
312     }
313 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
314
315     virtual ~ostrstream();
316
317     _LIBCPP_INLINE_VISIBILITY
318     void swap(ostrstream& __rhs)
319     {
320         ostream::swap(__rhs);
321         __sb_.swap(__rhs.__sb_);
322     }
323
324     _LIBCPP_INLINE_VISIBILITY
325     strstreambuf* rdbuf() const {return const_cast<strstreambuf*>(&__sb_);}
326     _LIBCPP_INLINE_VISIBILITY
327     void freeze(bool __freezefl = true) {__sb_.freeze(__freezefl);}
328     _LIBCPP_INLINE_VISIBILITY
329     char* str()         {return __sb_.str();}
330     _LIBCPP_INLINE_VISIBILITY
331     int pcount() const  {return __sb_.pcount();}
332
333 private:
334     strstreambuf __sb_; // exposition only
335 };
336
337 class _LIBCPP_TYPE_VIS strstream
338     : public iostream
339 {
340 public:
341     // Types
342     typedef char                        char_type;
343     typedef char_traits<char>::int_type int_type;
344     typedef char_traits<char>::pos_type pos_type;
345     typedef char_traits<char>::off_type off_type;
346
347     // constructors/destructor
348     _LIBCPP_INLINE_VISIBILITY
349     strstream()
350         : iostream(&__sb_) {}
351     _LIBCPP_INLINE_VISIBILITY
352     strstream(char* __s, int __n, ios_base::openmode __mode = ios_base::in | ios_base::out)
353         : iostream(&__sb_),
354           __sb_(__s, __n, __s + (__mode & ios::app ? strlen(__s) : 0))
355         {}
356
357 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
358     _LIBCPP_INLINE_VISIBILITY
359     strstream(strstream&& __rhs)
360         : iostream(_VSTD::move(__rhs)),
361           __sb_(_VSTD::move(__rhs.__sb_))
362     {
363         iostream::set_rdbuf(&__sb_);
364     }
365
366     _LIBCPP_INLINE_VISIBILITY
367     strstream& operator=(strstream&& __rhs)
368     {
369         iostream::operator=(_VSTD::move(__rhs));
370         __sb_ = _VSTD::move(__rhs.__sb_);
371         return *this;
372     }
373 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
374
375     virtual ~strstream();
376
377     _LIBCPP_INLINE_VISIBILITY
378     void swap(strstream& __rhs)
379     {
380         iostream::swap(__rhs);
381         __sb_.swap(__rhs.__sb_);
382     }
383
384     // Members:
385     _LIBCPP_INLINE_VISIBILITY
386     strstreambuf* rdbuf() const {return const_cast<strstreambuf*>(&__sb_);}
387     _LIBCPP_INLINE_VISIBILITY
388     void freeze(bool __freezefl = true) {__sb_.freeze(__freezefl);}
389     _LIBCPP_INLINE_VISIBILITY
390     int pcount() const {return __sb_.pcount();}
391     _LIBCPP_INLINE_VISIBILITY
392     char* str()        {return __sb_.str();}
393
394 private:
395     strstreambuf __sb_; // exposition only
396 };
397
398 _LIBCPP_END_NAMESPACE_STD
399
400 #endif  // _LIBCPP_STRSTREAM