1/* 2 * Copyright (c) 1999 3 * Silicon Graphics Computer Systems, Inc. 4 * 5 * Copyright (c) 1999 6 * Boris Fomitchev 7 * 8 * This material is provided "as is", with absolutely no warranty expressed 9 * or implied. Any use is at your own risk. 10 * 11 * Permission to use or copy this software for any purpose is hereby granted 12 * without fee, provided the above notices are retained on all copies. 13 * Permission to modify the code and to distribute modified code is granted, 14 * provided the above notices are retained, and a notice that the code was 15 * modified is included with the above copyright notice. 16 * 17 */ 18#ifndef _STLP_INTERNAL_IOS_H 19#define _STLP_INTERNAL_IOS_H 20 21 22#ifndef _STLP_IOS_BASE_H 23# include <stl/_ios_base.h> 24#endif 25 26#ifndef _STLP_INTERNAL_CTYPE_H 27# include <stl/_ctype.h> 28#endif 29 30#ifndef _STLP_INTERNAL_NUMPUNCT_H 31# include <stl/_numpunct.h> 32#endif 33 34_STLP_BEGIN_NAMESPACE 35 36// ---------------------------------------------------------------------- 37 38// Class basic_ios, a subclass of ios_base. The only important difference 39// between the two is that basic_ios is a class template, parameterized 40// by the character type. ios_base exists to factor out all of the 41// common properties that don't depend on the character type. 42 43// The second template parameter, _Traits, defaults to char_traits<_CharT>. 44// The default is declared in header <iosfwd>, and it isn't declared here 45// because C++ language rules do not allow it to be declared twice. 46 47template <class _CharT, class _Traits> 48class basic_ios : public ios_base { 49 friend class ios_base; 50public: // Synonyms for types. 51 typedef _CharT char_type; 52 typedef typename _Traits::int_type int_type; 53 typedef typename _Traits::pos_type pos_type; 54 typedef typename _Traits::off_type off_type; 55 typedef _Traits traits_type; 56 57public: // Constructor, destructor. 58 explicit basic_ios(basic_streambuf<_CharT, _Traits>* __streambuf); 59 virtual ~basic_ios() {} 60 61public: // Members from clause 27.4.4.2 62 basic_ostream<_CharT, _Traits>* tie() const { 63 return _M_tied_ostream; 64 } 65 basic_ostream<_CharT, _Traits>* 66 tie(basic_ostream<char_type, traits_type>* __new_tied_ostream) { 67 basic_ostream<char_type, traits_type>* __tmp = _M_tied_ostream; 68 _M_tied_ostream = __new_tied_ostream; 69 return __tmp; 70 } 71 72 basic_streambuf<_CharT, _Traits>* rdbuf() const 73 { return _M_streambuf; } 74 75 basic_streambuf<_CharT, _Traits>* 76 rdbuf(basic_streambuf<char_type, traits_type>*); 77 78 // Copies __x's state to *this. 79 basic_ios<_CharT, _Traits>& copyfmt(const basic_ios<_CharT, _Traits>& __x); 80 81 char_type fill() const { return _M_fill; } 82 char_type fill(char_type __fill) { 83 char_type __tmp(_M_fill); 84 _M_fill = __fill; 85 return __tmp; 86 } 87 88public: // Members from 27.4.4.3. These four functions 89 // can almost be defined in ios_base. 90 91 void clear(iostate __state = goodbit) { 92 _M_clear_nothrow(this->rdbuf() ? __state : iostate(__state|ios_base::badbit)); 93 _M_check_exception_mask(); 94 } 95 void setstate(iostate __state) { this->clear(rdstate() | __state); } 96 97 iostate exceptions() const { return this->_M_get_exception_mask(); } 98 void exceptions(iostate __mask) { 99 this->_M_set_exception_mask(__mask); 100 this->clear(this->rdstate()); 101 } 102 103public: // Locale-related member functions. 104 locale imbue(const locale&); 105 106 inline char narrow(_CharT, char) const ; 107 inline _CharT widen(char) const; 108 109 // Helper function that makes testing for EOF more convenient. 110 static bool _STLP_CALL _S_eof(int_type __c) { 111 const int_type __eof = _Traits::eof(); 112 return _Traits::eq_int_type(__c, __eof); 113 } 114 115protected: 116 // Cached copy of the curent locale's ctype facet. Set by init() and imbue(). 117 const ctype<char_type>* _M_cached_ctype; 118 119public: 120 // Equivalent to &use_facet< Facet >(getloc()), but faster. 121 const ctype<char_type>* _M_ctype_facet() const { return _M_cached_ctype; } 122 123protected: 124 basic_ios(); 125 126 void init(basic_streambuf<_CharT, _Traits>* __streambuf); 127 128public: 129 130 // Helper function used in istream and ostream. It is called only from 131 // a catch clause. 132 void _M_handle_exception(ios_base::iostate __flag); 133 134private: // Data members 135 char_type _M_fill; // The fill character, used for padding. 136 137 basic_streambuf<_CharT, _Traits>* _M_streambuf; 138 basic_ostream<_CharT, _Traits>* _M_tied_ostream; 139 140}; 141 142 143template <class _CharT, class _Traits> 144inline char 145basic_ios<_CharT, _Traits>::narrow(_CharT __c, char __default) const 146{ return _M_ctype_facet()->narrow(__c, __default); } 147 148template <class _CharT, class _Traits> 149inline _CharT 150basic_ios<_CharT, _Traits>::widen(char __c) const 151{ return _M_ctype_facet()->widen(__c); } 152 153# if !defined (_STLP_NO_METHOD_SPECIALIZATION) 154_STLP_TEMPLATE_NULL 155inline char 156basic_ios<char, char_traits<char> >::narrow(char __c, char) const 157{ 158 return __c; 159} 160 161_STLP_TEMPLATE_NULL 162inline char 163basic_ios<char, char_traits<char> >::widen(char __c) const 164{ 165 return __c; 166} 167# endif /* _STLP_NO_METHOD_SPECIALIZATION */ 168 169# if defined (_STLP_USE_TEMPLATE_EXPORT) 170_STLP_EXPORT_TEMPLATE_CLASS basic_ios<char, char_traits<char> >; 171# if ! defined (_STLP_NO_WCHAR_T) 172_STLP_EXPORT_TEMPLATE_CLASS basic_ios<wchar_t, char_traits<wchar_t> >; 173# endif 174# endif /* _STLP_USE_TEMPLATE_EXPORT */ 175 176_STLP_END_NAMESPACE 177 178#if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) && !defined (_STLP_LINK_TIME_INSTANTIATION) 179# include <stl/_ios.c> 180#endif 181 182#endif /* _STLP_IOS */ 183 184// Local Variables: 185// mode:C++ 186// End: 187 188