Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / c++ / strstream @ 14

History | View | Annotate | Download (11 KB)

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