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