williamr@2: /* williamr@2: * © Portions copyright (c) 2006-2007 Nokia Corporation. All rights reserved. williamr@2: * Copyright (c) 1999 williamr@2: * Silicon Graphics Computer Systems, Inc. williamr@2: * williamr@2: * 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@2: * 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@2: */ williamr@2: #ifndef _STLP_INTERNAL_IOS_H williamr@2: #define _STLP_INTERNAL_IOS_H williamr@2: williamr@2: williamr@2: #ifndef _STLP_IOS_BASE_H williamr@2: # include williamr@2: #endif williamr@2: williamr@2: #ifndef _STLP_INTERNAL_CTYPE_H williamr@2: # include williamr@2: #endif williamr@2: #ifndef _STLP_INTERNAL_NUMPUNCT_H williamr@2: # include williamr@2: #endif williamr@2: williamr@2: _STLP_BEGIN_NAMESPACE williamr@2: williamr@2: // ---------------------------------------------------------------------- williamr@2: williamr@2: // Class basic_ios, a subclass of ios_base. The only important difference williamr@2: // between the two is that basic_ios is a class template, parameterized williamr@2: // by the character type. ios_base exists to factor out all of the williamr@2: // common properties that don't depend on the character type. williamr@2: williamr@2: // The second template parameter, _Traits, defaults to char_traits<_CharT>. williamr@2: // The default is declared in header , and it isn't declared here williamr@2: // because C++ language rules do not allow it to be declared twice. williamr@2: williamr@2: template williamr@2: #ifdef __SYMBIAN32__ williamr@2: class basic_ios : public ios_base { williamr@2: #else williamr@2: class basic_ios : public ios_base { williamr@2: #endif williamr@2: friend class ios_base; williamr@2: public: // Synonyms for types. williamr@2: typedef _CharT char_type; williamr@2: typedef typename _Traits::int_type int_type; williamr@2: typedef typename _Traits::pos_type pos_type; williamr@2: typedef typename _Traits::off_type off_type; williamr@2: typedef _Traits traits_type; williamr@2: williamr@2: public: // Constructor, destructor. williamr@2: explicit basic_ios(basic_streambuf<_CharT, _Traits>* __streambuf); williamr@2: virtual ~basic_ios() {} williamr@2: williamr@2: public: // Members from clause 27.4.4.2 williamr@2: basic_ostream<_CharT, _Traits>* tie() const { williamr@2: return _M_tied_ostream; williamr@2: } williamr@2: basic_ostream<_CharT, _Traits>* williamr@2: tie(basic_ostream* __new_tied_ostream) { williamr@2: basic_ostream* __tmp = _M_tied_ostream; williamr@2: _M_tied_ostream = __new_tied_ostream; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: basic_streambuf<_CharT, _Traits>* rdbuf() const williamr@2: { return _M_streambuf; } williamr@2: williamr@2: basic_streambuf<_CharT, _Traits>* williamr@2: rdbuf(basic_streambuf*); williamr@2: williamr@2: // Copies __x's state to *this. williamr@2: basic_ios<_CharT, _Traits>& copyfmt(const basic_ios<_CharT, _Traits>& __x); williamr@2: williamr@2: char_type fill() const { return _M_fill; } williamr@2: char_type fill(char_type __fill) { williamr@2: char_type __tmp(_M_fill); williamr@2: _M_fill = __fill; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: public: // Members from 27.4.4.3. These four functions williamr@2: // can almost be defined in ios_base. williamr@2: williamr@2: void clear(iostate __state = goodbit) { williamr@2: _M_clear_nothrow(this->rdbuf() ? __state : iostate(__state|ios_base::badbit)); williamr@2: _M_check_exception_mask(); williamr@2: } williamr@2: void setstate(iostate __state) { this->clear(rdstate() | __state); } williamr@2: williamr@2: iostate exceptions() const { return this->_M_get_exception_mask(); } williamr@2: void exceptions(iostate __mask) { williamr@2: this->_M_set_exception_mask(__mask); williamr@2: this->clear(this->rdstate()); williamr@2: } williamr@2: williamr@2: public: // Locale-related member functions. williamr@2: locale imbue(const locale&); williamr@2: williamr@2: inline char narrow(_CharT, char) const ; williamr@2: inline _CharT widen(char) const; williamr@2: williamr@2: // Helper function that makes testing for EOF more convenient. williamr@2: static bool _STLP_CALL _S_eof(int_type __c) { williamr@2: const int_type __eof = _Traits::eof(); williamr@2: return _Traits::eq_int_type(__c, __eof); williamr@2: } williamr@2: williamr@2: protected: williamr@2: basic_ios(); williamr@2: williamr@2: void init(basic_streambuf<_CharT, _Traits>* __streambuf); williamr@2: williamr@2: public: williamr@2: williamr@2: // Helper function used in istream and ostream. It is called only from williamr@2: // a catch clause. williamr@2: void _M_handle_exception(ios_base::iostate __flag); williamr@2: williamr@2: private: // Data members williamr@2: char_type _M_fill; // The fill character, used for padding. williamr@2: williamr@2: basic_streambuf<_CharT, _Traits>* _M_streambuf; williamr@2: basic_ostream<_CharT, _Traits>* _M_tied_ostream; williamr@2: williamr@2: }; williamr@2: williamr@2: williamr@2: template williamr@2: inline char williamr@2: basic_ios<_CharT, _Traits>::narrow(_CharT __c, char __default) const williamr@2: { return ((const ctype<_CharT>*)this->_M_ctype_facet())->narrow(__c, __default); } williamr@2: williamr@2: template williamr@2: inline _CharT williamr@2: basic_ios<_CharT, _Traits>::widen(char __c) const williamr@2: { williamr@2: return ((const ctype<_CharT>*)this->_M_ctype_facet())->widen(__c); } williamr@2: williamr@2: # if defined (_STLP_USE_TEMPLATE_EXPORT) williamr@2: _STLP_EXPORT_TEMPLATE_CLASS basic_ios >; williamr@2: # if ! defined (_STLP_NO_WCHAR_T) williamr@2: _STLP_EXPORT_TEMPLATE_CLASS basic_ios >; williamr@2: # endif williamr@2: # endif /* _STLP_USE_TEMPLATE_EXPORT */ williamr@2: williamr@2: # if !defined (_STLP_NO_METHOD_SPECIALIZATION) williamr@2: _STLP_TEMPLATE_NULL williamr@2: inline char williamr@2: basic_ios >::narrow(char __c, char) const williamr@2: { williamr@2: return __c; williamr@2: } williamr@2: williamr@2: _STLP_TEMPLATE_NULL williamr@2: inline char williamr@2: basic_ios >::widen(char __c) const williamr@2: { williamr@2: return __c; williamr@2: } williamr@2: # endif /* _STLP_NO_METHOD_SPECIALIZATION */ williamr@2: williamr@2: williamr@2: _STLP_END_NAMESPACE williamr@2: williamr@2: #if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) && !defined (_STLP_LINK_TIME_INSTANTIATION) williamr@2: # include williamr@2: # endif williamr@2: williamr@2: // The following is needed to ensure that the inlined _Stl_loc_init functions williamr@2: // that ios_base::_Loc_init::_Loc_init() calls are found eventually. williamr@2: // Otherwise, undefined externs may be caused. williamr@2: williamr@2: #if defined(__BORLANDC__) && defined(_RTLDLL) williamr@2: # ifndef _STLP_INTERNAL_NUM_PUT_H williamr@2: # include williamr@2: # endif williamr@2: # ifndef _STLP_INTERNAL_NUM_GET_H williamr@2: # include williamr@2: # endif williamr@2: # ifndef _STLP_INTERNAL_MONETARY_H williamr@2: # include williamr@2: # endif williamr@2: # ifndef _STLP_INTERNAL_TIME_FACETS_H williamr@2: # include williamr@2: # endif williamr@2: #endif williamr@2: williamr@2: #endif /* _STLP_IOS */ williamr@2: williamr@2: // Local Variables: williamr@2: // mode:C++ williamr@2: // End: williamr@2: