@@ -146,7 +146,7 @@ public:
146
146
static_assert (is_same<_CharT, typename traits_type::char_type>::value,
147
147
" traits_type::char_type must be the same type as CharT" );
148
148
149
- virtual ~basic_streambuf ();
149
+ virtual ~basic_streambuf () {}
150
150
151
151
// 27.6.2.2.1 locales:
152
152
inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 locale pubimbue (const locale& __loc) {
@@ -229,10 +229,36 @@ public:
229
229
}
230
230
231
231
protected:
232
- basic_streambuf ();
233
- basic_streambuf (const basic_streambuf& __rhs);
234
- basic_streambuf& operator =(const basic_streambuf& __rhs);
235
- void swap (basic_streambuf& __rhs);
232
+ basic_streambuf () {}
233
+ basic_streambuf (const basic_streambuf& __sb)
234
+ : __loc_(__sb.__loc_),
235
+ __binp_ (__sb.__binp_),
236
+ __ninp_(__sb.__ninp_),
237
+ __einp_(__sb.__einp_),
238
+ __bout_(__sb.__bout_),
239
+ __nout_(__sb.__nout_),
240
+ __eout_(__sb.__eout_) {}
241
+
242
+ basic_streambuf& operator =(const basic_streambuf& __sb) {
243
+ __loc_ = __sb.__loc_ ;
244
+ __binp_ = __sb.__binp_ ;
245
+ __ninp_ = __sb.__ninp_ ;
246
+ __einp_ = __sb.__einp_ ;
247
+ __bout_ = __sb.__bout_ ;
248
+ __nout_ = __sb.__nout_ ;
249
+ __eout_ = __sb.__eout_ ;
250
+ return *this ;
251
+ }
252
+
253
+ void swap (basic_streambuf& __sb) {
254
+ std::swap (__loc_, __sb.__loc_ );
255
+ std::swap (__binp_, __sb.__binp_ );
256
+ std::swap (__ninp_, __sb.__ninp_ );
257
+ std::swap (__einp_, __sb.__einp_ );
258
+ std::swap (__bout_, __sb.__bout_ );
259
+ std::swap (__nout_, __sb.__nout_ );
260
+ std::swap (__eout_, __sb.__eout_ );
261
+ }
236
262
237
263
// 27.6.2.3.2 Get area:
238
264
_LIBCPP_HIDE_FROM_ABI char_type* eback () const { return __binp_; }
@@ -267,173 +293,85 @@ protected:
267
293
268
294
// 27.6.2.4 virtual functions:
269
295
// 27.6.2.4.1 Locales:
270
- virtual void imbue (const locale& __loc);
296
+ virtual void imbue (const locale&) {}
271
297
272
298
// 27.6.2.4.2 Buffer management and positioning:
273
- virtual basic_streambuf* setbuf (char_type* __s, streamsize __n);
274
- virtual pos_type
275
- seekoff (off_type __off, ios_base::seekdir __way, ios_base::openmode __which = ios_base::in | ios_base::out);
276
- virtual pos_type seekpos (pos_type __sp, ios_base::openmode __which = ios_base::in | ios_base::out);
277
- virtual int sync ();
299
+ virtual basic_streambuf* setbuf (char_type*, streamsize) { return this ; }
300
+ virtual pos_type seekoff (off_type, ios_base::seekdir, ios_base::openmode = ios_base::in | ios_base::out) {
301
+ return pos_type (off_type (-1 ));
302
+ }
303
+ virtual pos_type seekpos (pos_type, ios_base::openmode = ios_base::in | ios_base::out) {
304
+ return pos_type (off_type (-1 ));
305
+ }
306
+ virtual int sync () { return 0 ; }
278
307
279
308
// 27.6.2.4.3 Get area:
280
- virtual streamsize showmanyc ();
281
- virtual streamsize xsgetn (char_type* __s, streamsize __n);
282
- virtual int_type underflow ();
283
- virtual int_type uflow ();
309
+ virtual streamsize showmanyc () { return 0 ; }
310
+
311
+ virtual streamsize xsgetn (char_type* __s, streamsize __n) {
312
+ const int_type __eof = traits_type::eof ();
313
+ int_type __c;
314
+ streamsize __i = 0 ;
315
+ while (__i < __n) {
316
+ if (__ninp_ < __einp_) {
317
+ const streamsize __len = std::min (static_cast <streamsize>(INT_MAX), std::min (__einp_ - __ninp_, __n - __i));
318
+ traits_type::copy (__s, __ninp_, __len);
319
+ __s += __len;
320
+ __i += __len;
321
+ this ->gbump (__len);
322
+ } else if ((__c = uflow ()) != __eof) {
323
+ *__s = traits_type::to_char_type (__c);
324
+ ++__s;
325
+ ++__i;
326
+ } else
327
+ break ;
328
+ }
329
+ return __i;
330
+ }
331
+
332
+ virtual int_type underflow () { return traits_type::eof (); }
333
+ virtual int_type uflow () {
334
+ if (underflow () == traits_type::eof ())
335
+ return traits_type::eof ();
336
+ return traits_type::to_int_type (*__ninp_++);
337
+ }
284
338
285
339
// 27.6.2.4.4 Putback:
286
- virtual int_type pbackfail (int_type __c = traits_type::eof());
340
+ virtual int_type pbackfail (int_type = traits_type::eof()) { return traits_type::eof (); }
287
341
288
342
// 27.6.2.4.5 Put area:
289
- virtual streamsize xsputn (const char_type* __s, streamsize __n);
290
- virtual int_type overflow (int_type __c = traits_type::eof());
343
+ virtual streamsize xsputn (const char_type* __s, streamsize __n) {
344
+ streamsize __i = 0 ;
345
+ int_type __eof = traits_type::eof ();
346
+ while (__i < __n) {
347
+ if (__nout_ >= __eout_) {
348
+ if (overflow (traits_type::to_int_type (*__s)) == __eof)
349
+ break ;
350
+ ++__s;
351
+ ++__i;
352
+ } else {
353
+ streamsize __chunk_size = std::min (__eout_ - __nout_, __n - __i);
354
+ traits_type::copy (__nout_, __s, __chunk_size);
355
+ __nout_ += __chunk_size;
356
+ __s += __chunk_size;
357
+ __i += __chunk_size;
358
+ }
359
+ }
360
+ return __i;
361
+ }
362
+
363
+ virtual int_type overflow (int_type = traits_type::eof()) { return traits_type::eof (); }
291
364
292
365
private:
293
366
locale __loc_;
294
- char_type* __binp_;
295
- char_type* __ninp_;
296
- char_type* __einp_;
297
- char_type* __bout_;
298
- char_type* __nout_;
299
- char_type* __eout_;
367
+ char_type* __binp_ = nullptr ;
368
+ char_type* __ninp_ = nullptr ;
369
+ char_type* __einp_ = nullptr ;
370
+ char_type* __bout_ = nullptr ;
371
+ char_type* __nout_ = nullptr ;
372
+ char_type* __eout_ = nullptr ;
300
373
};
301
374
302
- template <class _CharT , class _Traits >
303
- basic_streambuf<_CharT, _Traits>::~basic_streambuf () {}
304
-
305
- template <class _CharT , class _Traits >
306
- basic_streambuf<_CharT, _Traits>::basic_streambuf()
307
- : __binp_(nullptr ), __ninp_(nullptr ), __einp_(nullptr ), __bout_(nullptr ), __nout_(nullptr ), __eout_(nullptr ) {}
308
-
309
- template <class _CharT , class _Traits >
310
- basic_streambuf<_CharT, _Traits>::basic_streambuf(const basic_streambuf& __sb)
311
- : __loc_(__sb.__loc_),
312
- __binp_ (__sb.__binp_),
313
- __ninp_(__sb.__ninp_),
314
- __einp_(__sb.__einp_),
315
- __bout_(__sb.__bout_),
316
- __nout_(__sb.__nout_),
317
- __eout_(__sb.__eout_) {}
318
-
319
- template <class _CharT , class _Traits >
320
- basic_streambuf<_CharT, _Traits>& basic_streambuf<_CharT, _Traits>::operator =(const basic_streambuf& __sb) {
321
- __loc_ = __sb.__loc_ ;
322
- __binp_ = __sb.__binp_ ;
323
- __ninp_ = __sb.__ninp_ ;
324
- __einp_ = __sb.__einp_ ;
325
- __bout_ = __sb.__bout_ ;
326
- __nout_ = __sb.__nout_ ;
327
- __eout_ = __sb.__eout_ ;
328
- return *this ;
329
- }
330
-
331
- template <class _CharT , class _Traits >
332
- void basic_streambuf<_CharT, _Traits>::swap(basic_streambuf& __sb) {
333
- std::swap (__loc_, __sb.__loc_ );
334
- std::swap (__binp_, __sb.__binp_ );
335
- std::swap (__ninp_, __sb.__ninp_ );
336
- std::swap (__einp_, __sb.__einp_ );
337
- std::swap (__bout_, __sb.__bout_ );
338
- std::swap (__nout_, __sb.__nout_ );
339
- std::swap (__eout_, __sb.__eout_ );
340
- }
341
-
342
- template <class _CharT , class _Traits >
343
- void basic_streambuf<_CharT, _Traits>::imbue(const locale&) {}
344
-
345
- template <class _CharT , class _Traits >
346
- basic_streambuf<_CharT, _Traits>* basic_streambuf<_CharT, _Traits>::setbuf(char_type*, streamsize) {
347
- return this ;
348
- }
349
-
350
- template <class _CharT , class _Traits >
351
- typename basic_streambuf<_CharT, _Traits>::pos_type
352
- basic_streambuf<_CharT, _Traits>::seekoff(off_type, ios_base::seekdir, ios_base::openmode) {
353
- return pos_type (off_type (-1 ));
354
- }
355
-
356
- template <class _CharT , class _Traits >
357
- typename basic_streambuf<_CharT, _Traits>::pos_type
358
- basic_streambuf<_CharT, _Traits>::seekpos(pos_type, ios_base::openmode) {
359
- return pos_type (off_type (-1 ));
360
- }
361
-
362
- template <class _CharT , class _Traits >
363
- int basic_streambuf<_CharT, _Traits>::sync() {
364
- return 0 ;
365
- }
366
-
367
- template <class _CharT , class _Traits >
368
- streamsize basic_streambuf<_CharT, _Traits>::showmanyc() {
369
- return 0 ;
370
- }
371
-
372
- template <class _CharT , class _Traits >
373
- streamsize basic_streambuf<_CharT, _Traits>::xsgetn(char_type* __s, streamsize __n) {
374
- const int_type __eof = traits_type::eof ();
375
- int_type __c;
376
- streamsize __i = 0 ;
377
- while (__i < __n) {
378
- if (__ninp_ < __einp_) {
379
- const streamsize __len = std::min (static_cast <streamsize>(INT_MAX), std::min (__einp_ - __ninp_, __n - __i));
380
- traits_type::copy (__s, __ninp_, __len);
381
- __s += __len;
382
- __i += __len;
383
- this ->gbump (__len);
384
- } else if ((__c = uflow ()) != __eof) {
385
- *__s = traits_type::to_char_type (__c);
386
- ++__s;
387
- ++__i;
388
- } else
389
- break ;
390
- }
391
- return __i;
392
- }
393
-
394
- template <class _CharT , class _Traits >
395
- typename basic_streambuf<_CharT, _Traits>::int_type basic_streambuf<_CharT, _Traits>::underflow() {
396
- return traits_type::eof ();
397
- }
398
-
399
- template <class _CharT , class _Traits >
400
- typename basic_streambuf<_CharT, _Traits>::int_type basic_streambuf<_CharT, _Traits>::uflow() {
401
- if (underflow () == traits_type::eof ())
402
- return traits_type::eof ();
403
- return traits_type::to_int_type (*__ninp_++);
404
- }
405
-
406
- template <class _CharT , class _Traits >
407
- typename basic_streambuf<_CharT, _Traits>::int_type basic_streambuf<_CharT, _Traits>::pbackfail(int_type) {
408
- return traits_type::eof ();
409
- }
410
-
411
- template <class _CharT , class _Traits >
412
- streamsize basic_streambuf<_CharT, _Traits>::xsputn(const char_type* __s, streamsize __n) {
413
- streamsize __i = 0 ;
414
- int_type __eof = traits_type::eof ();
415
- while (__i < __n) {
416
- if (__nout_ >= __eout_) {
417
- if (overflow (traits_type::to_int_type (*__s)) == __eof)
418
- break ;
419
- ++__s;
420
- ++__i;
421
- } else {
422
- streamsize __chunk_size = std::min (__eout_ - __nout_, __n - __i);
423
- traits_type::copy (__nout_, __s, __chunk_size);
424
- __nout_ += __chunk_size;
425
- __s += __chunk_size;
426
- __i += __chunk_size;
427
- }
428
- }
429
- return __i;
430
- }
431
-
432
- template <class _CharT , class _Traits >
433
- typename basic_streambuf<_CharT, _Traits>::int_type basic_streambuf<_CharT, _Traits>::overflow(int_type) {
434
- return traits_type::eof ();
435
- }
436
-
437
375
extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_streambuf<char >;
438
376
439
377
# if _LIBCPP_HAS_WIDE_CHARACTERS
0 commit comments