]>
Commit | Line | Data |
---|---|---|
54c1bf78 | 1 | // Input streams -*- C++ -*- |
de96ac46 | 2 | |
ffe94f83 | 3 | // Copyright (C) 1997, 1998, 1999, 2001, 2002 Free Software Foundation, Inc. |
de96ac46 BK |
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 | ||
54c1bf78 BK |
30 | // |
31 | // ISO C++ 14882: 27.6.1 Input streams | |
32 | // | |
33 | ||
ffe94f83 PE |
34 | /** @file istream |
35 | * This is a Standard C++ Library header. You should @c #include this header | |
36 | * in your programs, rather than any of the "st[dl]_*.h" implementation files. | |
2f9d51b8 PE |
37 | */ |
38 | ||
725dc051 | 39 | #ifndef _CPP_ISTREAM |
54c1bf78 BK |
40 | #define _CPP_ISTREAM 1 |
41 | ||
42 | #pragma GCC system_header | |
43 | ||
44 | #include <ios> | |
45 | #include <limits> // For numeric_limits | |
46 | ||
47 | namespace std | |
48 | { | |
49 | // 27.6.1.1 Template class basic_istream | |
50 | template<typename _CharT, typename _Traits> | |
51 | class basic_istream : virtual public basic_ios<_CharT, _Traits> | |
52 | { | |
53 | public: | |
54 | // Types (inherited from basic_ios (27.4.4)): | |
55 | typedef _CharT char_type; | |
56 | typedef typename _Traits::int_type int_type; | |
57 | typedef typename _Traits::pos_type pos_type; | |
58 | typedef typename _Traits::off_type off_type; | |
59 | typedef _Traits traits_type; | |
60 | ||
61 | // Non-standard Types: | |
62 | typedef basic_streambuf<_CharT, _Traits> __streambuf_type; | |
63 | typedef basic_ios<_CharT, _Traits> __ios_type; | |
64 | typedef basic_istream<_CharT, _Traits> __istream_type; | |
65 | typedef istreambuf_iterator<_CharT, _Traits> __istreambuf_iter; | |
66 | typedef num_get<_CharT, __istreambuf_iter> __numget_type; | |
67 | typedef ctype<_CharT> __ctype_type; | |
68 | ||
69 | protected: | |
70 | // Data Members: | |
71 | streamsize _M_gcount; | |
72 | ||
73 | public: | |
74 | // 27.6.1.1.1 Constructor/destructor: | |
75 | explicit | |
76 | basic_istream(__streambuf_type* __sb) | |
77 | { | |
78 | this->init(__sb); | |
79 | _M_gcount = streamsize(0); | |
80 | } | |
81 | ||
82 | virtual | |
83 | ~basic_istream() | |
84 | { _M_gcount = streamsize(0); } | |
85 | ||
86 | // 27.6.1.1.2 Prefix/suffix: | |
87 | class sentry; | |
88 | friend class sentry; | |
89 | ||
90 | // 27.6.1.2 Formatted input: | |
91 | // 27.6.1.2.3 basic_istream::operator>> | |
92 | __istream_type& | |
93 | operator>>(__istream_type& (*__pf)(__istream_type&)); | |
94 | ||
95 | __istream_type& | |
96 | operator>>(__ios_type& (*__pf)(__ios_type&)); | |
97 | ||
98 | __istream_type& | |
99 | operator>>(ios_base& (*__pf)(ios_base&)); | |
100 | ||
101 | // 27.6.1.2.2 Arithmetic Extractors | |
102 | __istream_type& | |
103 | operator>>(bool& __n); | |
104 | ||
105 | __istream_type& | |
106 | operator>>(short& __n); | |
107 | ||
108 | __istream_type& | |
109 | operator>>(unsigned short& __n); | |
110 | ||
111 | __istream_type& | |
112 | operator>>(int& __n); | |
113 | ||
114 | __istream_type& | |
115 | operator>>(unsigned int& __n); | |
116 | ||
117 | __istream_type& | |
118 | operator>>(long& __n); | |
119 | ||
120 | __istream_type& | |
121 | operator>>(unsigned long& __n); | |
122 | ||
123 | #ifdef _GLIBCPP_USE_LONG_LONG | |
124 | __istream_type& | |
125 | operator>>(long long& __n); | |
126 | ||
127 | __istream_type& | |
128 | operator>>(unsigned long long& __n); | |
725dc051 | 129 | #endif |
54c1bf78 BK |
130 | |
131 | __istream_type& | |
132 | operator>>(float& __f); | |
133 | ||
134 | __istream_type& | |
135 | operator>>(double& __f); | |
136 | ||
137 | __istream_type& | |
138 | operator>>(long double& __f); | |
139 | ||
140 | __istream_type& | |
141 | operator>>(void*& __p); | |
142 | ||
143 | __istream_type& | |
144 | operator>>(__streambuf_type* __sb); | |
145 | ||
146 | // 27.6.1.3 Unformatted input: | |
147 | inline streamsize | |
148 | gcount(void) const | |
149 | { return _M_gcount; } | |
150 | ||
151 | int_type | |
152 | get(void); | |
153 | ||
154 | __istream_type& | |
155 | get(char_type& __c); | |
156 | ||
157 | __istream_type& | |
158 | get(char_type* __s, streamsize __n, char_type __delim); | |
159 | ||
160 | inline __istream_type& | |
161 | get(char_type* __s, streamsize __n) | |
162 | { return this->get(__s, __n, this->widen('\n')); } | |
163 | ||
164 | __istream_type& | |
165 | get(__streambuf_type& __sb, char_type __delim); | |
166 | ||
167 | inline __istream_type& | |
168 | get(__streambuf_type& __sb) | |
169 | { return this->get(__sb, this->widen('\n')); } | |
170 | ||
171 | __istream_type& | |
172 | getline(char_type* __s, streamsize __n, char_type __delim); | |
173 | ||
174 | inline __istream_type& | |
175 | getline(char_type* __s, streamsize __n) | |
176 | { return this->getline(__s, __n, this->widen('\n')); } | |
177 | ||
178 | __istream_type& | |
179 | ignore(streamsize __n = 1, int_type __delim = traits_type::eof()); | |
180 | ||
181 | int_type | |
182 | peek(void); | |
183 | ||
184 | __istream_type& | |
185 | read(char_type* __s, streamsize __n); | |
186 | ||
187 | streamsize | |
188 | readsome(char_type* __s, streamsize __n); | |
189 | ||
190 | __istream_type& | |
191 | putback(char_type __c); | |
192 | ||
193 | __istream_type& | |
194 | unget(void); | |
195 | ||
196 | int | |
197 | sync(void); | |
198 | ||
199 | pos_type | |
200 | tellg(void); | |
201 | ||
202 | __istream_type& | |
203 | seekg(pos_type); | |
204 | ||
205 | __istream_type& | |
206 | seekg(off_type, ios_base::seekdir); | |
54c1bf78 BK |
207 | }; |
208 | ||
209 | template<typename _CharT, typename _Traits> | |
210 | class basic_istream<_CharT, _Traits>::sentry | |
211 | { | |
212 | public: | |
213 | typedef _Traits traits_type; | |
214 | typedef basic_streambuf<_CharT, _Traits> __streambuf_type; | |
215 | typedef basic_istream<_CharT, _Traits> __istream_type; | |
216 | typedef typename __istream_type::__ctype_type __ctype_type; | |
217 | typedef typename _Traits::int_type __int_type; | |
218 | ||
219 | explicit | |
220 | sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws = false); | |
221 | ||
222 | operator bool() { return _M_ok; } | |
223 | ||
224 | private: | |
225 | bool _M_ok; | |
226 | }; | |
227 | ||
228 | // 27.6.1.2.3 Character extraction templates | |
229 | template<typename _CharT, typename _Traits> | |
230 | basic_istream<_CharT, _Traits>& | |
231 | operator>>(basic_istream<_CharT, _Traits>& __in, _CharT& __c); | |
232 | ||
233 | template<class _Traits> | |
234 | basic_istream<char, _Traits>& | |
235 | operator>>(basic_istream<char, _Traits>& __in, unsigned char& __c) | |
236 | { return (__in >> reinterpret_cast<char&>(__c)); } | |
237 | ||
238 | template<class _Traits> | |
239 | basic_istream<char, _Traits>& | |
240 | operator>>(basic_istream<char, _Traits>& __in, signed char& __c) | |
241 | { return (__in >> reinterpret_cast<char&>(__c)); } | |
242 | ||
243 | template<typename _CharT, typename _Traits> | |
244 | basic_istream<_CharT, _Traits>& | |
245 | operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s); | |
246 | ||
247 | template<class _Traits> | |
248 | basic_istream<char,_Traits>& | |
249 | operator>>(basic_istream<char,_Traits>& __in, unsigned char* __s) | |
250 | { return (__in >> reinterpret_cast<char*>(__s)); } | |
251 | ||
252 | template<class _Traits> | |
253 | basic_istream<char,_Traits>& | |
254 | operator>>(basic_istream<char,_Traits>& __in, signed char* __s) | |
255 | { return (__in >> reinterpret_cast<char*>(__s)); } | |
256 | ||
257 | // 27.6.1.5 Template class basic_iostream | |
258 | template<typename _CharT, typename _Traits> | |
259 | class basic_iostream | |
a32e3c09 | 260 | : public basic_istream<_CharT, _Traits>, |
54c1bf78 BK |
261 | public basic_ostream<_CharT, _Traits> |
262 | { | |
263 | public: | |
bcc6a03a BK |
264 | #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS |
265 | // 271. basic_iostream missing typedefs | |
266 | // Types (inherited): | |
267 | typedef _CharT char_type; | |
268 | typedef typename _Traits::int_type int_type; | |
269 | typedef typename _Traits::pos_type pos_type; | |
270 | typedef typename _Traits::off_type off_type; | |
271 | typedef _Traits traits_type; | |
272 | #endif | |
273 | ||
54c1bf78 BK |
274 | // Non-standard Types: |
275 | typedef basic_istream<_CharT, _Traits> __istream_type; | |
276 | typedef basic_ostream<_CharT, _Traits> __ostream_type; | |
277 | ||
278 | explicit | |
279 | basic_iostream(basic_streambuf<_CharT, _Traits>* __sb) | |
280 | : __istream_type(__sb), __ostream_type(__sb) | |
281 | { } | |
282 | ||
283 | virtual | |
284 | ~basic_iostream() { } | |
285 | }; | |
286 | ||
287 | // 27.6.1.4 Standard basic_istream manipulators | |
288 | template<typename _CharT, typename _Traits> | |
289 | basic_istream<_CharT, _Traits>& | |
290 | ws(basic_istream<_CharT, _Traits>& __is); | |
291 | } // namespace std | |
292 | ||
293 | #ifdef _GLIBCPP_NO_TEMPLATE_EXPORT | |
294 | # define export | |
a32e3c09 | 295 | #endif |
54c1bf78 BK |
296 | #ifdef _GLIBCPP_FULLY_COMPLIANT_HEADERS |
297 | # include <bits/istream.tcc> | |
298 | #endif | |
54c1bf78 BK |
299 | |
300 | #endif /* _CPP_ISTREAM */ |