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 
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 
00047 namespace std
00048 {
00049   
00050   
00051   
00052   
00053   enum _Ios_Fmtflags { _M_ios_fmtflags_end = 1L << 16 };
00054 
00055   inline _Ios_Fmtflags 
00056   operator&(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
00057   { return _Ios_Fmtflags(static_cast<int>(__a) & static_cast<int>(__b)); }
00058 
00059   inline _Ios_Fmtflags 
00060   operator|(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
00061   { return _Ios_Fmtflags(static_cast<int>(__a) | static_cast<int>(__b)); }
00062 
00063   inline _Ios_Fmtflags 
00064   operator^(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
00065   { return _Ios_Fmtflags(static_cast<int>(__a) ^ static_cast<int>(__b)); }
00066 
00067   inline _Ios_Fmtflags 
00068   operator|=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b)
00069   { return __a = __a | __b; }
00070 
00071   inline _Ios_Fmtflags 
00072   operator&=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b)
00073   { return __a = __a & __b; }
00074 
00075   inline _Ios_Fmtflags 
00076   operator^=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b)
00077   { return __a = __a ^ __b; }
00078 
00079   inline _Ios_Fmtflags 
00080   operator~(_Ios_Fmtflags __a)
00081   { return _Ios_Fmtflags(~static_cast<int>(__a)); }
00082 
00083 
00084   enum _Ios_Openmode { _M_ios_openmode_end = 1L << 16 };
00085 
00086   inline _Ios_Openmode 
00087   operator&(_Ios_Openmode __a, _Ios_Openmode __b)
00088   { return _Ios_Openmode(static_cast<int>(__a) & static_cast<int>(__b)); }
00089 
00090   inline _Ios_Openmode 
00091   operator|(_Ios_Openmode __a, _Ios_Openmode __b)
00092   { return _Ios_Openmode(static_cast<int>(__a) | static_cast<int>(__b)); }
00093 
00094   inline _Ios_Openmode 
00095   operator^(_Ios_Openmode __a, _Ios_Openmode __b)
00096   { return _Ios_Openmode(static_cast<int>(__a) ^ static_cast<int>(__b)); }
00097 
00098   inline _Ios_Openmode 
00099   operator|=(_Ios_Openmode& __a, _Ios_Openmode __b)
00100   { return __a = __a | __b; }
00101 
00102   inline _Ios_Openmode 
00103   operator&=(_Ios_Openmode& __a, _Ios_Openmode __b)
00104   { return __a = __a & __b; }
00105 
00106   inline _Ios_Openmode 
00107   operator^=(_Ios_Openmode& __a, _Ios_Openmode __b)
00108   { return __a = __a ^ __b; }
00109 
00110   inline _Ios_Openmode 
00111   operator~(_Ios_Openmode __a)
00112   { return _Ios_Openmode(~static_cast<int>(__a)); }
00113 
00114 
00115   enum _Ios_Iostate { _M_ios_iostate_end = 1L << 16 };
00116 
00117   inline _Ios_Iostate 
00118   operator&(_Ios_Iostate __a, _Ios_Iostate __b)
00119   { return _Ios_Iostate(static_cast<int>(__a) & static_cast<int>(__b)); }
00120 
00121   inline _Ios_Iostate 
00122   operator|(_Ios_Iostate __a, _Ios_Iostate __b)
00123   { return _Ios_Iostate(static_cast<int>(__a) | static_cast<int>(__b)); }
00124 
00125   inline _Ios_Iostate 
00126   operator^(_Ios_Iostate __a, _Ios_Iostate __b)
00127   { return _Ios_Iostate(static_cast<int>(__a) ^ static_cast<int>(__b)); }
00128 
00129   inline _Ios_Iostate 
00130   operator|=(_Ios_Iostate& __a, _Ios_Iostate __b)
00131   { return __a = __a | __b; }
00132 
00133   inline _Ios_Iostate 
00134   operator&=(_Ios_Iostate& __a, _Ios_Iostate __b)
00135   { return __a = __a & __b; }
00136 
00137   inline _Ios_Iostate 
00138   operator^=(_Ios_Iostate& __a, _Ios_Iostate __b)
00139   { return __a = __a ^ __b; }
00140 
00141   inline _Ios_Iostate 
00142   operator~(_Ios_Iostate __a)
00143   { return _Ios_Iostate(~static_cast<int>(__a)); }
00144 
00145   enum _Ios_Seekdir { _M_ios_seekdir_end = 1L << 16 };
00146 
00147   
00148   class ios_base
00149   {
00150   public:
00151     
00152     
00153     class failure : public exception
00154     {
00155     public:
00156 #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
00157       
00158       explicit 
00159       failure(const string& __str) throw();
00160 
00161       
00162       
00163       virtual 
00164       ~failure() throw();
00165 
00166       virtual const char*
00167       what() const throw();
00168       
00169     private:
00170       enum { _M_bufsize = 256 };
00171       char _M_name[_M_bufsize];
00172 #endif
00173     };
00174 
00175     
00176     typedef _Ios_Fmtflags fmtflags;
00177     
00178     static const fmtflags boolalpha =   fmtflags(__ios_flags::_S_boolalpha);
00179     static const fmtflags dec =         fmtflags(__ios_flags::_S_dec);
00180     static const fmtflags fixed =       fmtflags(__ios_flags::_S_fixed);
00181     static const fmtflags hex =         fmtflags(__ios_flags::_S_hex);
00182     static const fmtflags internal =    fmtflags(__ios_flags::_S_internal);
00183     static const fmtflags left =        fmtflags(__ios_flags::_S_left);
00184     static const fmtflags oct =         fmtflags(__ios_flags::_S_oct);
00185     static const fmtflags right =       fmtflags(__ios_flags::_S_right);
00186     static const fmtflags scientific =  fmtflags(__ios_flags::_S_scientific);
00187     static const fmtflags showbase =    fmtflags(__ios_flags::_S_showbase);
00188     static const fmtflags showpoint =   fmtflags(__ios_flags::_S_showpoint);
00189     static const fmtflags showpos =     fmtflags(__ios_flags::_S_showpos);
00190     static const fmtflags skipws =      fmtflags(__ios_flags::_S_skipws);
00191     static const fmtflags unitbuf =     fmtflags(__ios_flags::_S_unitbuf);
00192     static const fmtflags uppercase =   fmtflags(__ios_flags::_S_uppercase);
00193     static const fmtflags adjustfield = fmtflags(__ios_flags::_S_adjustfield);
00194     static const fmtflags basefield =   fmtflags(__ios_flags::_S_basefield);
00195     static const fmtflags floatfield =  fmtflags(__ios_flags::_S_floatfield);
00196 
00197     
00198     typedef _Ios_Iostate iostate;
00199     static const iostate badbit =   iostate(__ios_flags::_S_badbit);
00200     static const iostate eofbit =   iostate(__ios_flags::_S_eofbit);
00201     static const iostate failbit =  iostate(__ios_flags::_S_failbit);
00202     static const iostate goodbit =  iostate(0);
00203 
00204     
00205     typedef _Ios_Openmode openmode;
00206     static const openmode app =     openmode(__ios_flags::_S_app);
00207     static const openmode ate =     openmode(__ios_flags::_S_ate);
00208     static const openmode binary =  openmode(__ios_flags::_S_bin);
00209     static const openmode in =      openmode(__ios_flags::_S_in);
00210     static const openmode out =     openmode(__ios_flags::_S_out);
00211     static const openmode trunc =   openmode(__ios_flags::_S_trunc);
00212 
00213     
00214     typedef _Ios_Seekdir seekdir;
00215     static const seekdir beg =      seekdir(0);
00216     static const seekdir cur =      seekdir(SEEK_CUR);
00217     static const seekdir end =      seekdir(SEEK_END);
00218 
00219 #ifdef _GLIBCPP_DEPRECATED
00220     typedef int io_state;
00221     typedef int open_mode;
00222     typedef int seek_dir;
00223 #endif
00224 
00225     
00226     enum event
00227     {
00228       erase_event,
00229       imbue_event,
00230       copyfmt_event
00231     };
00232 
00233     typedef void (*event_callback) (event, ios_base&, int);
00234 
00235     void 
00236     register_callback(event_callback __fn, int __index);
00237 
00238   protected:
00239     
00240     streamsize      _M_precision;
00241     streamsize      _M_width;
00242     fmtflags        _M_flags;
00243     iostate         _M_exception;
00244     iostate             _M_streambuf_state;
00245 
00246     
00247     
00248     struct _Callback_list
00249     {
00250       
00251       _Callback_list*       _M_next;
00252       ios_base::event_callback  _M_fn;
00253       int           _M_index;
00254       _Atomic_word      _M_refcount;  
00255     
00256       _Callback_list(ios_base::event_callback __fn, int __index, 
00257              _Callback_list* __cb)
00258       : _M_next(__cb), _M_fn(__fn), _M_index(__index), _M_refcount(0) { }
00259       
00260       void 
00261       _M_add_reference() { __atomic_add(&_M_refcount, 1); }
00262 
00263       
00264       int 
00265       _M_remove_reference() { return __exchange_and_add(&_M_refcount, -1); }
00266     };
00267 
00268      _Callback_list*    _M_callbacks;
00269 
00270     void 
00271     _M_call_callbacks(event __ev) throw();
00272 
00273     void 
00274     _M_dispose_callbacks(void);
00275 
00276     
00277     struct _Words 
00278     { 
00279       void*     _M_pword; 
00280       long  _M_iword; 
00281       _Words() : _M_pword(0), _M_iword(0) { }
00282     };
00283 
00284     
00285     _Words          _M_word_zero;    
00286 
00287     
00288     static const int    _S_local_word_size = 8;
00289     _Words          _M_local_word[_S_local_word_size];  
00290 
00291     
00292     int             _M_word_size;
00293     _Words*         _M_word;
00294  
00295     _Words& 
00296     _M_grow_words(int __index);
00297 
00298     
00299     locale      _M_ios_locale;
00300 
00301     void 
00302     _M_init();
00303 
00304   public:
00305 
00306     
00307     
00308     
00309     
00310     class Init 
00311     {
00312       friend class ios_base;
00313     public:
00314       Init();
00315       ~Init();
00316       
00317       static void
00318       _S_ios_create(bool __sync);
00319       
00320       static void
00321       _S_ios_destroy();
00322 
00323     private:
00324       static int    _S_ios_base_init;
00325       static bool   _S_synced_with_stdio;
00326     };
00327 
00328     
00329     inline fmtflags 
00330     flags() const { return _M_flags; }
00331 
00332     inline fmtflags 
00333     flags(fmtflags __fmtfl)
00334     { 
00335       fmtflags __old = _M_flags; 
00336       _M_flags = __fmtfl; 
00337       return __old; 
00338     }
00339 
00340     inline fmtflags 
00341     setf(fmtflags __fmtfl)
00342     { 
00343       fmtflags __old = _M_flags; 
00344       _M_flags |= __fmtfl; 
00345       return __old; 
00346     }
00347 
00348     inline fmtflags 
00349     setf(fmtflags __fmtfl, fmtflags __mask)
00350     {
00351       fmtflags __old = _M_flags;
00352       _M_flags &= ~__mask;
00353       _M_flags |= (__fmtfl & __mask);
00354       return __old;
00355     }
00356 
00357     inline void 
00358     unsetf(fmtflags __mask) { _M_flags &= ~__mask; }
00359 
00360     inline streamsize 
00361     precision() const { return _M_precision; }
00362 
00363     inline streamsize 
00364     precision(streamsize __prec)
00365     { 
00366       streamsize __old = _M_precision; 
00367       _M_precision = __prec; 
00368       return __old; 
00369     }
00370 
00371     inline streamsize 
00372     width() const { return _M_width; }
00373 
00374     inline streamsize 
00375     width(streamsize __wide)
00376     { 
00377       streamsize __old = _M_width; 
00378       _M_width = __wide; 
00379       return __old; 
00380     }
00381 
00382     static bool 
00383     sync_with_stdio(bool __sync = true);
00384 
00385     
00386     locale 
00387     imbue(const locale& __loc);
00388 
00389     inline locale 
00390     getloc() const { return _M_ios_locale; }
00391 
00392     
00393     static int 
00394     xalloc() throw();
00395 
00396     inline long& 
00397     iword(int __ix)
00398     {
00399       _Words& __word = (__ix < _M_word_size) 
00400             ? _M_word[__ix] : _M_grow_words(__ix);
00401       return __word._M_iword;
00402     }
00403 
00404     inline void*& 
00405     pword(int __ix)
00406     {
00407       _Words& __word = (__ix < _M_word_size) 
00408             ? _M_word[__ix] : _M_grow_words(__ix);
00409       return __word._M_pword;
00410     }
00411 
00412     
00413     ~ios_base();
00414 
00415   protected:
00416     ios_base();
00417 
00418 #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
00419   
00420   private:
00421     ios_base(const ios_base&);
00422 
00423     ios_base& 
00424     operator=(const ios_base&);
00425 #endif
00426   };
00427  
00428   
00429   inline ios_base& 
00430   boolalpha(ios_base& __base)
00431   {
00432     __base.setf(ios_base::boolalpha);
00433     return __base;
00434   }
00435 
00436   inline ios_base& 
00437   noboolalpha(ios_base& __base)
00438   {
00439     __base.unsetf(ios_base::boolalpha);
00440     return __base;
00441   }
00442 
00443   inline ios_base& 
00444   showbase(ios_base& __base)
00445   {
00446     __base.setf(ios_base::showbase);
00447     return __base;
00448   }
00449 
00450   inline ios_base& 
00451   noshowbase(ios_base& __base)
00452   {
00453     __base.unsetf(ios_base::showbase);
00454     return __base;
00455   }
00456 
00457   inline ios_base& 
00458   showpoint(ios_base& __base)
00459   {
00460     __base.setf(ios_base::showpoint);
00461     return __base;
00462   }
00463 
00464   inline ios_base& 
00465   noshowpoint(ios_base& __base)
00466   {
00467     __base.unsetf(ios_base::showpoint);
00468     return __base;
00469   }
00470 
00471   inline ios_base& 
00472   showpos(ios_base& __base)
00473   {
00474     __base.setf(ios_base::showpos);
00475     return __base;
00476   }
00477 
00478   inline ios_base& 
00479   noshowpos(ios_base& __base)
00480   {
00481     __base.unsetf(ios_base::showpos);
00482     return __base;
00483   }
00484 
00485   inline ios_base& 
00486   skipws(ios_base& __base)
00487   {
00488     __base.setf(ios_base::skipws);
00489     return __base;
00490   }
00491   
00492   inline ios_base& 
00493   noskipws(ios_base& __base)
00494   {
00495     __base.unsetf(ios_base::skipws);
00496     return __base;
00497   }
00498 
00499   inline ios_base& 
00500   uppercase(ios_base& __base)
00501   {
00502     __base.setf(ios_base::uppercase);
00503     return __base;
00504   }
00505 
00506   inline ios_base& 
00507   nouppercase(ios_base& __base)
00508   {
00509     __base.unsetf(ios_base::uppercase);
00510     return __base;
00511   }
00512 
00513   inline ios_base& 
00514   unitbuf(ios_base& __base)
00515   {
00516      __base.setf(ios_base::unitbuf);      
00517      return __base;
00518   }
00519 
00520   inline ios_base& 
00521   nounitbuf(ios_base& __base)
00522   {
00523      __base.unsetf(ios_base::unitbuf);
00524      return __base;    
00525   }
00526 
00527   
00528   inline ios_base& 
00529   internal(ios_base& __base)
00530   {
00531      __base.setf(ios_base::internal, ios_base::adjustfield);
00532      return __base;    
00533   }
00534 
00535   inline ios_base& 
00536   left(ios_base& __base)
00537   {
00538     __base.setf(ios_base::left, ios_base::adjustfield);
00539     return __base;
00540   }
00541   
00542   inline ios_base& 
00543   right(ios_base& __base)
00544   {
00545     __base.setf(ios_base::right, ios_base::adjustfield);
00546     return __base;
00547   }
00548   
00549   
00550   inline ios_base& 
00551   dec(ios_base& __base)
00552   {
00553     __base.setf(ios_base::dec, ios_base::basefield);
00554     return __base;
00555   }
00556   
00557   inline ios_base& 
00558   hex(ios_base& __base)
00559   {
00560     __base.setf(ios_base::hex, ios_base::basefield);
00561     return __base;
00562   }
00563 
00564   inline ios_base& 
00565   oct(ios_base& __base)
00566   {
00567     __base.setf(ios_base::oct, ios_base::basefield);
00568     return __base;
00569   }
00570   
00571   
00572   inline ios_base& 
00573   fixed(ios_base& __base)
00574   {
00575     __base.setf(ios_base::fixed, ios_base::floatfield);
00576     return __base;
00577   }
00578 
00579   inline ios_base& 
00580   scientific(ios_base& __base)
00581   {
00582     __base.setf(ios_base::scientific, ios_base::floatfield);
00583     return __base;
00584   }
00585 
00586 } 
00587 
00588 #endif 
00589