100db7afdSDavid E. O'Brien // Iostreams base classes -*- C++ -*-
200db7afdSDavid E. O'Brien 
3*f8a1b7d9SAlexander Kabaev // Copyright (C) 1997, 1998, 1999, 2001, 2002, 2003, 2004, 2005
41b86b14eSAlexander Kabaev // Free Software Foundation, Inc.
500db7afdSDavid E. O'Brien //
600db7afdSDavid E. O'Brien // This file is part of the GNU ISO C++ Library.  This library is free
700db7afdSDavid E. O'Brien // software; you can redistribute it and/or modify it under the
800db7afdSDavid E. O'Brien // terms of the GNU General Public License as published by the
900db7afdSDavid E. O'Brien // Free Software Foundation; either version 2, or (at your option)
1000db7afdSDavid E. O'Brien // any later version.
1100db7afdSDavid E. O'Brien 
1200db7afdSDavid E. O'Brien // This library is distributed in the hope that it will be useful,
1300db7afdSDavid E. O'Brien // but WITHOUT ANY WARRANTY; without even the implied warranty of
1400db7afdSDavid E. O'Brien // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1500db7afdSDavid E. O'Brien // GNU General Public License for more details.
1600db7afdSDavid E. O'Brien 
1700db7afdSDavid E. O'Brien // You should have received a copy of the GNU General Public License along
1800db7afdSDavid E. O'Brien // with this library; see the file COPYING.  If not, write to the Free
19*f8a1b7d9SAlexander Kabaev // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
2000db7afdSDavid E. O'Brien // USA.
2100db7afdSDavid E. O'Brien 
2200db7afdSDavid E. O'Brien // As a special exception, you may use this file as part of a free software
2300db7afdSDavid E. O'Brien // library without restriction.  Specifically, if other files instantiate
2400db7afdSDavid E. O'Brien // templates or use macros or inline functions from this file, or you compile
2500db7afdSDavid E. O'Brien // this file and link it with other files to produce an executable, this
2600db7afdSDavid E. O'Brien // file does not by itself cause the resulting executable to be covered by
2700db7afdSDavid E. O'Brien // the GNU General Public License.  This exception does not however
2800db7afdSDavid E. O'Brien // invalidate any other reasons why the executable file might be covered by
2900db7afdSDavid E. O'Brien // the GNU General Public License.
3000db7afdSDavid E. O'Brien 
3100db7afdSDavid E. O'Brien /** @file basic_ios.h
3200db7afdSDavid E. O'Brien  *  This is an internal header file, included by other library headers.
3300db7afdSDavid E. O'Brien  *  You should not attempt to use it directly.
3400db7afdSDavid E. O'Brien  */
3500db7afdSDavid E. O'Brien 
36ffeaf689SAlexander Kabaev #ifndef _BASIC_IOS_H
37ffeaf689SAlexander Kabaev #define _BASIC_IOS_H 1
3800db7afdSDavid E. O'Brien 
3900db7afdSDavid E. O'Brien #pragma GCC system_header
4000db7afdSDavid E. O'Brien 
4100db7afdSDavid E. O'Brien #include <bits/streambuf_iterator.h>
421b86b14eSAlexander Kabaev #include <bits/localefwd.h>
431b86b14eSAlexander Kabaev #include <bits/locale_classes.h>
4400db7afdSDavid E. O'Brien #include <bits/locale_facets.h>
4500db7afdSDavid E. O'Brien 
_GLIBCXX_BEGIN_NAMESPACE(std)46*f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NAMESPACE(std)
47*f8a1b7d9SAlexander Kabaev 
4800db7afdSDavid E. O'Brien   // 27.4.5  Template class basic_ios
491b86b14eSAlexander Kabaev   /**
501b86b14eSAlexander Kabaev    *  @brief  Virtual base class for all stream classes.
511b86b14eSAlexander Kabaev    *
521b86b14eSAlexander Kabaev    *  Most of the member functions called dispatched on stream objects
531b86b14eSAlexander Kabaev    *  (e.g., @c std::cout.foo(bar);) are consolidated in this class.
541b86b14eSAlexander Kabaev   */
5500db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits>
5600db7afdSDavid E. O'Brien     class basic_ios : public ios_base
5700db7afdSDavid E. O'Brien     {
5800db7afdSDavid E. O'Brien     public:
591b86b14eSAlexander Kabaev       //@{
601b86b14eSAlexander Kabaev       /**
611b86b14eSAlexander Kabaev        *  These are standard types.  They permit a standardized way of
621b86b14eSAlexander Kabaev        *  referring to names of (or names dependant on) the template
631b86b14eSAlexander Kabaev        *  parameters, which are specific to the implementation.
641b86b14eSAlexander Kabaev       */
6500db7afdSDavid E. O'Brien       typedef _CharT                                 char_type;
6600db7afdSDavid E. O'Brien       typedef typename _Traits::int_type             int_type;
6700db7afdSDavid E. O'Brien       typedef typename _Traits::pos_type             pos_type;
6800db7afdSDavid E. O'Brien       typedef typename _Traits::off_type             off_type;
6900db7afdSDavid E. O'Brien       typedef _Traits                                traits_type;
701b86b14eSAlexander Kabaev       //@}
7100db7afdSDavid E. O'Brien 
721b86b14eSAlexander Kabaev       //@{
731b86b14eSAlexander Kabaev       /**
741b86b14eSAlexander Kabaev        *  @if maint
751b86b14eSAlexander Kabaev        *  These are non-standard types.
761b86b14eSAlexander Kabaev        *  @endif
771b86b14eSAlexander Kabaev       */
7800db7afdSDavid E. O'Brien       typedef ctype<_CharT>                          __ctype_type;
79ffeaf689SAlexander Kabaev       typedef num_put<_CharT, ostreambuf_iterator<_CharT, _Traits> >
80ffeaf689SAlexander Kabaev 						     __num_put_type;
81ffeaf689SAlexander Kabaev       typedef num_get<_CharT, istreambuf_iterator<_CharT, _Traits> >
82ffeaf689SAlexander Kabaev 						     __num_get_type;
831b86b14eSAlexander Kabaev       //@}
841b86b14eSAlexander Kabaev 
8500db7afdSDavid E. O'Brien       // Data members:
8600db7afdSDavid E. O'Brien     protected:
8700db7afdSDavid E. O'Brien       basic_ostream<_CharT, _Traits>*                _M_tie;
8800db7afdSDavid E. O'Brien       mutable char_type                              _M_fill;
8900db7afdSDavid E. O'Brien       mutable bool                                   _M_fill_init;
9000db7afdSDavid E. O'Brien       basic_streambuf<_CharT, _Traits>*              _M_streambuf;
9100db7afdSDavid E. O'Brien 
9200db7afdSDavid E. O'Brien       // Cached use_facet<ctype>, which is based on the current locale info.
93ffeaf689SAlexander Kabaev       const __ctype_type*                            _M_ctype;
94ffeaf689SAlexander Kabaev       // For ostream.
95ffeaf689SAlexander Kabaev       const __num_put_type*                          _M_num_put;
96ffeaf689SAlexander Kabaev       // For istream.
97ffeaf689SAlexander Kabaev       const __num_get_type*                          _M_num_get;
9800db7afdSDavid E. O'Brien 
9900db7afdSDavid E. O'Brien     public:
1001b86b14eSAlexander Kabaev       //@{
1011b86b14eSAlexander Kabaev       /**
1021b86b14eSAlexander Kabaev        *  @brief  The quick-and-easy status check.
1031b86b14eSAlexander Kabaev        *
1041b86b14eSAlexander Kabaev        *  This allows you to write constructs such as
1051b86b14eSAlexander Kabaev        *  "if (!a_stream) ..." and "while (a_stream) ..."
1061b86b14eSAlexander Kabaev       */
10700db7afdSDavid E. O'Brien       operator void*() const
10800db7afdSDavid E. O'Brien       { return this->fail() ? 0 : const_cast<basic_ios*>(this); }
10900db7afdSDavid E. O'Brien 
11000db7afdSDavid E. O'Brien       bool
11100db7afdSDavid E. O'Brien       operator!() const
11200db7afdSDavid E. O'Brien       { return this->fail(); }
1131b86b14eSAlexander Kabaev       //@}
11400db7afdSDavid E. O'Brien 
1151b86b14eSAlexander Kabaev       /**
1161b86b14eSAlexander Kabaev        *  @brief  Returns the error state of the stream buffer.
1171b86b14eSAlexander Kabaev        *  @return  A bit pattern (well, isn't everything?)
1181b86b14eSAlexander Kabaev        *
1191b86b14eSAlexander Kabaev        *  See std::ios_base::iostate for the possible bit values.  Most
1201b86b14eSAlexander Kabaev        *  users will call one of the interpreting wrappers, e.g., good().
1211b86b14eSAlexander Kabaev       */
12200db7afdSDavid E. O'Brien       iostate
12300db7afdSDavid E. O'Brien       rdstate() const
12400db7afdSDavid E. O'Brien       { return _M_streambuf_state; }
12500db7afdSDavid E. O'Brien 
1261b86b14eSAlexander Kabaev       /**
1271b86b14eSAlexander Kabaev        *  @brief  [Re]sets the error state.
1281b86b14eSAlexander Kabaev        *  @param  state  The new state flag(s) to set.
1291b86b14eSAlexander Kabaev        *
1301b86b14eSAlexander Kabaev        *  See std::ios_base::iostate for the possible bit values.  Most
1311b86b14eSAlexander Kabaev        *  users will not need to pass an argument.
1321b86b14eSAlexander Kabaev       */
13300db7afdSDavid E. O'Brien       void
13400db7afdSDavid E. O'Brien       clear(iostate __state = goodbit);
13500db7afdSDavid E. O'Brien 
1361b86b14eSAlexander Kabaev       /**
1371b86b14eSAlexander Kabaev        *  @brief  Sets additional flags in the error state.
1381b86b14eSAlexander Kabaev        *  @param  state  The additional state flag(s) to set.
1391b86b14eSAlexander Kabaev        *
1401b86b14eSAlexander Kabaev        *  See std::ios_base::iostate for the possible bit values.
1411b86b14eSAlexander Kabaev       */
14200db7afdSDavid E. O'Brien       void
14300db7afdSDavid E. O'Brien       setstate(iostate __state)
14400db7afdSDavid E. O'Brien       { this->clear(this->rdstate() | __state); }
14500db7afdSDavid E. O'Brien 
146ffeaf689SAlexander Kabaev       // Flip the internal state on for the proper state bits, then re
147ffeaf689SAlexander Kabaev       // throws the propagated exception if bit also set in
148ffeaf689SAlexander Kabaev       // exceptions().
149ffeaf689SAlexander Kabaev       void
150ffeaf689SAlexander Kabaev       _M_setstate(iostate __state)
151ffeaf689SAlexander Kabaev       {
152ffeaf689SAlexander Kabaev 	// 27.6.1.2.1 Common requirements.
153ffeaf689SAlexander Kabaev 	// Turn this on without causing an ios::failure to be thrown.
154ffeaf689SAlexander Kabaev 	_M_streambuf_state |= __state;
155ffeaf689SAlexander Kabaev 	if (this->exceptions() & __state)
156ffeaf689SAlexander Kabaev 	  __throw_exception_again;
157ffeaf689SAlexander Kabaev       }
158ffeaf689SAlexander Kabaev 
1591b86b14eSAlexander Kabaev       /**
1601b86b14eSAlexander Kabaev        *  @brief  Fast error checking.
1611b86b14eSAlexander Kabaev        *  @return  True if no error flags are set.
1621b86b14eSAlexander Kabaev        *
1631b86b14eSAlexander Kabaev        *  A wrapper around rdstate.
1641b86b14eSAlexander Kabaev       */
16500db7afdSDavid E. O'Brien       bool
16600db7afdSDavid E. O'Brien       good() const
16700db7afdSDavid E. O'Brien       { return this->rdstate() == 0; }
16800db7afdSDavid E. O'Brien 
1691b86b14eSAlexander Kabaev       /**
1701b86b14eSAlexander Kabaev        *  @brief  Fast error checking.
1711b86b14eSAlexander Kabaev        *  @return  True if the eofbit is set.
1721b86b14eSAlexander Kabaev        *
1731b86b14eSAlexander Kabaev        *  Note that other iostate flags may also be set.
1741b86b14eSAlexander Kabaev       */
17500db7afdSDavid E. O'Brien       bool
17600db7afdSDavid E. O'Brien       eof() const
17700db7afdSDavid E. O'Brien       { return (this->rdstate() & eofbit) != 0; }
17800db7afdSDavid E. O'Brien 
1791b86b14eSAlexander Kabaev       /**
1801b86b14eSAlexander Kabaev        *  @brief  Fast error checking.
1811b86b14eSAlexander Kabaev        *  @return  True if either the badbit or the failbit is set.
1821b86b14eSAlexander Kabaev        *
1831b86b14eSAlexander Kabaev        *  Checking the badbit in fail() is historical practice.
1841b86b14eSAlexander Kabaev        *  Note that other iostate flags may also be set.
1851b86b14eSAlexander Kabaev       */
18600db7afdSDavid E. O'Brien       bool
18700db7afdSDavid E. O'Brien       fail() const
18800db7afdSDavid E. O'Brien       { return (this->rdstate() & (badbit | failbit)) != 0; }
18900db7afdSDavid E. O'Brien 
1901b86b14eSAlexander Kabaev       /**
1911b86b14eSAlexander Kabaev        *  @brief  Fast error checking.
1921b86b14eSAlexander Kabaev        *  @return  True if the badbit is set.
1931b86b14eSAlexander Kabaev        *
1941b86b14eSAlexander Kabaev        *  Note that other iostate flags may also be set.
1951b86b14eSAlexander Kabaev       */
19600db7afdSDavid E. O'Brien       bool
19700db7afdSDavid E. O'Brien       bad() const
19800db7afdSDavid E. O'Brien       { return (this->rdstate() & badbit) != 0; }
19900db7afdSDavid E. O'Brien 
2001b86b14eSAlexander Kabaev       /**
2011b86b14eSAlexander Kabaev        *  @brief  Throwing exceptions on errors.
2021b86b14eSAlexander Kabaev        *  @return  The current exceptions mask.
2031b86b14eSAlexander Kabaev        *
2041b86b14eSAlexander Kabaev        *  This changes nothing in the stream.  See the one-argument version
2051b86b14eSAlexander Kabaev        *  of exceptions(iostate) for the meaning of the return value.
2061b86b14eSAlexander Kabaev       */
20700db7afdSDavid E. O'Brien       iostate
20800db7afdSDavid E. O'Brien       exceptions() const
20900db7afdSDavid E. O'Brien       { return _M_exception; }
21000db7afdSDavid E. O'Brien 
2111b86b14eSAlexander Kabaev       /**
2121b86b14eSAlexander Kabaev        *  @brief  Throwing exceptions on errors.
2131b86b14eSAlexander Kabaev        *  @param  except  The new exceptions mask.
2141b86b14eSAlexander Kabaev        *
2151b86b14eSAlexander Kabaev        *  By default, error flags are set silently.  You can set an
2161b86b14eSAlexander Kabaev        *  exceptions mask for each stream; if a bit in the mask becomes set
2171b86b14eSAlexander Kabaev        *  in the error flags, then an exception of type
2181b86b14eSAlexander Kabaev        *  std::ios_base::failure is thrown.
2191b86b14eSAlexander Kabaev        *
2201b86b14eSAlexander Kabaev        *  If the error flage is already set when the exceptions mask is
2211b86b14eSAlexander Kabaev        *  added, the exception is immediately thrown.  Try running the
2221b86b14eSAlexander Kabaev        *  following under GCC 3.1 or later:
2231b86b14eSAlexander Kabaev        *  @code
2241b86b14eSAlexander Kabaev        *  #include <iostream>
2251b86b14eSAlexander Kabaev        *  #include <fstream>
2261b86b14eSAlexander Kabaev        *  #include <exception>
2271b86b14eSAlexander Kabaev        *
2281b86b14eSAlexander Kabaev        *  int main()
2291b86b14eSAlexander Kabaev        *  {
2301b86b14eSAlexander Kabaev        *      std::set_terminate (__gnu_cxx::__verbose_terminate_handler);
2311b86b14eSAlexander Kabaev        *
2321b86b14eSAlexander Kabaev        *      std::ifstream f ("/etc/motd");
2331b86b14eSAlexander Kabaev        *
2341b86b14eSAlexander Kabaev        *      std::cerr << "Setting badbit\n";
2351b86b14eSAlexander Kabaev        *      f.setstate (std::ios_base::badbit);
2361b86b14eSAlexander Kabaev        *
2371b86b14eSAlexander Kabaev        *      std::cerr << "Setting exception mask\n";
2381b86b14eSAlexander Kabaev        *      f.exceptions (std::ios_base::badbit);
2391b86b14eSAlexander Kabaev        *  }
2401b86b14eSAlexander Kabaev        *  @endcode
2411b86b14eSAlexander Kabaev       */
24200db7afdSDavid E. O'Brien       void
24300db7afdSDavid E. O'Brien       exceptions(iostate __except)
24400db7afdSDavid E. O'Brien       {
24500db7afdSDavid E. O'Brien         _M_exception = __except;
24600db7afdSDavid E. O'Brien         this->clear(_M_streambuf_state);
24700db7afdSDavid E. O'Brien       }
24800db7afdSDavid E. O'Brien 
24900db7afdSDavid E. O'Brien       // Constructor/destructor:
2501b86b14eSAlexander Kabaev       /**
2511b86b14eSAlexander Kabaev        *  @brief  Constructor performs initialization.
2521b86b14eSAlexander Kabaev        *
2531b86b14eSAlexander Kabaev        *  The parameter is passed by derived streams.
2541b86b14eSAlexander Kabaev       */
25500db7afdSDavid E. O'Brien       explicit
256bbe4dd5dSAlexander Kabaev       basic_ios(basic_streambuf<_CharT, _Traits>* __sb)
257ffeaf689SAlexander Kabaev       : ios_base(), _M_tie(0), _M_fill(), _M_fill_init(false), _M_streambuf(0),
258ffeaf689SAlexander Kabaev       _M_ctype(0), _M_num_put(0), _M_num_get(0)
25900db7afdSDavid E. O'Brien       { this->init(__sb); }
26000db7afdSDavid E. O'Brien 
2611b86b14eSAlexander Kabaev       /**
2621b86b14eSAlexander Kabaev        *  @brief  Empty.
2631b86b14eSAlexander Kabaev        *
2641b86b14eSAlexander Kabaev        *  The destructor does nothing.  More specifically, it does not
2651b86b14eSAlexander Kabaev        *  destroy the streambuf held by rdbuf().
2661b86b14eSAlexander Kabaev       */
26700db7afdSDavid E. O'Brien       virtual
26800db7afdSDavid E. O'Brien       ~basic_ios() { }
26900db7afdSDavid E. O'Brien 
27000db7afdSDavid E. O'Brien       // Members:
2711b86b14eSAlexander Kabaev       /**
2721b86b14eSAlexander Kabaev        *  @brief  Fetches the current @e tied stream.
2731b86b14eSAlexander Kabaev        *  @return  A pointer to the tied stream, or NULL if the stream is
2741b86b14eSAlexander Kabaev        *           not tied.
2751b86b14eSAlexander Kabaev        *
2761b86b14eSAlexander Kabaev        *  A stream may be @e tied (or synchronized) to a second output
2771b86b14eSAlexander Kabaev        *  stream.  When this stream performs any I/O, the tied stream is
2781b86b14eSAlexander Kabaev        *  first flushed.  For example, @c std::cin is tied to @c std::cout.
2791b86b14eSAlexander Kabaev       */
28000db7afdSDavid E. O'Brien       basic_ostream<_CharT, _Traits>*
28100db7afdSDavid E. O'Brien       tie() const
28200db7afdSDavid E. O'Brien       { return _M_tie; }
28300db7afdSDavid E. O'Brien 
2841b86b14eSAlexander Kabaev       /**
2851b86b14eSAlexander Kabaev        *  @brief  Ties this stream to an output stream.
2861b86b14eSAlexander Kabaev        *  @param  tiestr  The output stream.
2871b86b14eSAlexander Kabaev        *  @return  The previously tied output stream, or NULL if the stream
2881b86b14eSAlexander Kabaev        *           was not tied.
2891b86b14eSAlexander Kabaev        *
2901b86b14eSAlexander Kabaev        *  This sets up a new tie; see tie() for more.
2911b86b14eSAlexander Kabaev       */
29200db7afdSDavid E. O'Brien       basic_ostream<_CharT, _Traits>*
29300db7afdSDavid E. O'Brien       tie(basic_ostream<_CharT, _Traits>* __tiestr)
29400db7afdSDavid E. O'Brien       {
29500db7afdSDavid E. O'Brien         basic_ostream<_CharT, _Traits>* __old = _M_tie;
29600db7afdSDavid E. O'Brien         _M_tie = __tiestr;
29700db7afdSDavid E. O'Brien         return __old;
29800db7afdSDavid E. O'Brien       }
29900db7afdSDavid E. O'Brien 
3001b86b14eSAlexander Kabaev       /**
3011b86b14eSAlexander Kabaev        *  @brief  Accessing the underlying buffer.
3021b86b14eSAlexander Kabaev        *  @return  The current stream buffer.
3031b86b14eSAlexander Kabaev        *
3041b86b14eSAlexander Kabaev        *  This does not change the state of the stream.
3051b86b14eSAlexander Kabaev       */
30600db7afdSDavid E. O'Brien       basic_streambuf<_CharT, _Traits>*
30700db7afdSDavid E. O'Brien       rdbuf() const
30800db7afdSDavid E. O'Brien       { return _M_streambuf; }
30900db7afdSDavid E. O'Brien 
3101b86b14eSAlexander Kabaev       /**
3111b86b14eSAlexander Kabaev        *  @brief  Changing the underlying buffer.
3121b86b14eSAlexander Kabaev        *  @param  sb  The new stream buffer.
3131b86b14eSAlexander Kabaev        *  @return  The previous stream buffer.
3141b86b14eSAlexander Kabaev        *
3151b86b14eSAlexander Kabaev        *  Associates a new buffer with the current stream, and clears the
3161b86b14eSAlexander Kabaev        *  error state.
3171b86b14eSAlexander Kabaev        *
3181b86b14eSAlexander Kabaev        *  Due to historical accidents which the LWG refuses to correct, the
3191b86b14eSAlexander Kabaev        *  I/O library suffers from a design error:  this function is hidden
3201b86b14eSAlexander Kabaev        *  in derived classes by overrides of the zero-argument @c rdbuf(),
3211b86b14eSAlexander Kabaev        *  which is non-virtual for hysterical raisins.  As a result, you
3221b86b14eSAlexander Kabaev        *  must use explicit qualifications to access this function via any
323ffeaf689SAlexander Kabaev        *  derived class.  For example:
324ffeaf689SAlexander Kabaev        *
325ffeaf689SAlexander Kabaev        *  @code
326ffeaf689SAlexander Kabaev        *  std::fstream     foo;         // or some other derived type
327ffeaf689SAlexander Kabaev        *  std::streambuf*  p = .....;
328ffeaf689SAlexander Kabaev        *
329ffeaf689SAlexander Kabaev        *  foo.ios::rdbuf(p);            // ios == basic_ios<char>
330ffeaf689SAlexander Kabaev        *  @endcode
3311b86b14eSAlexander Kabaev       */
33200db7afdSDavid E. O'Brien       basic_streambuf<_CharT, _Traits>*
33300db7afdSDavid E. O'Brien       rdbuf(basic_streambuf<_CharT, _Traits>* __sb);
33400db7afdSDavid E. O'Brien 
3351b86b14eSAlexander Kabaev       /**
336ffeaf689SAlexander Kabaev        *  @brief  Copies fields of __rhs into this.
337ffeaf689SAlexander Kabaev        *  @param  __rhs  The source values for the copies.
338ffeaf689SAlexander Kabaev        *  @return  Reference to this object.
339ffeaf689SAlexander Kabaev        *
340ffeaf689SAlexander Kabaev        *  All fields of __rhs are copied into this object except that rdbuf()
341ffeaf689SAlexander Kabaev        *  and rdstate() remain unchanged.  All values in the pword and iword
342ffeaf689SAlexander Kabaev        *  arrays are copied.  Before copying, each callback is invoked with
343ffeaf689SAlexander Kabaev        *  erase_event.  After copying, each (new) callback is invoked with
344ffeaf689SAlexander Kabaev        *  copyfmt_event.  The final step is to copy exceptions().
3451b86b14eSAlexander Kabaev       */
34600db7afdSDavid E. O'Brien       basic_ios&
34700db7afdSDavid E. O'Brien       copyfmt(const basic_ios& __rhs);
34800db7afdSDavid E. O'Brien 
3491b86b14eSAlexander Kabaev       /**
3501b86b14eSAlexander Kabaev        *  @brief  Retreives the "empty" character.
3511b86b14eSAlexander Kabaev        *  @return  The current fill character.
3521b86b14eSAlexander Kabaev        *
3531b86b14eSAlexander Kabaev        *  It defaults to a space (' ') in the current locale.
3541b86b14eSAlexander Kabaev       */
35500db7afdSDavid E. O'Brien       char_type
35600db7afdSDavid E. O'Brien       fill() const
35700db7afdSDavid E. O'Brien       {
35800db7afdSDavid E. O'Brien 	if (!_M_fill_init)
35900db7afdSDavid E. O'Brien 	  {
36000db7afdSDavid E. O'Brien 	    _M_fill = this->widen(' ');
36100db7afdSDavid E. O'Brien 	    _M_fill_init = true;
36200db7afdSDavid E. O'Brien 	  }
36300db7afdSDavid E. O'Brien 	return _M_fill;
36400db7afdSDavid E. O'Brien       }
36500db7afdSDavid E. O'Brien 
3661b86b14eSAlexander Kabaev       /**
3671b86b14eSAlexander Kabaev        *  @brief  Sets a new "empty" character.
3681b86b14eSAlexander Kabaev        *  @param  ch  The new character.
3691b86b14eSAlexander Kabaev        *  @return  The previous fill character.
3701b86b14eSAlexander Kabaev        *
3711b86b14eSAlexander Kabaev        *  The fill character is used to fill out space when P+ characters
3721b86b14eSAlexander Kabaev        *  have been requested (e.g., via setw), Q characters are actually
3731b86b14eSAlexander Kabaev        *  used, and Q<P.  It defaults to a space (' ') in the current locale.
3741b86b14eSAlexander Kabaev       */
37500db7afdSDavid E. O'Brien       char_type
37600db7afdSDavid E. O'Brien       fill(char_type __ch)
37700db7afdSDavid E. O'Brien       {
37800db7afdSDavid E. O'Brien 	char_type __old = this->fill();
37900db7afdSDavid E. O'Brien 	_M_fill = __ch;
38000db7afdSDavid E. O'Brien 	return __old;
38100db7afdSDavid E. O'Brien       }
38200db7afdSDavid E. O'Brien 
38300db7afdSDavid E. O'Brien       // Locales:
3841b86b14eSAlexander Kabaev       /**
3851b86b14eSAlexander Kabaev        *  @brief  Moves to a new locale.
3861b86b14eSAlexander Kabaev        *  @param  loc  The new locale.
3871b86b14eSAlexander Kabaev        *  @return  The previous locale.
3881b86b14eSAlexander Kabaev        *
3891b86b14eSAlexander Kabaev        *  Calls @c ios_base::imbue(loc), and if a stream buffer is associated
3901b86b14eSAlexander Kabaev        *  with this stream, calls that buffer's @c pubimbue(loc).
3911b86b14eSAlexander Kabaev        *
3921b86b14eSAlexander Kabaev        *  Additional l10n notes are at
3931b86b14eSAlexander Kabaev        *  http://gcc.gnu.org/onlinedocs/libstdc++/22_locale/howto.html
3941b86b14eSAlexander Kabaev       */
39500db7afdSDavid E. O'Brien       locale
39600db7afdSDavid E. O'Brien       imbue(const locale& __loc);
39700db7afdSDavid E. O'Brien 
3981b86b14eSAlexander Kabaev       /**
3991b86b14eSAlexander Kabaev        *  @brief  Squeezes characters.
4001b86b14eSAlexander Kabaev        *  @param  c  The character to narrow.
4011b86b14eSAlexander Kabaev        *  @param  dfault  The character to narrow.
4021b86b14eSAlexander Kabaev        *  @return  The narrowed character.
4031b86b14eSAlexander Kabaev        *
4041b86b14eSAlexander Kabaev        *  Maps a character of @c char_type to a character of @c char,
4051b86b14eSAlexander Kabaev        *  if possible.
4061b86b14eSAlexander Kabaev        *
4071b86b14eSAlexander Kabaev        *  Returns the result of
4081b86b14eSAlexander Kabaev        *  @code
4091b86b14eSAlexander Kabaev        *    std::use_facet<ctype<char_type> >(getloc()).narrow(c,dfault)
4101b86b14eSAlexander Kabaev        *  @endcode
4111b86b14eSAlexander Kabaev        *
4121b86b14eSAlexander Kabaev        *  Additional l10n notes are at
4131b86b14eSAlexander Kabaev        *  http://gcc.gnu.org/onlinedocs/libstdc++/22_locale/howto.html
4141b86b14eSAlexander Kabaev       */
41500db7afdSDavid E. O'Brien       char
41600db7afdSDavid E. O'Brien       narrow(char_type __c, char __dfault) const;
41700db7afdSDavid E. O'Brien 
4181b86b14eSAlexander Kabaev       /**
4191b86b14eSAlexander Kabaev        *  @brief  Widens characters.
4201b86b14eSAlexander Kabaev        *  @param  c  The character to widen.
4211b86b14eSAlexander Kabaev        *  @return  The widened character.
4221b86b14eSAlexander Kabaev        *
4231b86b14eSAlexander Kabaev        *  Maps a character of @c char to a character of @c char_type.
4241b86b14eSAlexander Kabaev        *
4251b86b14eSAlexander Kabaev        *  Returns the result of
4261b86b14eSAlexander Kabaev        *  @code
4271b86b14eSAlexander Kabaev        *    std::use_facet<ctype<char_type> >(getloc()).widen(c)
4281b86b14eSAlexander Kabaev        *  @endcode
4291b86b14eSAlexander Kabaev        *
4301b86b14eSAlexander Kabaev        *  Additional l10n notes are at
4311b86b14eSAlexander Kabaev        *  http://gcc.gnu.org/onlinedocs/libstdc++/22_locale/howto.html
4321b86b14eSAlexander Kabaev       */
43300db7afdSDavid E. O'Brien       char_type
43400db7afdSDavid E. O'Brien       widen(char __c) const;
43500db7afdSDavid E. O'Brien 
43600db7afdSDavid E. O'Brien     protected:
43700db7afdSDavid E. O'Brien       // 27.4.5.1  basic_ios constructors
4381b86b14eSAlexander Kabaev       /**
4391b86b14eSAlexander Kabaev        *  @brief  Empty.
4401b86b14eSAlexander Kabaev        *
4411b86b14eSAlexander Kabaev        *  The default constructor does nothing and is not normally
4421b86b14eSAlexander Kabaev        *  accessible to users.
4431b86b14eSAlexander Kabaev       */
444ffeaf689SAlexander Kabaev       basic_ios()
445ffeaf689SAlexander Kabaev       : ios_base(), _M_tie(0), _M_fill(char_type()), _M_fill_init(false),
446ffeaf689SAlexander Kabaev       _M_streambuf(0), _M_ctype(0), _M_num_put(0), _M_num_get(0)
44700db7afdSDavid E. O'Brien       { }
44800db7afdSDavid E. O'Brien 
4491b86b14eSAlexander Kabaev       /**
4501b86b14eSAlexander Kabaev        *  @brief  All setup is performed here.
4511b86b14eSAlexander Kabaev        *
4521b86b14eSAlexander Kabaev        *  This is called from the public constructor.  It is not virtual and
453ffeaf689SAlexander Kabaev        *  cannot be redefined.
4541b86b14eSAlexander Kabaev       */
45500db7afdSDavid E. O'Brien       void
45600db7afdSDavid E. O'Brien       init(basic_streambuf<_CharT, _Traits>* __sb);
45700db7afdSDavid E. O'Brien 
45800db7afdSDavid E. O'Brien       void
4591b86b14eSAlexander Kabaev       _M_cache_locale(const locale& __loc);
46000db7afdSDavid E. O'Brien     };
461*f8a1b7d9SAlexander Kabaev 
462*f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NAMESPACE
46300db7afdSDavid E. O'Brien 
464ffeaf689SAlexander Kabaev #ifndef _GLIBCXX_EXPORT_TEMPLATE
46500db7afdSDavid E. O'Brien #include <bits/basic_ios.tcc>
46600db7afdSDavid E. O'Brien #endif
46700db7afdSDavid E. O'Brien 
468ffeaf689SAlexander Kabaev #endif /* _BASIC_IOS_H */
469