2
//===------------------------- streambuf ----------------------------------===//
4
// The LLVM Compiler Infrastructure
6
// This file is dual licensed under the MIT and the University of Illinois Open
7
// Source Licenses. See LICENSE.TXT for details.
9
//===----------------------------------------------------------------------===//
11
#ifndef _LIBCPP_STEAMBUF
12
#define _LIBCPP_STEAMBUF
20
template <class charT, class traits = char_traits<charT> >
25
typedef charT char_type;
26
typedef traits traits_type;
27
typedef typename traits_type::int_type int_type;
28
typedef typename traits_type::pos_type pos_type;
29
typedef typename traits_type::off_type off_type;
31
virtual ~basic_streambuf();
33
// 27.6.2.2.1 locales:
34
locale pubimbue(const locale& loc);
35
locale getloc() const;
37
// 27.6.2.2.2 buffer and positioning:
38
basic_streambuf* pubsetbuf(char_type* s, streamsize n);
39
pos_type pubseekoff(off_type off, ios_base::seekdir way,
40
ios_base::openmode which = ios_base::in | ios_base::out);
41
pos_type pubseekpos(pos_type sp,
42
ios_base::openmode which = ios_base::in | ios_base::out);
46
// 27.6.2.2.3 Get area:
47
streamsize in_avail();
51
streamsize sgetn(char_type* s, streamsize n);
53
// 27.6.2.2.4 Putback:
54
int_type sputbackc(char_type c);
57
// 27.6.2.2.5 Put area:
58
int_type sputc(char_type c);
59
streamsize sputn(const char_type* s, streamsize n);
63
basic_streambuf(const basic_streambuf& rhs);
64
basic_streambuf& operator=(const basic_streambuf& rhs);
65
void swap(basic_streambuf& rhs);
67
// 27.6.2.3.2 Get area:
68
char_type* eback() const;
69
char_type* gptr() const;
70
char_type* egptr() const;
72
void setg(char_type* gbeg, char_type* gnext, char_type* gend);
74
// 27.6.2.3.3 Put area:
75
char_type* pbase() const;
76
char_type* pptr() const;
77
char_type* epptr() const;
79
void setp(char_type* pbeg, char_type* pend);
81
// 27.6.2.4 virtual functions:
82
// 27.6.2.4.1 Locales:
83
virtual void imbue(const locale& loc);
85
// 27.6.2.4.2 Buffer management and positioning:
86
virtual basic_streambuf* setbuf(char_type* s, streamsize n);
87
virtual pos_type seekoff(off_type off, ios_base::seekdir way,
88
ios_base::openmode which = ios_base::in | ios_base::out);
89
virtual pos_type seekpos(pos_type sp,
90
ios_base::openmode which = ios_base::in | ios_base::out);
93
// 27.6.2.4.3 Get area:
94
virtual streamsize showmanyc();
95
virtual streamsize xsgetn(char_type* s, streamsize n);
96
virtual int_type underflow();
97
virtual int_type uflow();
99
// 27.6.2.4.4 Putback:
100
virtual int_type pbackfail(int_type c = traits_type::eof());
102
// 27.6.2.4.5 Put area:
103
virtual streamsize xsputn(const char_type* s, streamsize n);
104
virtual int_type overflow (int_type c = traits_type::eof());
115
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
116
#pragma GCC system_header
119
_LIBCPP_BEGIN_NAMESPACE_STD
121
template <class _CharT, class _Traits>
122
class _LIBCPP_TYPE_VIS basic_streambuf
126
typedef _CharT char_type;
127
typedef _Traits traits_type;
128
typedef typename traits_type::int_type int_type;
129
typedef typename traits_type::pos_type pos_type;
130
typedef typename traits_type::off_type off_type;
132
virtual ~basic_streambuf();
134
// 27.6.2.2.1 locales:
135
locale pubimbue(const locale& __loc);
136
locale getloc() const;
138
// 27.6.2.2.2 buffer and positioning:
139
basic_streambuf* pubsetbuf(char_type* __s, streamsize __n);
140
pos_type pubseekoff(off_type __off, ios_base::seekdir __way,
141
ios_base::openmode __which = ios_base::in | ios_base::out);
142
pos_type pubseekpos(pos_type __sp,
143
ios_base::openmode __which = ios_base::in | ios_base::out);
146
// Get and put areas:
147
// 27.6.2.2.3 Get area:
148
streamsize in_avail();
152
streamsize sgetn(char_type* __s, streamsize __n);
154
// 27.6.2.2.4 Putback:
155
int_type sputbackc(char_type __c);
158
// 27.6.2.2.5 Put area:
159
int_type sputc(char_type __c);
160
streamsize sputn(const char_type* __s, streamsize __n);
164
basic_streambuf(const basic_streambuf& __rhs);
165
basic_streambuf& operator=(const basic_streambuf& __rhs);
166
void swap(basic_streambuf& __rhs);
168
// 27.6.2.3.2 Get area:
169
_LIBCPP_ALWAYS_INLINE char_type* eback() const {return __binp_;}
170
_LIBCPP_ALWAYS_INLINE char_type* gptr() const {return __ninp_;}
171
_LIBCPP_ALWAYS_INLINE char_type* egptr() const {return __einp_;}
173
void setg(char_type* __gbeg, char_type* __gnext, char_type* __gend);
175
// 27.6.2.3.3 Put area:
176
_LIBCPP_ALWAYS_INLINE char_type* pbase() const {return __bout_;}
177
_LIBCPP_ALWAYS_INLINE char_type* pptr() const {return __nout_;}
178
_LIBCPP_ALWAYS_INLINE char_type* epptr() const {return __eout_;}
180
void setp(char_type* __pbeg, char_type* __pend);
182
// 27.6.2.4 virtual functions:
183
// 27.6.2.4.1 Locales:
184
virtual void imbue(const locale& __loc);
186
// 27.6.2.4.2 Buffer management and positioning:
187
virtual basic_streambuf* setbuf(char_type* __s, streamsize __n);
188
virtual pos_type seekoff(off_type __off, ios_base::seekdir __way,
189
ios_base::openmode __which = ios_base::in | ios_base::out);
190
virtual pos_type seekpos(pos_type __sp,
191
ios_base::openmode __which = ios_base::in | ios_base::out);
194
// 27.6.2.4.3 Get area:
195
virtual streamsize showmanyc();
196
virtual streamsize xsgetn(char_type* __s, streamsize __n);
197
virtual int_type underflow();
198
virtual int_type uflow();
200
// 27.6.2.4.4 Putback:
201
virtual int_type pbackfail(int_type __c = traits_type::eof());
203
// 27.6.2.4.5 Put area:
204
virtual streamsize xsputn(const char_type* __s, streamsize __n);
205
virtual int_type overflow(int_type __c = traits_type::eof());
217
template <class _CharT, class _Traits>
218
basic_streambuf<_CharT, _Traits>::~basic_streambuf()
222
template <class _CharT, class _Traits>
223
inline _LIBCPP_INLINE_VISIBILITY
225
basic_streambuf<_CharT, _Traits>::pubimbue(const locale& __loc)
233
template <class _CharT, class _Traits>
234
inline _LIBCPP_INLINE_VISIBILITY
236
basic_streambuf<_CharT, _Traits>::getloc() const
241
template <class _CharT, class _Traits>
242
inline _LIBCPP_INLINE_VISIBILITY
243
basic_streambuf<_CharT, _Traits>*
244
basic_streambuf<_CharT, _Traits>::pubsetbuf(char_type* __s, streamsize __n)
246
return setbuf(__s, __n);
249
template <class _CharT, class _Traits>
250
inline _LIBCPP_INLINE_VISIBILITY
251
typename basic_streambuf<_CharT, _Traits>::pos_type
252
basic_streambuf<_CharT, _Traits>::pubseekoff(off_type __off,
253
ios_base::seekdir __way,
254
ios_base::openmode __which)
256
return seekoff(__off, __way, __which);
259
template <class _CharT, class _Traits>
260
inline _LIBCPP_INLINE_VISIBILITY
261
typename basic_streambuf<_CharT, _Traits>::pos_type
262
basic_streambuf<_CharT, _Traits>::pubseekpos(pos_type __sp,
263
ios_base::openmode __which)
265
return seekpos(__sp, __which);
268
template <class _CharT, class _Traits>
269
inline _LIBCPP_INLINE_VISIBILITY
271
basic_streambuf<_CharT, _Traits>::pubsync()
276
template <class _CharT, class _Traits>
277
inline _LIBCPP_INLINE_VISIBILITY
279
basic_streambuf<_CharT, _Traits>::in_avail()
281
if (__ninp_ < __einp_)
282
return static_cast<streamsize>(__einp_ - __ninp_);
286
template <class _CharT, class _Traits>
287
inline _LIBCPP_INLINE_VISIBILITY
288
typename basic_streambuf<_CharT, _Traits>::int_type
289
basic_streambuf<_CharT, _Traits>::snextc()
291
if (sbumpc() == traits_type::eof())
292
return traits_type::eof();
296
template <class _CharT, class _Traits>
297
inline _LIBCPP_INLINE_VISIBILITY
298
typename basic_streambuf<_CharT, _Traits>::int_type
299
basic_streambuf<_CharT, _Traits>::sbumpc()
301
if (__ninp_ == __einp_)
303
return traits_type::to_int_type(*__ninp_++);
306
template <class _CharT, class _Traits>
307
inline _LIBCPP_INLINE_VISIBILITY
308
typename basic_streambuf<_CharT, _Traits>::int_type
309
basic_streambuf<_CharT, _Traits>::sgetc()
311
if (__ninp_ == __einp_)
313
return traits_type::to_int_type(*__ninp_);
316
template <class _CharT, class _Traits>
317
inline _LIBCPP_INLINE_VISIBILITY
319
basic_streambuf<_CharT, _Traits>::sgetn(char_type* __s, streamsize __n)
321
return xsgetn(__s, __n);
324
template <class _CharT, class _Traits>
325
inline _LIBCPP_INLINE_VISIBILITY
326
typename basic_streambuf<_CharT, _Traits>::int_type
327
basic_streambuf<_CharT, _Traits>::sputbackc(char_type __c)
329
if (__binp_ == __ninp_ || !traits_type::eq(__c, __ninp_[-1]))
330
return pbackfail(traits_type::to_int_type(__c));
331
return traits_type::to_int_type(*--__ninp_);
334
template <class _CharT, class _Traits>
335
inline _LIBCPP_INLINE_VISIBILITY
336
typename basic_streambuf<_CharT, _Traits>::int_type
337
basic_streambuf<_CharT, _Traits>::sungetc()
339
if (__binp_ == __ninp_)
341
return traits_type::to_int_type(*--__ninp_);
344
template <class _CharT, class _Traits>
345
inline _LIBCPP_INLINE_VISIBILITY
346
typename basic_streambuf<_CharT, _Traits>::int_type
347
basic_streambuf<_CharT, _Traits>::sputc(char_type __c)
349
if (__nout_ == __eout_)
350
return overflow(traits_type::to_int_type(__c));
352
return traits_type::to_int_type(__c);
355
template <class _CharT, class _Traits>
356
inline _LIBCPP_INLINE_VISIBILITY
358
basic_streambuf<_CharT, _Traits>::sputn(const char_type* __s, streamsize __n)
360
return xsputn(__s, __n);
363
template <class _CharT, class _Traits>
364
basic_streambuf<_CharT, _Traits>::basic_streambuf()
374
template <class _CharT, class _Traits>
375
basic_streambuf<_CharT, _Traits>::basic_streambuf(const basic_streambuf& __sb)
376
: __loc_(__sb.__loc_),
377
__binp_(__sb.__binp_),
378
__ninp_(__sb.__ninp_),
379
__einp_(__sb.__einp_),
380
__bout_(__sb.__bout_),
381
__nout_(__sb.__nout_),
382
__eout_(__sb.__eout_)
386
template <class _CharT, class _Traits>
387
basic_streambuf<_CharT, _Traits>&
388
basic_streambuf<_CharT, _Traits>::operator=(const basic_streambuf& __sb)
390
__loc_ = __sb.__loc_;
391
__binp_ = __sb.__binp_;
392
__ninp_ = __sb.__ninp_;
393
__einp_ = __sb.__einp_;
394
__bout_ = __sb.__bout_;
395
__nout_ = __sb.__nout_;
396
__eout_ = __sb.__eout_;
400
template <class _CharT, class _Traits>
402
basic_streambuf<_CharT, _Traits>::swap(basic_streambuf& __sb)
404
_VSTD::swap(__loc_, __sb.__loc_);
405
_VSTD::swap(__binp_, __sb.__binp_);
406
_VSTD::swap(__ninp_, __sb.__ninp_);
407
_VSTD::swap(__einp_, __sb.__einp_);
408
_VSTD::swap(__bout_, __sb.__bout_);
409
_VSTD::swap(__nout_, __sb.__nout_);
410
_VSTD::swap(__eout_, __sb.__eout_);
413
template <class _CharT, class _Traits>
414
inline _LIBCPP_INLINE_VISIBILITY
416
basic_streambuf<_CharT, _Traits>::gbump(int __n)
421
template <class _CharT, class _Traits>
422
inline _LIBCPP_INLINE_VISIBILITY
424
basic_streambuf<_CharT, _Traits>::setg(char_type* __gbeg, char_type* __gnext,
432
template <class _CharT, class _Traits>
433
inline _LIBCPP_INLINE_VISIBILITY
435
basic_streambuf<_CharT, _Traits>::pbump(int __n)
440
template <class _CharT, class _Traits>
441
inline _LIBCPP_INLINE_VISIBILITY
443
basic_streambuf<_CharT, _Traits>::setp(char_type* __pbeg, char_type* __pend)
445
__bout_ = __nout_ = __pbeg;
449
template <class _CharT, class _Traits>
451
basic_streambuf<_CharT, _Traits>::imbue(const locale&)
455
template <class _CharT, class _Traits>
456
basic_streambuf<_CharT, _Traits>*
457
basic_streambuf<_CharT, _Traits>::setbuf(char_type*, streamsize)
462
template <class _CharT, class _Traits>
463
typename basic_streambuf<_CharT, _Traits>::pos_type
464
basic_streambuf<_CharT, _Traits>::seekoff(off_type, ios_base::seekdir,
467
return pos_type(off_type(-1));
470
template <class _CharT, class _Traits>
471
typename basic_streambuf<_CharT, _Traits>::pos_type
472
basic_streambuf<_CharT, _Traits>::seekpos(pos_type, ios_base::openmode)
474
return pos_type(off_type(-1));
477
template <class _CharT, class _Traits>
479
basic_streambuf<_CharT, _Traits>::sync()
484
template <class _CharT, class _Traits>
486
basic_streambuf<_CharT, _Traits>::showmanyc()
491
template <class _CharT, class _Traits>
493
basic_streambuf<_CharT, _Traits>::xsgetn(char_type* __s, streamsize __n)
495
const int_type __eof = traits_type::eof();
498
for (;__i < __n; ++__i, ++__s)
500
if (__ninp_ < __einp_)
502
else if ((__c = uflow()) != __eof)
503
*__s = traits_type::to_char_type(__c);
510
template <class _CharT, class _Traits>
511
typename basic_streambuf<_CharT, _Traits>::int_type
512
basic_streambuf<_CharT, _Traits>::underflow()
514
return traits_type::eof();
517
template <class _CharT, class _Traits>
518
typename basic_streambuf<_CharT, _Traits>::int_type
519
basic_streambuf<_CharT, _Traits>::uflow()
521
if (underflow() == traits_type::eof())
522
return traits_type::eof();
523
return traits_type::to_int_type(*__ninp_++);
526
template <class _CharT, class _Traits>
527
typename basic_streambuf<_CharT, _Traits>::int_type
528
basic_streambuf<_CharT, _Traits>::pbackfail(int_type)
530
return traits_type::eof();
533
template <class _CharT, class _Traits>
535
basic_streambuf<_CharT, _Traits>::xsputn(const char_type* __s, streamsize __n)
538
int_type __eof = traits_type::eof();
539
for (; __i < __n; ++__s, ++__i)
541
if (__nout_ < __eout_)
543
else if (overflow(traits_type::to_int_type(*__s)) == __eof)
549
template <class _CharT, class _Traits>
550
typename basic_streambuf<_CharT, _Traits>::int_type
551
basic_streambuf<_CharT, _Traits>::overflow(int_type)
553
return traits_type::eof();
556
_LIBCPP_EXTERN_TEMPLATE(class basic_streambuf<char>)
557
_LIBCPP_EXTERN_TEMPLATE(class basic_streambuf<wchar_t>)
559
_LIBCPP_EXTERN_TEMPLATE(class basic_ios<char>)
560
_LIBCPP_EXTERN_TEMPLATE(class basic_ios<wchar_t>)
562
_LIBCPP_END_NAMESPACE_STD
564
#endif // _LIBCPP_STEAMBUF