3 * Silicon Graphics Computer Systems, Inc.
8 * This material is provided "as is", with absolutely no warranty expressed
9 * or implied. Any use is at your own risk.
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.
18 #ifndef _STLP_INTERNAL_IOS_H
19 #define _STLP_INTERNAL_IOS_H
22 #ifndef _STLP_IOS_BASE_H
23 # include <stl/_ios_base.h>
26 #ifndef _STLP_INTERNAL_CTYPE_H
27 # include <stl/_ctype.h>
30 #ifndef _STLP_INTERNAL_NUMPUNCT_H
31 # include <stl/_numpunct.h>
36 // ----------------------------------------------------------------------
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.
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.
47 template <class _CharT
, class _Traits
>
48 class basic_ios
: public ios_base
{
49 friend class ios_base
;
50 public: // 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
;
57 public: // Constructor, destructor.
58 explicit basic_ios(basic_streambuf
<_CharT
, _Traits
>* __streambuf
);
59 virtual ~basic_ios() {}
61 public: // Members from clause 27.4.4.2
62 basic_ostream
<_CharT
, _Traits
>* tie() const {
63 return _M_tied_ostream
;
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
;
72 basic_streambuf
<_CharT
, _Traits
>* rdbuf() const
73 { return _M_streambuf
; }
75 basic_streambuf
<_CharT
, _Traits
>*
76 rdbuf(basic_streambuf
<char_type
, traits_type
>*);
78 // Copies __x's state to *this.
79 basic_ios
<_CharT
, _Traits
>& copyfmt(const basic_ios
<_CharT
, _Traits
>& __x
);
81 char_type
fill() const { return _M_fill
; }
82 char_type
fill(char_type __fill
) {
83 char_type
__tmp(_M_fill
);
88 public: // Members from 27.4.4.3. These four functions
89 // can almost be defined in ios_base.
91 void clear(iostate __state
= goodbit
) {
92 _M_clear_nothrow(this->rdbuf() ? __state
: iostate(__state
|ios_base::badbit
));
93 _M_check_exception_mask();
95 void setstate(iostate __state
) { this->clear(rdstate() | __state
); }
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());
103 public: // Locale-related member functions.
104 locale
imbue(const locale
&);
106 inline char narrow(_CharT
, char) const ;
107 inline _CharT
widen(char) const;
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
);
116 // Cached copy of the curent locale's ctype facet. Set by init() and imbue().
117 const ctype
<char_type
>* _M_cached_ctype
;
120 // Equivalent to &use_facet< Facet >(getloc()), but faster.
121 const ctype
<char_type
>* _M_ctype_facet() const { return _M_cached_ctype
; }
126 void init(basic_streambuf
<_CharT
, _Traits
>* __streambuf
);
130 // Helper function used in istream and ostream. It is called only from
132 void _M_handle_exception(ios_base::iostate __flag
);
134 private: // Data members
135 char_type _M_fill
; // The fill character, used for padding.
137 basic_streambuf
<_CharT
, _Traits
>* _M_streambuf
;
138 basic_ostream
<_CharT
, _Traits
>* _M_tied_ostream
;
143 template <class _CharT
, class _Traits
>
145 basic_ios
<_CharT
, _Traits
>::narrow(_CharT __c
, char __default
) const
146 { return _M_ctype_facet()->narrow(__c
, __default
); }
148 template <class _CharT
, class _Traits
>
150 basic_ios
<_CharT
, _Traits
>::widen(char __c
) const
151 { return _M_ctype_facet()->widen(__c
); }
153 # if !defined (_STLP_NO_METHOD_SPECIALIZATION)
156 basic_ios
<char, char_traits
<char> >::narrow(char __c
, char) const
163 basic_ios
<char, char_traits
<char> >::widen(char __c
) const
167 # endif /* _STLP_NO_METHOD_SPECIALIZATION */
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> >;
174 # endif /* _STLP_USE_TEMPLATE_EXPORT */
178 #if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) && !defined (_STLP_LINK_TIME_INSTANTIATION)
179 # include <stl/_ios.c>
182 #endif /* _STLP_IOS */