| // Iostreams base classes -*- C++ -*- | |
| // Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. | |
| // | |
| // This file is part of the GNU ISO C++ Library. This library is free | |
| // software; you can redistribute it and/or modify it under the | |
| // terms of the GNU General Public License as published by the | |
| // Free Software Foundation; either version 2, or (at your option) | |
| // any later version. | |
| // This library is distributed in the hope that it will be useful, | |
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| // GNU General Public License for more details. | |
| // You should have received a copy of the GNU General Public License along | |
| // with this library; see the file COPYING. If not, write to the Free | |
| // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |
| // USA. | |
| // As a special exception, you may use this file as part of a free software | |
| // library without restriction. Specifically, if other files instantiate | |
| // templates or use macros or inline functions from this file, or you compile | |
| // this file and link it with other files to produce an executable, this | |
| // file does not by itself cause the resulting executable to be covered by | |
| // the GNU General Public License. This exception does not however | |
| // invalidate any other reasons why the executable file might be covered by | |
| // the GNU General Public License. | |
| // | |
| // ISO C++ 14882: 27.8 File-based streams | |
| // | |
| /** @file ios_base.h | |
| * This is an internal header file, included by other library headers. | |
| * You should not attempt to use it directly. | |
| */ | |
| #ifndef _CPP_BITS_IOSBASE_H | |
| #define _CPP_BITS_IOSBASE_H 1 | |
| #pragma GCC system_header | |
| namespace std | |
| { | |
| // The following definitions of bitmask types are enums, not ints, | |
| // as permitted (but not required) in the standard, in order to provide | |
| // better type safety in iostream calls. A side effect is that | |
| // expressions involving them are no longer compile-time constants. | |
| enum _Ios_Fmtflags { _M_ios_fmtflags_end = 1L << 16 }; | |
| inline _Ios_Fmtflags | |
| operator&(_Ios_Fmtflags __a, _Ios_Fmtflags __b) | |
| { return _Ios_Fmtflags(static_cast<int>(__a) & static_cast<int>(__b)); } | |
| inline _Ios_Fmtflags | |
| operator|(_Ios_Fmtflags __a, _Ios_Fmtflags __b) | |
| { return _Ios_Fmtflags(static_cast<int>(__a) | static_cast<int>(__b)); } | |
| inline _Ios_Fmtflags | |
| operator^(_Ios_Fmtflags __a, _Ios_Fmtflags __b) | |
| { return _Ios_Fmtflags(static_cast<int>(__a) ^ static_cast<int>(__b)); } | |
| inline _Ios_Fmtflags | |
| operator|=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b) | |
| { return __a = __a | __b; } | |
| inline _Ios_Fmtflags | |
| operator&=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b) | |
| { return __a = __a & __b; } | |
| inline _Ios_Fmtflags | |
| operator^=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b) | |
| { return __a = __a ^ __b; } | |
| inline _Ios_Fmtflags | |
| operator~(_Ios_Fmtflags __a) | |
| { return _Ios_Fmtflags(~static_cast<int>(__a)); } | |
| enum _Ios_Openmode { _M_ios_openmode_end = 1L << 16 }; | |
| inline _Ios_Openmode | |
| operator&(_Ios_Openmode __a, _Ios_Openmode __b) | |
| { return _Ios_Openmode(static_cast<int>(__a) & static_cast<int>(__b)); } | |
| inline _Ios_Openmode | |
| operator|(_Ios_Openmode __a, _Ios_Openmode __b) | |
| { return _Ios_Openmode(static_cast<int>(__a) | static_cast<int>(__b)); } | |
| inline _Ios_Openmode | |
| operator^(_Ios_Openmode __a, _Ios_Openmode __b) | |
| { return _Ios_Openmode(static_cast<int>(__a) ^ static_cast<int>(__b)); } | |
| inline _Ios_Openmode | |
| operator|=(_Ios_Openmode& __a, _Ios_Openmode __b) | |
| { return __a = __a | __b; } | |
| inline _Ios_Openmode | |
| operator&=(_Ios_Openmode& __a, _Ios_Openmode __b) | |
| { return __a = __a & __b; } | |
| inline _Ios_Openmode | |
| operator^=(_Ios_Openmode& __a, _Ios_Openmode __b) | |
| { return __a = __a ^ __b; } | |
| inline _Ios_Openmode | |
| operator~(_Ios_Openmode __a) | |
| { return _Ios_Openmode(~static_cast<int>(__a)); } | |
| enum _Ios_Iostate { _M_ios_iostate_end = 1L << 16 }; | |
| inline _Ios_Iostate | |
| operator&(_Ios_Iostate __a, _Ios_Iostate __b) | |
| { return _Ios_Iostate(static_cast<int>(__a) & static_cast<int>(__b)); } | |
| inline _Ios_Iostate | |
| operator|(_Ios_Iostate __a, _Ios_Iostate __b) | |
| { return _Ios_Iostate(static_cast<int>(__a) | static_cast<int>(__b)); } | |
| inline _Ios_Iostate | |
| operator^(_Ios_Iostate __a, _Ios_Iostate __b) | |
| { return _Ios_Iostate(static_cast<int>(__a) ^ static_cast<int>(__b)); } | |
| inline _Ios_Iostate | |
| operator|=(_Ios_Iostate& __a, _Ios_Iostate __b) | |
| { return __a = __a | __b; } | |
| inline _Ios_Iostate | |
| operator&=(_Ios_Iostate& __a, _Ios_Iostate __b) | |
| { return __a = __a & __b; } | |
| inline _Ios_Iostate | |
| operator^=(_Ios_Iostate& __a, _Ios_Iostate __b) | |
| { return __a = __a ^ __b; } | |
| inline _Ios_Iostate | |
| operator~(_Ios_Iostate __a) | |
| { return _Ios_Iostate(~static_cast<int>(__a)); } | |
| enum _Ios_Seekdir { _M_ios_seekdir_end = 1L << 16 }; | |
| // 27.4.2 Class ios_base | |
| class ios_base | |
| { | |
| public: | |
| // 27.4.2.1.1 Class ios_base::failure | |
| class failure : public exception | |
| { | |
| public: | |
| #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS | |
| //48. Use of non-existent exception constructor | |
| explicit | |
| failure(const string& __str) throw(); | |
| virtual | |
| ~failure() throw(); | |
| virtual const char* | |
| what() const throw(); | |
| private: | |
| enum { _M_bufsize = 256 }; | |
| char _M_name[_M_bufsize]; | |
| #endif | |
| }; | |
| // 27.4.2.1.2 Type ios_base::fmtflags | |
| typedef _Ios_Fmtflags fmtflags; | |
| // 27.4.2.1.2 Type fmtflags | |
| static const fmtflags boolalpha = fmtflags(__ios_flags::_S_boolalpha); | |
| static const fmtflags dec = fmtflags(__ios_flags::_S_dec); | |
| static const fmtflags fixed = fmtflags(__ios_flags::_S_fixed); | |
| static const fmtflags hex = fmtflags(__ios_flags::_S_hex); | |
| static const fmtflags internal = fmtflags(__ios_flags::_S_internal); | |
| static const fmtflags left = fmtflags(__ios_flags::_S_left); | |
| static const fmtflags oct = fmtflags(__ios_flags::_S_oct); | |
| static const fmtflags right = fmtflags(__ios_flags::_S_right); | |
| static const fmtflags scientific = fmtflags(__ios_flags::_S_scientific); | |
| static const fmtflags showbase = fmtflags(__ios_flags::_S_showbase); | |
| static const fmtflags showpoint = fmtflags(__ios_flags::_S_showpoint); | |
| static const fmtflags showpos = fmtflags(__ios_flags::_S_showpos); | |
| static const fmtflags skipws = fmtflags(__ios_flags::_S_skipws); | |
| static const fmtflags unitbuf = fmtflags(__ios_flags::_S_unitbuf); | |
| static const fmtflags uppercase = fmtflags(__ios_flags::_S_uppercase); | |
| static const fmtflags adjustfield = fmtflags(__ios_flags::_S_adjustfield); | |
| static const fmtflags basefield = fmtflags(__ios_flags::_S_basefield); | |
| static const fmtflags floatfield = fmtflags(__ios_flags::_S_floatfield); | |
| // 27.4.2.1.3 Type ios_base::iostate | |
| typedef _Ios_Iostate iostate; | |
| static const iostate badbit = iostate(__ios_flags::_S_badbit); | |
| static const iostate eofbit = iostate(__ios_flags::_S_eofbit); | |
| static const iostate failbit = iostate(__ios_flags::_S_failbit); | |
| static const iostate goodbit = iostate(0); | |
| // 27.4.2.1.4 Type openmode | |
| typedef _Ios_Openmode openmode; | |
| static const openmode app = openmode(__ios_flags::_S_app); | |
| static const openmode ate = openmode(__ios_flags::_S_ate); | |
| static const openmode binary = openmode(__ios_flags::_S_bin); | |
| static const openmode in = openmode(__ios_flags::_S_in); | |
| static const openmode out = openmode(__ios_flags::_S_out); | |
| static const openmode trunc = openmode(__ios_flags::_S_trunc); | |
| // 27.4.2.1.5 Type seekdir | |
| typedef _Ios_Seekdir seekdir; | |
| static const seekdir beg = seekdir(0); | |
| static const seekdir cur = seekdir(SEEK_CUR); | |
| static const seekdir end = seekdir(SEEK_END); | |
| #ifdef _GLIBCPP_DEPRECATED | |
| typedef int io_state; | |
| typedef int open_mode; | |
| typedef int seek_dir; | |
| #endif | |
| // Callbacks; | |
| enum event | |
| { | |
| erase_event, | |
| imbue_event, | |
| copyfmt_event | |
| }; | |
| typedef void (*event_callback) (event, ios_base&, int); | |
| void | |
| register_callback(event_callback __fn, int __index); | |
| protected: | |
| // Data Members | |
| streamsize _M_precision; | |
| streamsize _M_width; | |
| fmtflags _M_flags; | |
| // 27.4.2.6 Members for callbacks | |
| // 27.4.2.6 ios_base callbacks | |
| struct _Callback_list | |
| { | |
| // Data Members | |
| _Callback_list* _M_next; | |
| ios_base::event_callback _M_fn; | |
| int _M_index; | |
| int _M_refcount; // 0 means one reference. | |
| _Callback_list(ios_base::event_callback __fn, int __index, | |
| _Callback_list* __cb) | |
| : _M_next(__cb), _M_fn(__fn), _M_index(__index), _M_refcount(0) { } | |
| void | |
| _M_add_reference() { ++_M_refcount; } // XXX MT | |
| int | |
| _M_remove_reference() { return _M_refcount--; } // 0 => OK to delete | |
| }; | |
| _Callback_list* _M_callbacks; | |
| void | |
| _M_call_callbacks(event __ev) throw(); | |
| void | |
| _M_dispose_callbacks(void); | |
| // 27.4.2.5 Members for iword/pword storage | |
| struct _Words | |
| { | |
| void* _M_pword; | |
| long _M_iword; | |
| }; | |
| static const int _S_local_words = 8; | |
| _Words _M_word_array[_S_local_words]; // Guaranteed storage | |
| _Words _M_dummy; // Only for failed iword/pword calls. | |
| _Words* _M_words; | |
| int _M_word_limit; | |
| _Words& | |
| _M_grow_words(int __index); | |
| // Members for locale and locale caching. | |
| locale _M_ios_locale; | |
| void | |
| _M_init(); | |
| public: | |
| // 27.4.2.1.6 Class ios_base::Init | |
| // Used to initialize standard streams. In theory, g++ could use | |
| // -finit-priority to order this stuff correctly without going | |
| // through these machinations. | |
| class Init | |
| { | |
| friend class ios_base; | |
| public: | |
| Init(); | |
| ~Init(); | |
| static void | |
| _S_ios_create(bool __sync); | |
| static void | |
| _S_ios_destroy(); | |
| private: | |
| static int _S_ios_base_init; | |
| static bool _S_synced_with_stdio; | |
| }; | |
| // Fmtflags state: | |
| inline fmtflags | |
| flags() const { return _M_flags; } | |
| inline fmtflags | |
| flags(fmtflags __fmtfl) | |
| { | |
| fmtflags __old = _M_flags; | |
| _M_flags = __fmtfl; | |
| return __old; | |
| } | |
| inline fmtflags | |
| setf(fmtflags __fmtfl) | |
| { | |
| fmtflags __old = _M_flags; | |
| _M_flags |= __fmtfl; | |
| return __old; | |
| } | |
| inline fmtflags | |
| setf(fmtflags __fmtfl, fmtflags __mask) | |
| { | |
| fmtflags __old = _M_flags; | |
| _M_flags &= ~__mask; | |
| _M_flags |= (__fmtfl & __mask); | |
| return __old; | |
| } | |
| inline void | |
| unsetf(fmtflags __mask) { _M_flags &= ~__mask; } | |
| inline streamsize | |
| precision() const { return _M_precision; } | |
| inline streamsize | |
| precision(streamsize __prec) | |
| { | |
| streamsize __old = _M_precision; | |
| _M_precision = __prec; | |
| return __old; | |
| } | |
| inline streamsize | |
| width() const { return _M_width; } | |
| inline streamsize | |
| width(streamsize __wide) | |
| { | |
| streamsize __old = _M_width; | |
| _M_width = __wide; | |
| return __old; | |
| } | |
| static bool | |
| sync_with_stdio(bool __sync = true); | |
| // Locales: | |
| locale | |
| imbue(const locale& __loc); | |
| inline locale | |
| getloc() const { return _M_ios_locale; } | |
| // Storage: | |
| static int | |
| xalloc() throw(); | |
| inline long& | |
| iword(int __ix) | |
| { | |
| _Words& __word = (__ix < _M_word_limit) | |
| ? _M_words[__ix] : _M_grow_words(__ix); | |
| return __word._M_iword; | |
| } | |
| inline void*& | |
| pword(int __ix) | |
| { | |
| _Words& __word = (__ix < _M_word_limit) | |
| ? _M_words[__ix] : _M_grow_words(__ix); | |
| return __word._M_pword; | |
| } | |
| // Destructor | |
| ~ios_base(); | |
| protected: | |
| ios_base(); | |
| #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS | |
| //50. Copy constructor and assignment operator of ios_base | |
| private: | |
| ios_base(const ios_base&); | |
| ios_base& | |
| operator=(const ios_base&); | |
| #endif | |
| }; | |
| // 27.4.5.1 fmtflags manipulators: | |
| inline ios_base& | |
| boolalpha(ios_base& __base) | |
| { | |
| __base.setf(ios_base::boolalpha); | |
| return __base; | |
| } | |
| inline ios_base& | |
| noboolalpha(ios_base& __base) | |
| { | |
| __base.unsetf(ios_base::boolalpha); | |
| return __base; | |
| } | |
| inline ios_base& | |
| showbase(ios_base& __base) | |
| { | |
| __base.setf(ios_base::showbase); | |
| return __base; | |
| } | |
| inline ios_base& | |
| noshowbase(ios_base& __base) | |
| { | |
| __base.unsetf(ios_base::showbase); | |
| return __base; | |
| } | |
| inline ios_base& | |
| showpoint(ios_base& __base) | |
| { | |
| __base.setf(ios_base::showpoint); | |
| return __base; | |
| } | |
| inline ios_base& | |
| noshowpoint(ios_base& __base) | |
| { | |
| __base.unsetf(ios_base::showpoint); | |
| return __base; | |
| } | |
| inline ios_base& | |
| showpos(ios_base& __base) | |
| { | |
| __base.setf(ios_base::showpos); | |
| return __base; | |
| } | |
| inline ios_base& | |
| noshowpos(ios_base& __base) | |
| { | |
| __base.unsetf(ios_base::showpos); | |
| return __base; | |
| } | |
| inline ios_base& | |
| skipws(ios_base& __base) | |
| { | |
| __base.setf(ios_base::skipws); | |
| return __base; | |
| } | |
| inline ios_base& | |
| noskipws(ios_base& __base) | |
| { | |
| __base.unsetf(ios_base::skipws); | |
| return __base; | |
| } | |
| inline ios_base& | |
| uppercase(ios_base& __base) | |
| { | |
| __base.setf(ios_base::uppercase); | |
| return __base; | |
| } | |
| inline ios_base& | |
| nouppercase(ios_base& __base) | |
| { | |
| __base.unsetf(ios_base::uppercase); | |
| return __base; | |
| } | |
| inline ios_base& | |
| unitbuf(ios_base& __base) | |
| { | |
| __base.setf(ios_base::unitbuf); | |
| return __base; | |
| } | |
| inline ios_base& | |
| nounitbuf(ios_base& __base) | |
| { | |
| __base.unsetf(ios_base::unitbuf); | |
| return __base; | |
| } | |
| // 27.4.5.2 adjustfield anipulators: | |
| inline ios_base& | |
| internal(ios_base& __base) | |
| { | |
| __base.setf(ios_base::internal, ios_base::adjustfield); | |
| return __base; | |
| } | |
| inline ios_base& | |
| left(ios_base& __base) | |
| { | |
| __base.setf(ios_base::left, ios_base::adjustfield); | |
| return __base; | |
| } | |
| inline ios_base& | |
| right(ios_base& __base) | |
| { | |
| __base.setf(ios_base::right, ios_base::adjustfield); | |
| return __base; | |
| } | |
| // 27.4.5.3 basefield anipulators: | |
| inline ios_base& | |
| dec(ios_base& __base) | |
| { | |
| __base.setf(ios_base::dec, ios_base::basefield); | |
| return __base; | |
| } | |
| inline ios_base& | |
| hex(ios_base& __base) | |
| { | |
| __base.setf(ios_base::hex, ios_base::basefield); | |
| return __base; | |
| } | |
| inline ios_base& | |
| oct(ios_base& __base) | |
| { | |
| __base.setf(ios_base::oct, ios_base::basefield); | |
| return __base; | |
| } | |
| // 27.4.5.4 floatfield anipulators: | |
| inline ios_base& | |
| fixed(ios_base& __base) | |
| { | |
| __base.setf(ios_base::fixed, ios_base::floatfield); | |
| return __base; | |
| } | |
| inline ios_base& | |
| scientific(ios_base& __base) | |
| { | |
| __base.setf(ios_base::scientific, ios_base::floatfield); | |
| return __base; | |
| } | |
| } // namespace std | |
| #endif /* _CPP_BITS_IOSBASE_H */ | |