1 // Iostreams base classes -*- C++ -*-
2 
3 // Copyright (C) 1997, 1998, 1999, 2001, 2002 Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library.  This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 2, or (at your option)
9 // any later version.
10 
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 // GNU General Public License for more details.
15 
16 // You should have received a copy of the GNU General Public License along
17 // with this library; see the file COPYING.  If not, write to the Free
18 // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
19 // USA.
20 
21 // As a special exception, you may use this file as part of a free software
22 // library without restriction.  Specifically, if other files instantiate
23 // templates or use macros or inline functions from this file, or you compile
24 // this file and link it with other files to produce an executable, this
25 // file does not by itself cause the resulting executable to be covered by
26 // the GNU General Public License.  This exception does not however
27 // invalidate any other reasons why the executable file might be covered by
28 // the GNU General Public License.
29 
30 /** @file basic_ios.h
31  *  This is an internal header file, included by other library headers.
32  *  You should not attempt to use it directly.
33  */
34 
35 #ifndef _CPP_BITS_BASICIOS_H
36 #define _CPP_BITS_BASICIOS_H 1
37 
38 #pragma GCC system_header
39 
40 #include <bits/streambuf_iterator.h>
41 #include <bits/locale_facets.h>
42 
43 namespace std
44 {
45   // 27.4.5  Template class basic_ios
46   template<typename _CharT, typename _Traits>
47     class basic_ios : public ios_base
48     {
49     public:
50       // 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 
57       // Non-standard Types:
58       typedef ctype<_CharT>           			__ctype_type;
59       typedef ostreambuf_iterator<_CharT, _Traits>      __ostreambuf_iter;
60       typedef num_put<_CharT, __ostreambuf_iter>        __numput_type;
61       typedef istreambuf_iterator<_CharT, _Traits>	__istreambuf_iter;
62       typedef num_get<_CharT, __istreambuf_iter>        __numget_type;
63 
64       // Data members:
65     protected:
66       basic_ostream<_CharT, _Traits>* 	_M_tie;
67       mutable char_type 		_M_fill;
68       mutable bool			_M_fill_init;
69       basic_streambuf<_CharT, _Traits>* _M_streambuf;
70 
71       // Cached use_facet<ctype>, which is based on the current locale info.
72       const __ctype_type*		_M_fctype;
73       // From ostream.
74       const __numput_type* 		_M_fnumput;
75       // From istream.
76       const __numget_type* 		_M_fnumget;
77 
78     public:
79       operator void*() const
80       { return this->fail() ? 0 : const_cast<basic_ios*>(this); }
81 
82       bool
83       operator!() const
84       { return this->fail(); }
85 
86       iostate
87       rdstate() const
88       { return _M_streambuf_state; }
89 
90       void
91       clear(iostate __state = goodbit);
92 
93       void
94       setstate(iostate __state)
95       { this->clear(this->rdstate() | __state); }
96 
97       bool
98       good() const
99       { return this->rdstate() == 0; }
100 
101       bool
102       eof() const
103       { return (this->rdstate() & eofbit) != 0; }
104 
105       bool
106       fail() const
107       { return (this->rdstate() & (badbit | failbit)) != 0; }
108 
109       bool
110       bad() const
111       { return (this->rdstate() & badbit) != 0; }
112 
113       iostate
114       exceptions() const
115       { return _M_exception; }
116 
117       void
118       exceptions(iostate __except)
119       {
120 	_M_exception = __except;
121 	this->clear(_M_streambuf_state);
122       }
123 
124       // Constructor/destructor:
125       explicit
126       basic_ios(basic_streambuf<_CharT, _Traits>* __sb) : ios_base()
127       { this->init(__sb); }
128 
129       virtual
130       ~basic_ios() { }
131 
132       // Members:
133       basic_ostream<_CharT, _Traits>*
134       tie() const
135       { return _M_tie; }
136 
137       basic_ostream<_CharT, _Traits>*
138       tie(basic_ostream<_CharT, _Traits>* __tiestr)
139       {
140 	basic_ostream<_CharT, _Traits>* __old = _M_tie;
141 	_M_tie = __tiestr;
142 	return __old;
143       }
144 
145       basic_streambuf<_CharT, _Traits>*
146       rdbuf() const
147       { return _M_streambuf; }
148 
149       basic_streambuf<_CharT, _Traits>*
150       rdbuf(basic_streambuf<_CharT, _Traits>* __sb);
151 
152       basic_ios&
153       copyfmt(const basic_ios& __rhs);
154 
155       char_type
156       fill() const
157       {
158 	if (!_M_fill_init)
159 	  {
160 	    _M_fill = this->widen(' ');
161 	    _M_fill_init = true;
162 	  }
163 	return _M_fill;
164       }
165 
166       char_type
167       fill(char_type __ch)
168       {
169 	char_type __old = this->fill();
170 	_M_fill = __ch;
171 	return __old;
172       }
173 
174       // Locales:
175       locale
176       imbue(const locale& __loc);
177 
178       char
179       narrow(char_type __c, char __dfault) const;
180 
181       char_type
182       widen(char __c) const;
183 
184     protected:
185       // 27.4.5.1  basic_ios constructors
186       basic_ios() : ios_base()
187       { }
188 
189       void
190       init(basic_streambuf<_CharT, _Traits>* __sb);
191 
192       bool
193       _M_check_facet(const locale::facet* __f) const
194       {
195 	if (!__f)
196 	  __throw_bad_cast();
197 	return true;
198       }
199 
200       void
201       _M_cache_facets(const locale& __loc);
202     };
203 } // namespace std
204 
205 #ifdef _GLIBCPP_NO_TEMPLATE_EXPORT
206 # define export
207 #include <bits/basic_ios.tcc>
208 #endif
209 
210 #endif /* _CPP_BITS_BASICIOS_H */
211