Whole document tree ios_base.hGo to the documentation of this file.00001 // Iostreams base classes -*- C++ -*- 00002 00003 // Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. 00004 // 00005 // This file is part of the GNU ISO C++ Library. This library is free 00006 // software; you can redistribute it and/or modify it under the 00007 // terms of the GNU General Public License as published by the 00008 // Free Software Foundation; either version 2, or (at your option) 00009 // any later version. 00010 00011 // This library is distributed in the hope that it will be useful, 00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 // GNU General Public License for more details. 00015 00016 // You should have received a copy of the GNU General Public License along 00017 // with this library; see the file COPYING. If not, write to the Free 00018 // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, 00019 // USA. 00020 00021 // As a special exception, you may use this file as part of a free software 00022 // library without restriction. Specifically, if other files instantiate 00023 // templates or use macros or inline functions from this file, or you compile 00024 // this file and link it with other files to produce an executable, this 00025 // file does not by itself cause the resulting executable to be covered by 00026 // the GNU General Public License. This exception does not however 00027 // invalidate any other reasons why the executable file might be covered by 00028 // the GNU General Public License. 00029 00030 // 00031 // ISO C++ 14882: 27.8 File-based streams 00032 // 00033 00034 #ifndef _CPP_BITS_IOSBASE_H 00035 #define _CPP_BITS_IOSBASE_H 1 00036 00037 #pragma GCC system_header 00038 00039 namespace std 00040 { 00041 // The following definitions of bitmask types are enums, not ints, 00042 // as permitted (but not required) in the standard, in order to provide 00043 // better type safety in iostream calls. A side effect is that 00044 // expressions involving them are no longer compile-time constants. 00045 enum _Ios_Fmtflags { _M_ios_fmtflags_end = 1L << 16 }; 00046 00047 inline _Ios_Fmtflags 00048 operator&(_Ios_Fmtflags __a, _Ios_Fmtflags __b) 00049 { return _Ios_Fmtflags(static_cast<int>(__a) & static_cast<int>(__b)); } 00050 00051 inline _Ios_Fmtflags 00052 operator|(_Ios_Fmtflags __a, _Ios_Fmtflags __b) 00053 { return _Ios_Fmtflags(static_cast<int>(__a) | static_cast<int>(__b)); } 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 __a = __a | __b; } 00062 00063 inline _Ios_Fmtflags 00064 operator&=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b) 00065 { return __a = __a & __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) 00073 { return _Ios_Fmtflags(~static_cast<int>(__a)); } 00074 00075 00076 enum _Ios_Openmode { _M_ios_openmode_end = 1L << 16 }; 00077 00078 inline _Ios_Openmode 00079 operator&(_Ios_Openmode __a, _Ios_Openmode __b) 00080 { return _Ios_Openmode(static_cast<int>(__a) & static_cast<int>(__b)); } 00081 00082 inline _Ios_Openmode 00083 operator|(_Ios_Openmode __a, _Ios_Openmode __b) 00084 { return _Ios_Openmode(static_cast<int>(__a) | static_cast<int>(__b)); } 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 __a = __a | __b; } 00093 00094 inline _Ios_Openmode 00095 operator&=(_Ios_Openmode& __a, _Ios_Openmode __b) 00096 { return __a = __a & __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) 00104 { return _Ios_Openmode(~static_cast<int>(__a)); } 00105 00106 00107 enum _Ios_Iostate { _M_ios_iostate_end = 1L << 16 }; 00108 00109 inline _Ios_Iostate 00110 operator&(_Ios_Iostate __a, _Ios_Iostate __b) 00111 { return _Ios_Iostate(static_cast<int>(__a) & static_cast<int>(__b)); } 00112 00113 inline _Ios_Iostate 00114 operator|(_Ios_Iostate __a, _Ios_Iostate __b) 00115 { return _Ios_Iostate(static_cast<int>(__a) | static_cast<int>(__b)); } 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 __a = __a | __b; } 00124 00125 inline _Ios_Iostate 00126 operator&=(_Ios_Iostate& __a, _Ios_Iostate __b) 00127 { return __a = __a & __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) 00135 { return _Ios_Iostate(~static_cast<int>(__a)); } 00136 00137 enum _Ios_Seekdir { _M_ios_seekdir_end = 1L << 16 }; 00138 00139 // 27.4.2 Class ios_base 00140 class ios_base 00141 { 00142 public: 00143 00144 // 27.4.2.1.1 Class ios_base::failure 00145 class failure : public exception 00146 { 00147 public: 00148 #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS 00149 // Can't do exception(_msg) as defined in 27.4.2.1.1 00150 explicit 00151 failure(const string& __str) throw(); 00152 00153 virtual 00154 ~failure() throw(); 00155 00156 virtual const char* 00157 what() const throw(); 00158 00159 private: 00160 enum { _M_bufsize = 256 }; 00161 char _M_name[_M_bufsize]; 00162 #endif 00163 }; 00164 00165 // 27.4.2.1.2 Type ios_base::fmtflags 00166 typedef _Ios_Fmtflags fmtflags; 00167 // 27.4.2.1.2 Type fmtflags 00168 static const fmtflags boolalpha = fmtflags(__ios_flags::_S_boolalpha); 00169 static const fmtflags dec = fmtflags(__ios_flags::_S_dec); 00170 static const fmtflags fixed = fmtflags(__ios_flags::_S_fixed); 00171 static const fmtflags hex = fmtflags(__ios_flags::_S_hex); 00172 static const fmtflags internal = fmtflags(__ios_flags::_S_internal); 00173 static const fmtflags left = fmtflags(__ios_flags::_S_left); 00174 static const fmtflags oct = fmtflags(__ios_flags::_S_oct); 00175 static const fmtflags right = fmtflags(__ios_flags::_S_right); 00176 static const fmtflags scientific = fmtflags(__ios_flags::_S_scientific); 00177 static const fmtflags showbase = fmtflags(__ios_flags::_S_showbase); 00178 static const fmtflags showpoint = fmtflags(__ios_flags::_S_showpoint); 00179 static const fmtflags showpos = fmtflags(__ios_flags::_S_showpos); 00180 static const fmtflags skipws = fmtflags(__ios_flags::_S_skipws); 00181 static const fmtflags unitbuf = fmtflags(__ios_flags::_S_unitbuf); 00182 static const fmtflags uppercase = fmtflags(__ios_flags::_S_uppercase); 00183 static const fmtflags adjustfield = fmtflags(__ios_flags::_S_adjustfield); 00184 static const fmtflags basefield = fmtflags(__ios_flags::_S_basefield); 00185 static const fmtflags floatfield = fmtflags(__ios_flags::_S_floatfield); 00186 00187 // 27.4.2.1.3 Type ios_base::iostate 00188 typedef _Ios_Iostate iostate; 00189 static const iostate badbit = iostate(__ios_flags::_S_badbit); 00190 static const iostate eofbit = iostate(__ios_flags::_S_eofbit); 00191 static const iostate failbit = iostate(__ios_flags::_S_failbit); 00192 static const iostate goodbit = iostate(0); 00193 00194 // 27.4.2.1.4 Type openmode 00195 typedef _Ios_Openmode openmode; 00196 static const openmode app = openmode(__ios_flags::_S_app); 00197 static const openmode ate = openmode(__ios_flags::_S_ate); 00198 static const openmode binary = openmode(__ios_flags::_S_bin); 00199 static const openmode in = openmode(__ios_flags::_S_in); 00200 static const openmode out = openmode(__ios_flags::_S_out); 00201 static const openmode trunc = openmode(__ios_flags::_S_trunc); 00202 00203 // 27.4.2.1.5 Type seekdir 00204 typedef _Ios_Seekdir seekdir; 00205 static const seekdir beg = seekdir(0); 00206 static const seekdir cur = seekdir(SEEK_CUR); 00207 static const seekdir end = seekdir(SEEK_END); 00208 00209 #ifdef _GLIBCPP_DEPRECATED 00210 typedef int io_state; 00211 typedef int open_mode; 00212 typedef int seek_dir; 00213 #endif 00214 00215 // Callbacks; 00216 enum event 00217 { 00218 erase_event, 00219 imbue_event, 00220 copyfmt_event 00221 }; 00222 00223 typedef void (*event_callback) (event, ios_base&, int); 00224 00225 void 00226 register_callback(event_callback __fn, int __index); 00227 00228 protected: 00229 // Data Members 00230 streamsize _M_precision; 00231 streamsize _M_width; 00232 fmtflags _M_flags; 00233 00234 // 27.4.2.6 Members for callbacks 00235 // 27.4.2.6 ios_base callbacks 00236 struct _Callback_list 00237 { 00238 // Data Members 00239 _Callback_list* _M_next; 00240 ios_base::event_callback _M_fn; 00241 int _M_index; 00242 int _M_refcount; // 0 means one reference. 00243 00244 _Callback_list(ios_base::event_callback __fn, int __index, 00245 _Callback_list* __cb) 00246 : _M_next(__cb), _M_fn(__fn), _M_index(__index), _M_refcount(0) { } 00247 00248 void 00249 _M_add_reference() { ++_M_refcount; } // XXX MT 00250 00251 int 00252 _M_remove_reference() { return _M_refcount--; } // 0 => OK to delete 00253 }; 00254 00255 _Callback_list* _M_callbacks; 00256 00257 void 00258 _M_call_callbacks(event __ev) throw(); 00259 00260 void 00261 _M_dispose_callbacks(void); 00262 00263 // 27.4.2.5 Members for iword/pword storage 00264 struct _Words 00265 { 00266 void* _M_pword; 00267 long _M_iword; 00268 }; 00269 00270 static const int _S_local_words = 8; 00271 _Words _M_word_array[_S_local_words]; // Guaranteed storage 00272 _Words _M_dummy; // Only for failed iword/pword calls. 00273 _Words* _M_words; 00274 int _M_word_limit; 00275 00276 _Words& 00277 _M_grow_words(int __index); 00278 00279 // Members for locale and locale caching. 00280 locale _M_ios_locale; 00281 00282 void 00283 _M_init(); 00284 00285 public: 00286 00287 // 27.4.2.1.6 Class ios_base::Init 00288 // Used to initialize standard streams. In theory, g++ could use 00289 // -finit-priority to order this stuff correctly without going 00290 // through these machinations. 00291 class Init 00292 { 00293 friend class ios_base; 00294 public: 00295 Init(); 00296 ~Init(); 00297 00298 static void 00299 _S_ios_create(bool __sync); 00300 00301 static void 00302 _S_ios_destroy(); 00303 00304 private: 00305 static int _S_ios_base_init; 00306 static bool _S_synced_with_stdio; 00307 }; 00308 00309 // Fmtflags state: 00310 inline fmtflags 00311 flags() const { return _M_flags; } 00312 00313 inline fmtflags 00314 flags(fmtflags __fmtfl) 00315 { 00316 fmtflags __old = _M_flags; 00317 _M_flags = __fmtfl; 00318 return __old; 00319 } 00320 00321 inline fmtflags 00322 setf(fmtflags __fmtfl) 00323 { 00324 fmtflags __old = _M_flags; 00325 _M_flags |= __fmtfl; 00326 return __old; 00327 } 00328 00329 inline fmtflags 00330 setf(fmtflags __fmtfl, fmtflags __mask) 00331 { 00332 fmtflags __old = _M_flags; 00333 _M_flags &= ~__mask; 00334 _M_flags |= (__fmtfl & __mask); 00335 return __old; 00336 } 00337 00338 inline void 00339 unsetf(fmtflags __mask) { _M_flags &= ~__mask; } 00340 00341 inline streamsize 00342 precision() const { return _M_precision; } 00343 00344 inline streamsize 00345 precision(streamsize __prec) 00346 { 00347 streamsize __old = _M_precision; 00348 _M_precision = __prec; 00349 return __old; 00350 } 00351 00352 inline streamsize 00353 width() const { return _M_width; } 00354 00355 inline streamsize 00356 width(streamsize __wide) 00357 { 00358 streamsize __old = _M_width; 00359 _M_width = __wide; 00360 return __old; 00361 } 00362 00363 static bool 00364 sync_with_stdio(bool __sync = true); 00365 00366 // Locales: 00367 locale 00368 imbue(const locale& __loc); 00369 00370 inline locale 00371 getloc() const { return _M_ios_locale; } 00372 00373 // Storage: 00374 static int 00375 xalloc() throw(); 00376 00377 inline long& 00378 iword(int __ix) 00379 { 00380 _Words& __word = (__ix < _M_word_limit) 00381 ? _M_words[__ix] : _M_grow_words(__ix); 00382 return __word._M_iword; 00383 } 00384 00385 inline void*& 00386 pword(int __ix) 00387 { 00388 _Words& __word = (__ix < _M_word_limit) 00389 ? _M_words[__ix] : _M_grow_words(__ix); 00390 return __word._M_pword; 00391 } 00392 00393 // Destructor 00394 ~ios_base(); 00395 00396 protected: 00397 ios_base(); 00398 00399 #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS 00400 private: 00401 ios_base(const ios_base&); 00402 00403 ios_base& 00404 operator=(const ios_base&); 00405 #endif 00406 }; 00407 00408 // 27.4.5.1 fmtflags manipulators: 00409 inline ios_base& 00410 boolalpha(ios_base& __base) 00411 { 00412 __base.setf(ios_base::boolalpha); 00413 return __base; 00414 } 00415 00416 inline ios_base& 00417 noboolalpha(ios_base& __base) 00418 { 00419 __base.unsetf(ios_base::boolalpha); 00420 return __base; 00421 } 00422 00423 inline ios_base& 00424 showbase(ios_base& __base) 00425 { 00426 __base.setf(ios_base::showbase); 00427 return __base; 00428 } 00429 00430 inline ios_base& 00431 noshowbase(ios_base& __base) 00432 { 00433 __base.unsetf(ios_base::showbase); 00434 return __base; 00435 } 00436 00437 inline ios_base& 00438 showpoint(ios_base& __base) 00439 { 00440 __base.setf(ios_base::showpoint); 00441 return __base; 00442 } 00443 00444 inline ios_base& 00445 noshowpoint(ios_base& __base) 00446 { 00447 __base.unsetf(ios_base::showpoint); 00448 return __base; 00449 } 00450 00451 inline ios_base& 00452 showpos(ios_base& __base) 00453 { 00454 __base.setf(ios_base::showpos); 00455 return __base; 00456 } 00457 00458 inline ios_base& 00459 noshowpos(ios_base& __base) 00460 { 00461 __base.unsetf(ios_base::showpos); 00462 return __base; 00463 } 00464 00465 inline ios_base& 00466 skipws(ios_base& __base) 00467 { 00468 __base.setf(ios_base::skipws); 00469 return __base; 00470 } 00471 00472 inline ios_base& 00473 noskipws(ios_base& __base) 00474 { 00475 __base.unsetf(ios_base::skipws); 00476 return __base; 00477 } 00478 00479 inline ios_base& 00480 uppercase(ios_base& __base) 00481 { 00482 __base.setf(ios_base::uppercase); 00483 return __base; 00484 } 00485 00486 inline ios_base& 00487 nouppercase(ios_base& __base) 00488 { 00489 __base.unsetf(ios_base::uppercase); 00490 return __base; 00491 } 00492 00493 inline ios_base& 00494 unitbuf(ios_base& __base) 00495 { 00496 __base.setf(ios_base::unitbuf); 00497 return __base; 00498 } 00499 00500 inline ios_base& 00501 nounitbuf(ios_base& __base) 00502 { 00503 __base.unsetf(ios_base::unitbuf); 00504 return __base; 00505 } 00506 00507 // 27.4.5.2 adjustfield anipulators: 00508 inline ios_base& 00509 internal(ios_base& __base) 00510 { 00511 __base.setf(ios_base::internal, ios_base::adjustfield); 00512 return __base; 00513 } 00514 00515 inline ios_base& 00516 left(ios_base& __base) 00517 { 00518 __base.setf(ios_base::left, ios_base::adjustfield); 00519 return __base; 00520 } 00521 00522 inline ios_base& 00523 right(ios_base& __base) 00524 { 00525 __base.setf(ios_base::right, ios_base::adjustfield); 00526 return __base; 00527 } 00528 00529 // 27.4.5.3 basefield anipulators: 00530 inline ios_base& 00531 dec(ios_base& __base) 00532 { 00533 __base.setf(ios_base::dec, ios_base::basefield); 00534 return __base; 00535 } 00536 00537 inline ios_base& 00538 hex(ios_base& __base) 00539 { 00540 __base.setf(ios_base::hex, ios_base::basefield); 00541 return __base; 00542 } 00543 00544 inline ios_base& 00545 oct(ios_base& __base) 00546 { 00547 __base.setf(ios_base::oct, ios_base::basefield); 00548 return __base; 00549 } 00550 00551 // 27.4.5.4 floatfield anipulators: 00552 inline ios_base& 00553 fixed(ios_base& __base) 00554 { 00555 __base.setf(ios_base::fixed, ios_base::floatfield); 00556 return __base; 00557 } 00558 00559 inline ios_base& 00560 scientific(ios_base& __base) 00561 { 00562 __base.setf(ios_base::scientific, ios_base::floatfield); 00563 return __base; 00564 } 00565 00566 } // namespace std 00567 00568 #endif /* _CPP_BITS_IOSBASE_H */ 00569 Generated on Mon Apr 8 03:11:26 2002 for libstdc++-v3 Source by ![]() |