1    	// Iostreams base classes -*- C++ -*-
2    	
3    	// Copyright (C) 1997-2013 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 3, 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   	// Under Section 7 of GPL version 3, you are granted additional
17   	// permissions described in the GCC Runtime Library Exception, version
18   	// 3.1, as published by the Free Software Foundation.
19   	
20   	// You should have received a copy of the GNU General Public License and
21   	// a copy of the GCC Runtime Library Exception along with this program;
22   	// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23   	// <http://www.gnu.org/licenses/>.
24   	
25   	/** @file bits/basic_ios.h
26   	 *  This is an internal header file, included by other library headers.
27   	 *  Do not attempt to use it directly. @headername{ios}
28   	 */
29   	
30   	#ifndef _BASIC_IOS_H
31   	#define _BASIC_IOS_H 1
32   	
33   	#pragma GCC system_header
34   	
35   	#include <bits/localefwd.h>
36   	#include <bits/locale_classes.h>
37   	#include <bits/locale_facets.h>
38   	#include <bits/streambuf_iterator.h>
39   	
40   	namespace std _GLIBCXX_VISIBILITY(default)
41   	{
42   	_GLIBCXX_BEGIN_NAMESPACE_VERSION
43   	
44   	  template<typename _Facet>
45   	    inline const _Facet&
46   	    __check_facet(const _Facet* __f)
47   	    {
48   	      if (!__f)
49   		__throw_bad_cast();
50   	      return *__f;
51   	    }
52   	
53   	  /**
54   	   *  @brief Template class basic_ios, virtual base class for all
55   	   *  stream classes. 
56   	   *  @ingroup io
57   	   *
58   	   *  @tparam _CharT  Type of character stream.
59   	   *  @tparam _Traits  Traits for character type, defaults to
60   	   *                   char_traits<_CharT>.
61   	   *
62   	   *  Most of the member functions called dispatched on stream objects
63   	   *  (e.g., @c std::cout.foo(bar);) are consolidated in this class.
64   	  */
65   	  template<typename _CharT, typename _Traits>
66   	    class basic_ios : public ios_base
67   	    {
68   	    public:
69   	      //@{
70   	      /**
71   	       *  These are standard types.  They permit a standardized way of
72   	       *  referring to names of (or names dependent on) the template
73   	       *  parameters, which are specific to the implementation.
74   	      */
75   	      typedef _CharT                                 char_type;
76   	      typedef typename _Traits::int_type             int_type;
77   	      typedef typename _Traits::pos_type             pos_type;
78   	      typedef typename _Traits::off_type             off_type;
79   	      typedef _Traits                                traits_type;
80   	      //@}
81   	
82   	      //@{
83   	      /**
84   	       *  These are non-standard types.
85   	      */
86   	      typedef ctype<_CharT>                          __ctype_type;
87   	      typedef num_put<_CharT, ostreambuf_iterator<_CharT, _Traits> >
88   							     __num_put_type;
89   	      typedef num_get<_CharT, istreambuf_iterator<_CharT, _Traits> >
90   							     __num_get_type;
91   	      //@}
92   	
93   	      // Data members:
94   	    protected:
95   	      basic_ostream<_CharT, _Traits>*                _M_tie;
96   	      mutable char_type                              _M_fill;
97   	      mutable bool                                   _M_fill_init;
98   	      basic_streambuf<_CharT, _Traits>*              _M_streambuf;
99   	
100  	      // Cached use_facet<ctype>, which is based on the current locale info.
101  	      const __ctype_type*                            _M_ctype;
102  	      // For ostream.
103  	      const __num_put_type*                          _M_num_put;
104  	      // For istream.
105  	      const __num_get_type*                          _M_num_get;
106  	
107  	    public:
108  	      //@{
109  	      /**
110  	       *  @brief  The quick-and-easy status check.
111  	       *
112  	       *  This allows you to write constructs such as
113  	       *  <code>if (!a_stream) ...</code> and <code>while (a_stream) ...</code>
114  	      */
115  	      operator void*() const
116  	      { return this->fail() ? 0 : const_cast<basic_ios*>(this); }
117  	
118  	      bool
119  	      operator!() const
120  	      { return this->fail(); }
121  	      //@}
122  	
123  	      /**
124  	       *  @brief  Returns the error state of the stream buffer.
125  	       *  @return  A bit pattern (well, isn't everything?)
126  	       *
127  	       *  See std::ios_base::iostate for the possible bit values.  Most
128  	       *  users will call one of the interpreting wrappers, e.g., good().
129  	      */
130  	      iostate
131  	      rdstate() const
132  	      { return _M_streambuf_state; }
133  	
134  	      /**
135  	       *  @brief  [Re]sets the error state.
136  	       *  @param  __state  The new state flag(s) to set.
137  	       *
138  	       *  See std::ios_base::iostate for the possible bit values.  Most
139  	       *  users will not need to pass an argument.
140  	      */
141  	      void
142  	      clear(iostate __state = goodbit);
143  	
144  	      /**
145  	       *  @brief  Sets additional flags in the error state.
146  	       *  @param  __state  The additional state flag(s) to set.
147  	       *
148  	       *  See std::ios_base::iostate for the possible bit values.
149  	      */
150  	      void
151  	      setstate(iostate __state)
152  	      { this->clear(this->rdstate() | __state); }
153  	
154  	      // Flip the internal state on for the proper state bits, then re
155  	      // throws the propagated exception if bit also set in
156  	      // exceptions().
157  	      void
158  	      _M_setstate(iostate __state)
159  	      {
160  		// 27.6.1.2.1 Common requirements.
161  		// Turn this on without causing an ios::failure to be thrown.
162  		_M_streambuf_state |= __state;
163  		if (this->exceptions() & __state)
164  		  __throw_exception_again;
165  	      }
166  	
167  	      /**
168  	       *  @brief  Fast error checking.
169  	       *  @return  True if no error flags are set.
170  	       *
171  	       *  A wrapper around rdstate.
172  	      */
173  	      bool
174  	      good() const
175  	      { return this->rdstate() == 0; }
176  	
177  	      /**
178  	       *  @brief  Fast error checking.
179  	       *  @return  True if the eofbit is set.
180  	       *
181  	       *  Note that other iostate flags may also be set.
182  	      */
183  	      bool
184  	      eof() const
185  	      { return (this->rdstate() & eofbit) != 0; }
186  	
187  	      /**
188  	       *  @brief  Fast error checking.
189  	       *  @return  True if either the badbit or the failbit is set.
190  	       *
191  	       *  Checking the badbit in fail() is historical practice.
192  	       *  Note that other iostate flags may also be set.
193  	      */
194  	      bool
195  	      fail() const
196  	      { return (this->rdstate() & (badbit | failbit)) != 0; }
197  	
198  	      /**
199  	       *  @brief  Fast error checking.
200  	       *  @return  True if the badbit is set.
201  	       *
202  	       *  Note that other iostate flags may also be set.
203  	      */
204  	      bool
205  	      bad() const
206  	      { return (this->rdstate() & badbit) != 0; }
207  	
208  	      /**
209  	       *  @brief  Throwing exceptions on errors.
210  	       *  @return  The current exceptions mask.
211  	       *
212  	       *  This changes nothing in the stream.  See the one-argument version
213  	       *  of exceptions(iostate) for the meaning of the return value.
214  	      */
215  	      iostate
216  	      exceptions() const
217  	      { return _M_exception; }
218  	
219  	      /**
220  	       *  @brief  Throwing exceptions on errors.
221  	       *  @param  __except  The new exceptions mask.
222  	       *
223  	       *  By default, error flags are set silently.  You can set an
224  	       *  exceptions mask for each stream; if a bit in the mask becomes set
225  	       *  in the error flags, then an exception of type
226  	       *  std::ios_base::failure is thrown.
227  	       *
228  	       *  If the error flag is already set when the exceptions mask is
229  	       *  added, the exception is immediately thrown.  Try running the
230  	       *  following under GCC 3.1 or later:
231  	       *  @code
232  	       *  #include <iostream>
233  	       *  #include <fstream>
234  	       *  #include <exception>
235  	       *
236  	       *  int main()
237  	       *  {
238  	       *      std::set_terminate (__gnu_cxx::__verbose_terminate_handler);
239  	       *
240  	       *      std::ifstream f ("/etc/motd");
241  	       *
242  	       *      std::cerr << "Setting badbit\n";
243  	       *      f.setstate (std::ios_base::badbit);
244  	       *
245  	       *      std::cerr << "Setting exception mask\n";
246  	       *      f.exceptions (std::ios_base::badbit);
247  	       *  }
248  	       *  @endcode
249  	      */
250  	      void
251  	      exceptions(iostate __except)
252  	      {
253  	        _M_exception = __except;
254  	        this->clear(_M_streambuf_state);
255  	      }
256  	
257  	      // Constructor/destructor:
258  	      /**
259  	       *  @brief  Constructor performs initialization.
260  	       *
261  	       *  The parameter is passed by derived streams.
262  	      */
263  	      explicit
264  	      basic_ios(basic_streambuf<_CharT, _Traits>* __sb)
265  	      : ios_base(), _M_tie(0), _M_fill(), _M_fill_init(false), _M_streambuf(0),
266  		_M_ctype(0), _M_num_put(0), _M_num_get(0)
267  	      { this->init(__sb); }
268  	
269  	      /**
270  	       *  @brief  Empty.
271  	       *
272  	       *  The destructor does nothing.  More specifically, it does not
273  	       *  destroy the streambuf held by rdbuf().
274  	      */
275  	      virtual
276  	      ~basic_ios() { }
277  	
278  	      // Members:
279  	      /**
280  	       *  @brief  Fetches the current @e tied stream.
281  	       *  @return  A pointer to the tied stream, or NULL if the stream is
282  	       *           not tied.
283  	       *
284  	       *  A stream may be @e tied (or synchronized) to a second output
285  	       *  stream.  When this stream performs any I/O, the tied stream is
286  	       *  first flushed.  For example, @c std::cin is tied to @c std::cout.
287  	      */
288  	      basic_ostream<_CharT, _Traits>*
289  	      tie() const
290  	      { return _M_tie; }
291  	
292  	      /**
293  	       *  @brief  Ties this stream to an output stream.
294  	       *  @param  __tiestr  The output stream.
295  	       *  @return  The previously tied output stream, or NULL if the stream
296  	       *           was not tied.
297  	       *
298  	       *  This sets up a new tie; see tie() for more.
299  	      */
300  	      basic_ostream<_CharT, _Traits>*
301  	      tie(basic_ostream<_CharT, _Traits>* __tiestr)
302  	      {
303  	        basic_ostream<_CharT, _Traits>* __old = _M_tie;
304  	        _M_tie = __tiestr;
305  	        return __old;
306  	      }
307  	
308  	      /**
309  	       *  @brief  Accessing the underlying buffer.
310  	       *  @return  The current stream buffer.
311  	       *
312  	       *  This does not change the state of the stream.
313  	      */
314  	      basic_streambuf<_CharT, _Traits>*
315  	      rdbuf() const
316  	      { return _M_streambuf; }
317  	
318  	      /**
319  	       *  @brief  Changing the underlying buffer.
320  	       *  @param  __sb  The new stream buffer.
321  	       *  @return  The previous stream buffer.
322  	       *
323  	       *  Associates a new buffer with the current stream, and clears the
324  	       *  error state.
325  	       *
326  	       *  Due to historical accidents which the LWG refuses to correct, the
327  	       *  I/O library suffers from a design error:  this function is hidden
328  	       *  in derived classes by overrides of the zero-argument @c rdbuf(),
329  	       *  which is non-virtual for hysterical raisins.  As a result, you
330  	       *  must use explicit qualifications to access this function via any
331  	       *  derived class.  For example:
332  	       *
333  	       *  @code
334  	       *  std::fstream     foo;         // or some other derived type
335  	       *  std::streambuf*  p = .....;
336  	       *
337  	       *  foo.ios::rdbuf(p);            // ios == basic_ios<char>
338  	       *  @endcode
339  	      */
340  	      basic_streambuf<_CharT, _Traits>*
341  	      rdbuf(basic_streambuf<_CharT, _Traits>* __sb);
342  	
343  	      /**
344  	       *  @brief  Copies fields of __rhs into this.
345  	       *  @param  __rhs  The source values for the copies.
346  	       *  @return  Reference to this object.
347  	       *
348  	       *  All fields of __rhs are copied into this object except that rdbuf()
349  	       *  and rdstate() remain unchanged.  All values in the pword and iword
350  	       *  arrays are copied.  Before copying, each callback is invoked with
351  	       *  erase_event.  After copying, each (new) callback is invoked with
352  	       *  copyfmt_event.  The final step is to copy exceptions().
353  	      */
354  	      basic_ios&
355  	      copyfmt(const basic_ios& __rhs);
356  	
357  	      /**
358  	       *  @brief  Retrieves the @a empty character.
359  	       *  @return  The current fill character.
360  	       *
361  	       *  It defaults to a space (' ') in the current locale.
362  	      */
363  	      char_type
364  	      fill() const
365  	      {
366  		if (!_M_fill_init)
367  		  {
368  		    _M_fill = this->widen(' ');
369  		    _M_fill_init = true;
370  		  }
371  		return _M_fill;
372  	      }
373  	
374  	      /**
375  	       *  @brief  Sets a new @a empty character.
376  	       *  @param  __ch  The new character.
377  	       *  @return  The previous fill character.
378  	       *
379  	       *  The fill character is used to fill out space when P+ characters
380  	       *  have been requested (e.g., via setw), Q characters are actually
381  	       *  used, and Q<P.  It defaults to a space (' ') in the current locale.
382  	      */
383  	      char_type
384  	      fill(char_type __ch)
385  	      {
386  		char_type __old = this->fill();
387  		_M_fill = __ch;
388  		return __old;
389  	      }
390  	
391  	      // Locales:
392  	      /**
393  	       *  @brief  Moves to a new locale.
394  	       *  @param  __loc  The new locale.
395  	       *  @return  The previous locale.
396  	       *
397  	       *  Calls @c ios_base::imbue(loc), and if a stream buffer is associated
398  	       *  with this stream, calls that buffer's @c pubimbue(loc).
399  	       *
400  	       *  Additional l10n notes are at
401  	       *  http://gcc.gnu.org/onlinedocs/libstdc++/manual/localization.html
402  	      */
403  	      locale
404  	      imbue(const locale& __loc);
405  	
406  	      /**
407  	       *  @brief  Squeezes characters.
408  	       *  @param  __c  The character to narrow.
409  	       *  @param  __dfault  The character to narrow.
410  	       *  @return  The narrowed character.
411  	       *
412  	       *  Maps a character of @c char_type to a character of @c char,
413  	       *  if possible.
414  	       *
415  	       *  Returns the result of
416  	       *  @code
417  	       *    std::use_facet<ctype<char_type> >(getloc()).narrow(c,dfault)
418  	       *  @endcode
419  	       *
420  	       *  Additional l10n notes are at
421  	       *  http://gcc.gnu.org/onlinedocs/libstdc++/manual/localization.html
422  	      */
423  	      char
424  	      narrow(char_type __c, char __dfault) const
425  	      { return __check_facet(_M_ctype).narrow(__c, __dfault); }
426  	
427  	      /**
428  	       *  @brief  Widens characters.
429  	       *  @param  __c  The character to widen.
430  	       *  @return  The widened character.
431  	       *
432  	       *  Maps a character of @c char to a character of @c char_type.
433  	       *
434  	       *  Returns the result of
435  	       *  @code
436  	       *    std::use_facet<ctype<char_type> >(getloc()).widen(c)
437  	       *  @endcode
438  	       *
439  	       *  Additional l10n notes are at
440  	       *  http://gcc.gnu.org/onlinedocs/libstdc++/manual/localization.html
441  	      */
442  	      char_type
443  	      widen(char __c) const
444  	      { return __check_facet(_M_ctype).widen(__c); }
445  	
446  	    protected:
447  	      // 27.4.5.1  basic_ios constructors
448  	      /**
449  	       *  @brief  Empty.
450  	       *
451  	       *  The default constructor does nothing and is not normally
452  	       *  accessible to users.
453  	      */
454  	      basic_ios()
455  	      : ios_base(), _M_tie(0), _M_fill(char_type()), _M_fill_init(false), 
456  		_M_streambuf(0), _M_ctype(0), _M_num_put(0), _M_num_get(0)
457  	      { }
458  	
459  	      /**
460  	       *  @brief  All setup is performed here.
461  	       *
462  	       *  This is called from the public constructor.  It is not virtual and
463  	       *  cannot be redefined.
464  	      */
465  	      void
466  	      init(basic_streambuf<_CharT, _Traits>* __sb);
467  	
468  	      void
469  	      _M_cache_locale(const locale& __loc);
470  	    };
471  	
472  	_GLIBCXX_END_NAMESPACE_VERSION
473  	} // namespace
474  	
475  	#include <bits/basic_ios.tcc>
476  	
477  	#endif /* _BASIC_IOS_H */
478