00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 #ifndef _CPP_BITS_IOSBASE_H
00041 #define _CPP_BITS_IOSBASE_H 1
00042
00043 #pragma GCC system_header
00044
00045 #include <bits/atomicity.h>
00046 #include <bits/localefwd.h>
00047 #include <bits/locale_classes.h>
00048
00049 namespace std
00050 {
00051
00052
00053
00054
00055 enum _Ios_Fmtflags { _M_ios_fmtflags_end = 1L << 16 };
00056
00057 inline _Ios_Fmtflags
00058 operator&(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
00059 { return _Ios_Fmtflags(static_cast<int>(__a) & static_cast<int>(__b)); }
00060
00061 inline _Ios_Fmtflags
00062 operator|(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
00063 { return _Ios_Fmtflags(static_cast<int>(__a) | static_cast<int>(__b)); }
00064
00065 inline _Ios_Fmtflags
00066 operator^(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
00067 { return _Ios_Fmtflags(static_cast<int>(__a) ^ static_cast<int>(__b)); }
00068
00069 inline _Ios_Fmtflags
00070 operator|=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b)
00071 { return __a = __a | __b; }
00072
00073 inline _Ios_Fmtflags
00074 operator&=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b)
00075 { return __a = __a & __b; }
00076
00077 inline _Ios_Fmtflags
00078 operator^=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b)
00079 { return __a = __a ^ __b; }
00080
00081 inline _Ios_Fmtflags
00082 operator~(_Ios_Fmtflags __a)
00083 { return _Ios_Fmtflags(~static_cast<int>(__a)); }
00084
00085
00086 enum _Ios_Openmode { _M_ios_openmode_end = 1L << 16 };
00087
00088 inline _Ios_Openmode
00089 operator&(_Ios_Openmode __a, _Ios_Openmode __b)
00090 { return _Ios_Openmode(static_cast<int>(__a) & static_cast<int>(__b)); }
00091
00092 inline _Ios_Openmode
00093 operator|(_Ios_Openmode __a, _Ios_Openmode __b)
00094 { return _Ios_Openmode(static_cast<int>(__a) | static_cast<int>(__b)); }
00095
00096 inline _Ios_Openmode
00097 operator^(_Ios_Openmode __a, _Ios_Openmode __b)
00098 { return _Ios_Openmode(static_cast<int>(__a) ^ static_cast<int>(__b)); }
00099
00100 inline _Ios_Openmode
00101 operator|=(_Ios_Openmode& __a, _Ios_Openmode __b)
00102 { return __a = __a | __b; }
00103
00104 inline _Ios_Openmode
00105 operator&=(_Ios_Openmode& __a, _Ios_Openmode __b)
00106 { return __a = __a & __b; }
00107
00108 inline _Ios_Openmode
00109 operator^=(_Ios_Openmode& __a, _Ios_Openmode __b)
00110 { return __a = __a ^ __b; }
00111
00112 inline _Ios_Openmode
00113 operator~(_Ios_Openmode __a)
00114 { return _Ios_Openmode(~static_cast<int>(__a)); }
00115
00116
00117 enum _Ios_Iostate { _M_ios_iostate_end = 1L << 16 };
00118
00119 inline _Ios_Iostate
00120 operator&(_Ios_Iostate __a, _Ios_Iostate __b)
00121 { return _Ios_Iostate(static_cast<int>(__a) & static_cast<int>(__b)); }
00122
00123 inline _Ios_Iostate
00124 operator|(_Ios_Iostate __a, _Ios_Iostate __b)
00125 { return _Ios_Iostate(static_cast<int>(__a) | static_cast<int>(__b)); }
00126
00127 inline _Ios_Iostate
00128 operator^(_Ios_Iostate __a, _Ios_Iostate __b)
00129 { return _Ios_Iostate(static_cast<int>(__a) ^ static_cast<int>(__b)); }
00130
00131 inline _Ios_Iostate
00132 operator|=(_Ios_Iostate& __a, _Ios_Iostate __b)
00133 { return __a = __a | __b; }
00134
00135 inline _Ios_Iostate
00136 operator&=(_Ios_Iostate& __a, _Ios_Iostate __b)
00137 { return __a = __a & __b; }
00138
00139 inline _Ios_Iostate
00140 operator^=(_Ios_Iostate& __a, _Ios_Iostate __b)
00141 { return __a = __a ^ __b; }
00142
00143 inline _Ios_Iostate
00144 operator~(_Ios_Iostate __a)
00145 { return _Ios_Iostate(~static_cast<int>(__a)); }
00146
00147 enum _Ios_Seekdir { _M_ios_seekdir_end = 1L << 16 };
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158 class ios_base
00159 {
00160 public:
00161
00162
00163
00164 class failure : public exception
00165 {
00166 public:
00167 #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
00168
00169 explicit
00170 failure(const string& __str) throw();
00171
00172
00173
00174 virtual
00175 ~failure() throw();
00176
00177 virtual const char*
00178 what() const throw();
00179
00180 private:
00181 enum { _M_bufsize = 256 };
00182 char _M_name[_M_bufsize];
00183 #endif
00184 };
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212 typedef _Ios_Fmtflags fmtflags;
00213
00214 static const fmtflags boolalpha = fmtflags(__ios_flags::_S_boolalpha);
00215
00216 static const fmtflags dec = fmtflags(__ios_flags::_S_dec);
00217
00218 static const fmtflags fixed = fmtflags(__ios_flags::_S_fixed);
00219
00220 static const fmtflags hex = fmtflags(__ios_flags::_S_hex);
00221
00222
00223
00224 static const fmtflags internal = fmtflags(__ios_flags::_S_internal);
00225
00226
00227 static const fmtflags left = fmtflags(__ios_flags::_S_left);
00228
00229 static const fmtflags oct = fmtflags(__ios_flags::_S_oct);
00230
00231
00232 static const fmtflags right = fmtflags(__ios_flags::_S_right);
00233
00234 static const fmtflags scientific = fmtflags(__ios_flags::_S_scientific);
00235
00236
00237 static const fmtflags showbase = fmtflags(__ios_flags::_S_showbase);
00238
00239
00240 static const fmtflags showpoint = fmtflags(__ios_flags::_S_showpoint);
00241
00242 static const fmtflags showpos = fmtflags(__ios_flags::_S_showpos);
00243
00244 static const fmtflags skipws = fmtflags(__ios_flags::_S_skipws);
00245
00246 static const fmtflags unitbuf = fmtflags(__ios_flags::_S_unitbuf);
00247
00248
00249 static const fmtflags uppercase = fmtflags(__ios_flags::_S_uppercase);
00250
00251 static const fmtflags adjustfield = fmtflags(__ios_flags::_S_adjustfield);
00252
00253 static const fmtflags basefield = fmtflags(__ios_flags::_S_basefield);
00254
00255 static const fmtflags floatfield = fmtflags(__ios_flags::_S_floatfield);
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269 typedef _Ios_Iostate iostate;
00270
00271
00272 static const iostate badbit = iostate(__ios_flags::_S_badbit);
00273
00274 static const iostate eofbit = iostate(__ios_flags::_S_eofbit);
00275
00276
00277
00278 static const iostate failbit = iostate(__ios_flags::_S_failbit);
00279
00280 static const iostate goodbit = iostate(0);
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296 typedef _Ios_Openmode openmode;
00297
00298 static const openmode app = openmode(__ios_flags::_S_app);
00299
00300 static const openmode ate = openmode(__ios_flags::_S_ate);
00301
00302
00303
00304
00305 static const openmode binary = openmode(__ios_flags::_S_bin);
00306
00307 static const openmode in = openmode(__ios_flags::_S_in);
00308
00309 static const openmode out = openmode(__ios_flags::_S_out);
00310
00311 static const openmode trunc = openmode(__ios_flags::_S_trunc);
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323 typedef _Ios_Seekdir seekdir;
00324
00325 static const seekdir beg = seekdir(0);
00326
00327 static const seekdir cur = seekdir(SEEK_CUR);
00328
00329 static const seekdir end = seekdir(SEEK_END);
00330
00331 #ifdef _GLIBCPP_DEPRECATED
00332
00333 typedef int io_state;
00334 typedef int open_mode;
00335 typedef int seek_dir;
00336
00337 typedef std::streampos streampos;
00338 typedef std::streamoff streamoff;
00339 #endif
00340
00341
00342
00343
00344
00345 enum event
00346 {
00347 erase_event,
00348 imbue_event,
00349 copyfmt_event
00350 };
00351
00352
00353
00354
00355 typedef void (*event_callback) (event, ios_base&, int);
00356
00357
00358
00359
00360 void
00361 register_callback(event_callback __fn, int __index);
00362
00363 protected:
00364
00365
00366
00367
00368
00369
00370 streamsize _M_precision;
00371 streamsize _M_width;
00372 fmtflags _M_flags;
00373 iostate _M_exception;
00374 iostate _M_streambuf_state;
00375
00376
00377
00378
00379 struct _Callback_list
00380 {
00381
00382 _Callback_list* _M_next;
00383 ios_base::event_callback _M_fn;
00384 int _M_index;
00385 _Atomic_word _M_refcount;
00386
00387 _Callback_list(ios_base::event_callback __fn, int __index,
00388 _Callback_list* __cb)
00389 : _M_next(__cb), _M_fn(__fn), _M_index(__index), _M_refcount(0) { }
00390
00391 void
00392 _M_add_reference() { __atomic_add(&_M_refcount, 1); }
00393
00394
00395 int
00396 _M_remove_reference() { return __exchange_and_add(&_M_refcount, -1); }
00397 };
00398
00399 _Callback_list* _M_callbacks;
00400
00401 void
00402 _M_call_callbacks(event __ev) throw();
00403
00404 void
00405 _M_dispose_callbacks(void);
00406
00407
00408 struct _Words
00409 {
00410 void* _M_pword;
00411 long _M_iword;
00412 _Words() : _M_pword(0), _M_iword(0) { }
00413 };
00414
00415
00416 _Words _M_word_zero;
00417
00418
00419
00420 static const int _S_local_word_size = 8;
00421 _Words _M_local_word[_S_local_word_size];
00422
00423
00424 int _M_word_size;
00425 _Words* _M_word;
00426
00427 _Words&
00428 _M_grow_words(int __index);
00429
00430
00431 locale _M_ios_locale;
00432
00433 void
00434 _M_init();
00435
00436 public:
00437
00438
00439
00440
00441
00442 class Init
00443 {
00444 friend class ios_base;
00445 public:
00446 Init();
00447 ~Init();
00448
00449 static void
00450 _S_ios_create(bool __sync);
00451
00452 static void
00453 _S_ios_destroy();
00454
00455
00456
00457
00458 static bool
00459 _S_initialized() { return _S_ios_base_init; }
00460
00461 private:
00462 static int _S_ios_base_init;
00463 static bool _S_synced_with_stdio;
00464 };
00465
00466
00467
00468
00469
00470
00471 inline fmtflags
00472 flags() const { return _M_flags; }
00473
00474
00475
00476
00477
00478
00479
00480
00481 inline fmtflags
00482 flags(fmtflags __fmtfl)
00483 {
00484 fmtflags __old = _M_flags;
00485 _M_flags = __fmtfl;
00486 return __old;
00487 }
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497 inline fmtflags
00498 setf(fmtflags __fmtfl)
00499 {
00500 fmtflags __old = _M_flags;
00501 _M_flags |= __fmtfl;
00502 return __old;
00503 }
00504
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514 inline fmtflags
00515 setf(fmtflags __fmtfl, fmtflags __mask)
00516 {
00517 fmtflags __old = _M_flags;
00518 _M_flags &= ~__mask;
00519 _M_flags |= (__fmtfl & __mask);
00520 return __old;
00521 }
00522
00523
00524
00525
00526
00527
00528
00529 inline void
00530 unsetf(fmtflags __mask) { _M_flags &= ~__mask; }
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541 inline streamsize
00542 precision() const { return _M_precision; }
00543
00544
00545
00546
00547
00548
00549 inline streamsize
00550 precision(streamsize __prec)
00551 {
00552 streamsize __old = _M_precision;
00553 _M_precision = __prec;
00554 return __old;
00555 }
00556
00557
00558
00559
00560
00561
00562
00563 inline streamsize
00564 width() const { return _M_width; }
00565
00566
00567
00568
00569
00570
00571 inline streamsize
00572 width(streamsize __wide)
00573 {
00574 streamsize __old = _M_width;
00575 _M_width = __wide;
00576 return __old;
00577 }
00578
00579
00580
00581
00582
00583
00584
00585
00586
00587
00588
00589
00590 static bool
00591 sync_with_stdio(bool __sync = true);
00592
00593
00594
00595
00596
00597
00598
00599
00600
00601
00602 locale
00603 imbue(const locale& __loc);
00604
00605
00606
00607
00608
00609
00610
00611
00612
00613 inline locale
00614 getloc() const { return _M_ios_locale; }
00615
00616
00617
00618
00619
00620
00621
00622
00623 inline const locale&
00624 _M_getloc() const { return _M_ios_locale; }
00625
00626
00627
00628
00629
00630 static int
00631 xalloc() throw();
00632
00633
00634
00635
00636 inline long&
00637 iword(int __ix)
00638 {
00639 _Words& __word = (__ix < _M_word_size)
00640 ? _M_word[__ix] : _M_grow_words(__ix);
00641 return __word._M_iword;
00642 }
00643
00644
00645
00646
00647 inline void*&
00648 pword(int __ix)
00649 {
00650 _Words& __word = (__ix < _M_word_size)
00651 ? _M_word[__ix] : _M_grow_words(__ix);
00652 return __word._M_pword;
00653 }
00654
00655
00656
00657
00658
00659
00660 ~ios_base();
00661
00662 protected:
00663 ios_base();
00664
00665 #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
00666
00667 private:
00668 ios_base(const ios_base&);
00669
00670 ios_base&
00671 operator=(const ios_base&);
00672 #endif
00673 };
00674
00675
00676
00677 inline ios_base&
00678 boolalpha(ios_base& __base)
00679 {
00680 __base.setf(ios_base::boolalpha);
00681 return __base;
00682 }
00683
00684
00685 inline ios_base&
00686 noboolalpha(ios_base& __base)
00687 {
00688 __base.unsetf(ios_base::boolalpha);
00689 return __base;
00690 }
00691
00692
00693 inline ios_base&
00694 showbase(ios_base& __base)
00695 {
00696 __base.setf(ios_base::showbase);
00697 return __base;
00698 }
00699
00700
00701 inline ios_base&
00702 noshowbase(ios_base& __base)
00703 {
00704 __base.unsetf(ios_base::showbase);
00705 return __base;
00706 }
00707
00708
00709 inline ios_base&
00710 showpoint(ios_base& __base)
00711 {
00712 __base.setf(ios_base::showpoint);
00713 return __base;
00714 }
00715
00716
00717 inline ios_base&
00718 noshowpoint(ios_base& __base)
00719 {
00720 __base.unsetf(ios_base::showpoint);
00721 return __base;
00722 }
00723
00724
00725 inline ios_base&
00726 showpos(ios_base& __base)
00727 {
00728 __base.setf(ios_base::showpos);
00729 return __base;
00730 }
00731
00732
00733 inline ios_base&
00734 noshowpos(ios_base& __base)
00735 {
00736 __base.unsetf(ios_base::showpos);
00737 return __base;
00738 }
00739
00740
00741 inline ios_base&
00742 skipws(ios_base& __base)
00743 {
00744 __base.setf(ios_base::skipws);
00745 return __base;
00746 }
00747
00748
00749 inline ios_base&
00750 noskipws(ios_base& __base)
00751 {
00752 __base.unsetf(ios_base::skipws);
00753 return __base;
00754 }
00755
00756
00757 inline ios_base&
00758 uppercase(ios_base& __base)
00759 {
00760 __base.setf(ios_base::uppercase);
00761 return __base;
00762 }
00763
00764
00765 inline ios_base&
00766 nouppercase(ios_base& __base)
00767 {
00768 __base.unsetf(ios_base::uppercase);
00769 return __base;
00770 }
00771
00772
00773 inline ios_base&
00774 unitbuf(ios_base& __base)
00775 {
00776 __base.setf(ios_base::unitbuf);
00777 return __base;
00778 }
00779
00780
00781 inline ios_base&
00782 nounitbuf(ios_base& __base)
00783 {
00784 __base.unsetf(ios_base::unitbuf);
00785 return __base;
00786 }
00787
00788
00789
00790 inline ios_base&
00791 internal(ios_base& __base)
00792 {
00793 __base.setf(ios_base::internal, ios_base::adjustfield);
00794 return __base;
00795 }
00796
00797
00798 inline ios_base&
00799 left(ios_base& __base)
00800 {
00801 __base.setf(ios_base::left, ios_base::adjustfield);
00802 return __base;
00803 }
00804
00805
00806 inline ios_base&
00807 right(ios_base& __base)
00808 {
00809 __base.setf(ios_base::right, ios_base::adjustfield);
00810 return __base;
00811 }
00812
00813
00814
00815 inline ios_base&
00816 dec(ios_base& __base)
00817 {
00818 __base.setf(ios_base::dec, ios_base::basefield);
00819 return __base;
00820 }
00821
00822
00823 inline ios_base&
00824 hex(ios_base& __base)
00825 {
00826 __base.setf(ios_base::hex, ios_base::basefield);
00827 return __base;
00828 }
00829
00830
00831 inline ios_base&
00832 oct(ios_base& __base)
00833 {
00834 __base.setf(ios_base::oct, ios_base::basefield);
00835 return __base;
00836 }
00837
00838
00839
00840 inline ios_base&
00841 fixed(ios_base& __base)
00842 {
00843 __base.setf(ios_base::fixed, ios_base::floatfield);
00844 return __base;
00845 }
00846
00847
00848 inline ios_base&
00849 scientific(ios_base& __base)
00850 {
00851 __base.setf(ios_base::scientific, ios_base::floatfield);
00852 return __base;
00853 }
00854
00855 }
00856
00857 #endif
00858