root / lab4 / .minix-src / include / c++ / strstream @ 14
History | View | Annotate | Download (11 KB)
1 | 13 | up20180614 | // -*- 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 |