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