williamr@2: /* williamr@4: * Portions Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. williamr@4: * williamr@2: * Copyright (c) 1999 williamr@2: * Silicon Graphics Computer Systems, Inc. williamr@2: * williamr@4: * Copyright (c) 1999 williamr@2: * Boris Fomitchev williamr@2: * williamr@2: * This material is provided "as is", with absolutely no warranty expressed williamr@2: * or implied. Any use is at your own risk. williamr@2: * williamr@4: * Permission to use or copy this software for any purpose is hereby granted williamr@2: * without fee, provided the above notices are retained on all copies. williamr@2: * Permission to modify the code and to distribute modified code is granted, williamr@2: * provided the above notices are retained, and a notice that the code was williamr@2: * modified is included with the above copyright notice. williamr@2: * williamr@4: */ williamr@2: #ifndef _STLP_IOS_BASE_H williamr@2: #define _STLP_IOS_BASE_H williamr@2: williamr@4: #ifndef _STLP_INTERNAL_STDEXCEPT_BASE williamr@4: # include williamr@2: #endif williamr@4: williamr@2: #ifndef _STLP_UTILITY williamr@4: # include williamr@2: #endif williamr@4: williamr@2: #ifndef _STLP_INTERNAL_LOCALE_H williamr@4: # include williamr@2: #endif williamr@4: williamr@4: #ifndef _STLP_INTERNAL_STRING_H williamr@4: # include williamr@2: #endif williamr@2: williamr@2: _STLP_BEGIN_NAMESPACE williamr@2: williamr@2: // ---------------------------------------------------------------------- williamr@2: williamr@2: // Class ios_base. This is the base class of the ios hierarchy, which williamr@2: // includes basic_istream and basic_ostream. Classes in the ios williamr@2: // hierarchy are actually quite simple: they are just glorified williamr@2: // wrapper classes. They delegate buffering and physical character williamr@2: // manipulation to the streambuf classes, and they delegate most williamr@2: // formatting tasks to a locale. williamr@2: williamr@2: class _STLP_CLASS_DECLSPEC ios_base { williamr@2: public: williamr@4: williamr@2: class _STLP_CLASS_DECLSPEC failure : public __Named_exception { williamr@2: public: williamr@2: _STLP_DECLSPEC explicit failure(const string&); williamr@2: _STLP_DECLSPEC virtual ~failure() _STLP_NOTHROW_INHERENTLY; williamr@2: }; williamr@2: williamr@2: typedef int fmtflags; williamr@2: typedef int iostate; williamr@2: typedef int openmode; williamr@2: typedef int seekdir; williamr@2: williamr@2: # ifndef _STLP_NO_ANACHRONISMS williamr@2: typedef fmtflags fmt_flags; williamr@2: # endif williamr@2: williamr@2: // Formatting flags. williamr@4: #if defined (_STLP_STATIC_CONST_INIT_BUG) williamr@2: enum { williamr@4: #else williamr@4: // boris : type for all those constants is int williamr@2: static const int williamr@4: #endif williamr@2: left = 0x0001, williamr@2: right = 0x0002, williamr@2: internal = 0x0004, williamr@2: dec = 0x0008, williamr@2: hex = 0x0010, williamr@2: oct = 0x0020, williamr@2: fixed = 0x0040, williamr@2: scientific = 0x0080, williamr@2: boolalpha = 0x0100, williamr@2: showbase = 0x0200, williamr@2: showpoint = 0x0400, williamr@2: showpos = 0x0800, williamr@2: skipws = 0x1000, williamr@2: unitbuf = 0x2000, williamr@2: uppercase = 0x4000, williamr@2: adjustfield = left | right | internal, williamr@2: basefield = dec | hex | oct, williamr@2: floatfield = scientific | fixed, williamr@4: williamr@2: // State flags. williamr@2: goodbit = 0x00, williamr@2: badbit = 0x01, williamr@2: eofbit = 0x02, williamr@2: failbit = 0x04, williamr@4: williamr@2: // Openmode flags. williamr@2: __default_mode = 0x0, /* implementation detail */ williamr@2: app = 0x01, williamr@2: ate = 0x02, williamr@2: binary = 0x04, williamr@2: in = 0x08, williamr@2: out = 0x10, williamr@2: trunc = 0x20, williamr@4: williamr@2: // Seekdir flags williamr@4: williamr@2: beg = 0x01, williamr@2: cur = 0x02, williamr@2: end = 0x04 williamr@2: # ifdef _STLP_STATIC_CONST_INIT_BUG williamr@2: } williamr@2: # endif williamr@2: ; williamr@2: williamr@2: public: // Flag-manipulation functions. williamr@2: fmtflags flags() const { return _M_fmtflags; } williamr@2: fmtflags flags(fmtflags __flags) { williamr@2: fmtflags __tmp = _M_fmtflags; williamr@2: _M_fmtflags = __flags; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: fmtflags setf(fmtflags __flag) { williamr@2: fmtflags __tmp = _M_fmtflags; williamr@2: _M_fmtflags |= __flag; williamr@2: return __tmp; williamr@2: } williamr@2: fmtflags setf(fmtflags __flag, fmtflags __mask) { williamr@2: fmtflags __tmp = _M_fmtflags; williamr@2: _M_fmtflags &= ~__mask; williamr@2: _M_fmtflags |= __flag & __mask; williamr@2: return __tmp; williamr@2: } williamr@2: void unsetf(fmtflags __mask) { _M_fmtflags &= ~__mask; } williamr@2: williamr@2: streamsize precision() const { return _M_precision; } williamr@2: streamsize precision(streamsize __newprecision) { williamr@2: streamsize __tmp = _M_precision; williamr@2: _M_precision = __newprecision; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: streamsize width() const { return _M_width; } williamr@2: streamsize width(streamsize __newwidth) { williamr@2: streamsize __tmp = _M_width; williamr@2: _M_width = __newwidth; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: public: // Locales williamr@2: _STLP_DECLSPEC locale imbue(const locale&); williamr@4: locale getloc() const { return _M_locale; } williamr@2: williamr@2: public: // Auxiliary storage. williamr@2: _STLP_DECLSPEC static int _STLP_CALL xalloc(); williamr@2: _STLP_DECLSPEC long& iword(int __index); williamr@2: _STLP_DECLSPEC void*& pword(int __index); williamr@2: williamr@2: public: // Destructor. williamr@2: _STLP_DECLSPEC virtual ~ios_base(); williamr@2: williamr@2: public: // Callbacks. williamr@2: enum event { erase_event, imbue_event, copyfmt_event }; williamr@2: typedef void (*event_callback)(event, ios_base&, int __index); williamr@2: _STLP_DECLSPEC void register_callback(event_callback __fn, int __index); williamr@2: williamr@2: public: // This member function affects only williamr@2: // the eight predefined ios objects: williamr@2: // cin, cout, etc. williamr@2: _STLP_DECLSPEC static bool _STLP_CALL sync_with_stdio(bool __sync = true); williamr@2: williamr@2: public: // The C++ standard requires only that these williamr@2: // member functions be defined in basic_ios. williamr@2: // We define them in the non-template williamr@2: // base class to avoid code duplication. williamr@2: operator void*() const { return !fail() ? (void*) __CONST_CAST(ios_base*,this) : (void*) 0; } williamr@2: bool operator!() const { return fail(); } williamr@2: williamr@2: iostate rdstate() const { return _M_iostate; } williamr@2: williamr@2: bool good() const { return _M_iostate == 0; } williamr@2: bool eof() const { return (_M_iostate & eofbit) != 0; } williamr@2: bool fail() const { return (_M_iostate & (failbit | badbit)) != 0; } williamr@2: bool bad() const { return (_M_iostate & badbit) != 0; } williamr@2: williamr@2: protected: // The functional protected interface. williamr@2: williamr@2: // Copies the state of __x to *this. This member function makes it williamr@2: // possible to implement basic_ios::copyfmt without having to expose williamr@2: // ios_base's private data members. Does not copy _M_exception_mask williamr@2: // or _M_iostate. williamr@2: _STLP_DECLSPEC void _M_copy_state(const ios_base& __x); williamr@2: williamr@2: void _M_setstate_nothrow(iostate __state) { _M_iostate |= __state; } williamr@2: void _M_clear_nothrow(iostate __state) { _M_iostate = __state; } williamr@2: iostate _M_get_exception_mask() const { return _M_exception_mask; } williamr@2: void _M_set_exception_mask(iostate __mask) { _M_exception_mask = __mask; } williamr@4: void _M_check_exception_mask() { williamr@2: if (_M_iostate & _M_exception_mask) williamr@4: _M_throw_failure(); williamr@2: } williamr@2: williamr@2: _STLP_DECLSPEC void _M_invoke_callbacks(event); williamr@4: _STLP_DECLSPEC void _STLP_FUNCTION_THROWS _M_throw_failure(); williamr@2: williamr@2: _STLP_DECLSPEC ios_base(); // Default constructor. williamr@2: williamr@2: protected: // Initialization of the I/O system williamr@2: static void _STLP_CALL _S_initialize(); williamr@2: static void _STLP_CALL _S_uninitialize(); williamr@4: # if defined(__SYMBIAN32__WSD__) williamr@4: public: williamr@4: static void ios_base_S_was_synced_init() williamr@4: { williamr@4: get_ios_base_S_was_synced() = true; williamr@4: } williamr@4: protected: williamr@4: static inline bool& get_ios_base_S_was_synced(); williamr@4: #else williamr@4: static bool _S_was_synced; williamr@4: # endif //__SYMBIAN32__WSD__ williamr@4: williamr@4: williamr@2: private: // Invalidate the copy constructor and williamr@2: // assignment operator. williamr@2: ios_base(const ios_base&); williamr@2: void operator=(const ios_base&); williamr@2: williamr@2: private: // Data members. williamr@2: williamr@2: fmtflags _M_fmtflags; // Flags williamr@2: iostate _M_iostate; williamr@2: openmode _M_openmode; williamr@2: seekdir _M_seekdir; williamr@2: iostate _M_exception_mask; williamr@2: williamr@2: streamsize _M_precision; williamr@2: streamsize _M_width; williamr@2: williamr@2: locale _M_locale; williamr@2: williamr@2: pair* _M_callbacks; williamr@2: size_t _M_num_callbacks; // Size of the callback array. williamr@2: size_t _M_callback_index; // Index of the next available callback; williamr@2: // initially zero. williamr@2: williamr@2: long* _M_iwords; // Auxiliary storage. The count is zero williamr@2: size_t _M_num_iwords; // if and only if the pointer is null. williamr@2: williamr@2: void** _M_pwords; williamr@2: size_t _M_num_pwords; williamr@2: williamr@2: protected: williamr@2: // Cached copies of the curent locale's facets. Set by init() and imbue(). williamr@2: locale::facet* _M_cached_ctype; williamr@2: locale::facet* _M_cached_numpunct; williamr@2: string _M_cached_grouping; williamr@2: public: williamr@2: // Equivalent to &use_facet< Facet >(getloc()), but faster. williamr@2: const locale::facet* _M_ctype_facet() const { return _M_cached_ctype; } williamr@2: const locale::facet* _M_numpunct_facet() const { return _M_cached_numpunct; } williamr@2: const string& _M_grouping() const { return _M_cached_grouping; } williamr@2: public: williamr@2: williamr@2: // ---------------------------------------------------------------------- williamr@2: // Nested initializer class. This is an implementation detail, but it's williamr@4: // prescribed by the standard. The static initializer object (on williamr@2: // implementations where such a thing is required) is declared in williamr@2: // williamr@2: williamr@4: class _STLP_CLASS_DECLSPEC Init williamr@4: { williamr@4: public: williamr@4: _STLP_DECLSPEC Init(); williamr@4: _STLP_DECLSPEC ~Init(); williamr@4: # if defined(__SYMBIAN32__WSD__) williamr@4: static inline void ios_base_Init_S_count_init() williamr@4: { williamr@4: get_ios_base_Init_S_count() = 0; williamr@4: } williamr@4: private: williamr@4: static inline long& get_ios_base_Init_S_count(); williamr@4: #else williamr@4: private: williamr@4: static long _S_count; williamr@4: # endif //__SYMBIAN32__WSD__ williamr@4: friend class ios_base; williamr@2: }; williamr@2: williamr@2: friend class Init; williamr@2: williamr@2: public: williamr@2: # ifndef _STLP_NO_ANACHRONISMS williamr@2: // 31.6 Old iostreams members [depr.ios.members] williamr@2: typedef iostate io_state; williamr@2: typedef openmode open_mode; williamr@2: typedef seekdir seek_dir; williamr@2: typedef _STLP_STD::streamoff streamoff; williamr@2: typedef _STLP_STD::streampos streampos; williamr@4: # endif williamr@2: }; williamr@2: williamr@2: // ---------------------------------------------------------------------- williamr@2: // ios_base manipulator functions, from section 27.4.5 of the C++ standard. williamr@2: // All of them are trivial one-line wrapper functions. williamr@2: williamr@2: // fmtflag manipulators, section 27.4.5.1 williamr@2: inline ios_base& _STLP_CALL boolalpha(ios_base& __s) williamr@2: { __s.setf(ios_base::boolalpha); return __s;} williamr@2: williamr@2: inline ios_base& _STLP_CALL noboolalpha(ios_base& __s) williamr@2: { __s.unsetf(ios_base::boolalpha); return __s;} williamr@2: williamr@2: inline ios_base& _STLP_CALL showbase(ios_base& __s) williamr@2: { __s.setf(ios_base::showbase); return __s;} williamr@2: williamr@2: inline ios_base& _STLP_CALL noshowbase(ios_base& __s) williamr@2: { __s.unsetf(ios_base::showbase); return __s;} williamr@2: williamr@2: inline ios_base& _STLP_CALL showpoint(ios_base& __s) williamr@2: { __s.setf(ios_base::showpoint); return __s;} williamr@2: williamr@2: inline ios_base& _STLP_CALL noshowpoint(ios_base& __s) williamr@2: { __s.unsetf(ios_base::showpoint); return __s;} williamr@2: williamr@2: inline ios_base& _STLP_CALL showpos(ios_base& __s) williamr@2: { __s.setf(ios_base::showpos); return __s;} williamr@2: williamr@4: inline ios_base& _STLP_CALL noshowpos(ios_base& __s) williamr@2: { __s.unsetf(ios_base::showpos); return __s;} williamr@2: williamr@2: inline ios_base& _STLP_CALL skipws(ios_base& __s) williamr@2: { __s.setf(ios_base::skipws); return __s;} williamr@2: williamr@2: inline ios_base& _STLP_CALL noskipws(ios_base& __s) williamr@2: { __s.unsetf(ios_base::skipws); return __s;} williamr@2: williamr@2: inline ios_base& _STLP_CALL uppercase(ios_base& __s) williamr@2: { __s.setf(ios_base::uppercase); return __s;} williamr@2: williamr@2: inline ios_base& _STLP_CALL nouppercase(ios_base& __s) williamr@2: { __s.unsetf(ios_base::uppercase); return __s;} williamr@2: williamr@2: inline ios_base& _STLP_CALL unitbuf(ios_base& __s) williamr@2: { __s.setf(ios_base::unitbuf); return __s;} williamr@2: williamr@2: inline ios_base& _STLP_CALL nounitbuf(ios_base& __s) williamr@2: { __s.unsetf(ios_base::unitbuf); return __s;} williamr@2: williamr@2: williamr@2: // adjustfield manipulators, section 27.4.5.2 williamr@2: inline ios_base& _STLP_CALL internal(ios_base& __s) williamr@2: { __s.setf(ios_base::internal, ios_base::adjustfield); return __s; } williamr@2: williamr@2: inline ios_base& _STLP_CALL left(ios_base& __s) williamr@2: { __s.setf(ios_base::left, ios_base::adjustfield); return __s; } williamr@2: williamr@2: inline ios_base& _STLP_CALL right(ios_base& __s) williamr@2: { __s.setf(ios_base::right, ios_base::adjustfield); return __s; } williamr@2: williamr@2: // basefield manipulators, section 27.4.5.3 williamr@2: inline ios_base& _STLP_CALL dec(ios_base& __s) williamr@2: { __s.setf(ios_base::dec, ios_base::basefield); return __s; } williamr@2: williamr@4: inline ios_base& _STLP_CALL hex(ios_base& __s) williamr@2: { __s.setf(ios_base::hex, ios_base::basefield); return __s; } williamr@2: williamr@2: inline ios_base& _STLP_CALL oct(ios_base& __s) williamr@2: { __s.setf(ios_base::oct, ios_base::basefield); return __s; } williamr@2: williamr@2: williamr@2: // floatfield manipulators, section 27.4.5.3 williamr@2: inline ios_base& _STLP_CALL fixed(ios_base& __s) williamr@2: { __s.setf(ios_base::fixed, ios_base::floatfield); return __s; } williamr@2: williamr@2: inline ios_base& _STLP_CALL scientific(ios_base& __s) williamr@2: { __s.setf(ios_base::scientific, ios_base::floatfield); return __s; } williamr@2: williamr@2: _STLP_END_NAMESPACE williamr@2: williamr@2: #endif /* _STLP_IOS_BASE */ williamr@2: williamr@2: // Local Variables: williamr@2: // mode:C++ williamr@2: // End: williamr@2: