xref: /netbsd-src/external/gpl3/gcc.old/dist/libstdc++-v3/include/bits/ios_base.h (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
11debfc3dSmrg // Iostreams base classes -*- C++ -*-
21debfc3dSmrg 
3*8feb0f0bSmrg // Copyright (C) 1997-2020 Free Software Foundation, Inc.
41debfc3dSmrg //
51debfc3dSmrg // This file is part of the GNU ISO C++ Library.  This library is free
61debfc3dSmrg // software; you can redistribute it and/or modify it under the
71debfc3dSmrg // terms of the GNU General Public License as published by the
81debfc3dSmrg // Free Software Foundation; either version 3, or (at your option)
91debfc3dSmrg // any later version.
101debfc3dSmrg 
111debfc3dSmrg // This library is distributed in the hope that it will be useful,
121debfc3dSmrg // but WITHOUT ANY WARRANTY; without even the implied warranty of
131debfc3dSmrg // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
141debfc3dSmrg // GNU General Public License for more details.
151debfc3dSmrg 
161debfc3dSmrg // Under Section 7 of GPL version 3, you are granted additional
171debfc3dSmrg // permissions described in the GCC Runtime Library Exception, version
181debfc3dSmrg // 3.1, as published by the Free Software Foundation.
191debfc3dSmrg 
201debfc3dSmrg // You should have received a copy of the GNU General Public License and
211debfc3dSmrg // a copy of the GCC Runtime Library Exception along with this program;
221debfc3dSmrg // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
231debfc3dSmrg // <http://www.gnu.org/licenses/>.
241debfc3dSmrg 
251debfc3dSmrg /** @file bits/ios_base.h
261debfc3dSmrg  *  This is an internal header file, included by other library headers.
271debfc3dSmrg  *  Do not attempt to use it directly. @headername{ios}
281debfc3dSmrg  */
291debfc3dSmrg 
301debfc3dSmrg //
311debfc3dSmrg // ISO C++ 14882: 27.4  Iostreams base classes
321debfc3dSmrg //
331debfc3dSmrg 
341debfc3dSmrg #ifndef _IOS_BASE_H
351debfc3dSmrg #define _IOS_BASE_H 1
361debfc3dSmrg 
371debfc3dSmrg #pragma GCC system_header
381debfc3dSmrg 
391debfc3dSmrg #include <ext/atomicity.h>
401debfc3dSmrg #include <bits/localefwd.h>
411debfc3dSmrg #include <bits/locale_classes.h>
421debfc3dSmrg 
431debfc3dSmrg #if __cplusplus < 201103L
441debfc3dSmrg # include <stdexcept>
451debfc3dSmrg #else
461debfc3dSmrg # include <system_error>
471debfc3dSmrg #endif
481debfc3dSmrg 
_GLIBCXX_VISIBILITY(default)491debfc3dSmrg namespace std _GLIBCXX_VISIBILITY(default)
501debfc3dSmrg {
511debfc3dSmrg _GLIBCXX_BEGIN_NAMESPACE_VERSION
521debfc3dSmrg 
531debfc3dSmrg   // The following definitions of bitmask types are enums, not ints,
541debfc3dSmrg   // as permitted (but not required) in the standard, in order to provide
551debfc3dSmrg   // better type safety in iostream calls.  A side effect is that in C++98
561debfc3dSmrg   // expressions involving them are not compile-time constants.
571debfc3dSmrg   enum _Ios_Fmtflags
581debfc3dSmrg     {
591debfc3dSmrg       _S_boolalpha 	= 1L << 0,
601debfc3dSmrg       _S_dec 		= 1L << 1,
611debfc3dSmrg       _S_fixed 		= 1L << 2,
621debfc3dSmrg       _S_hex 		= 1L << 3,
631debfc3dSmrg       _S_internal 	= 1L << 4,
641debfc3dSmrg       _S_left 		= 1L << 5,
651debfc3dSmrg       _S_oct 		= 1L << 6,
661debfc3dSmrg       _S_right 		= 1L << 7,
671debfc3dSmrg       _S_scientific 	= 1L << 8,
681debfc3dSmrg       _S_showbase 	= 1L << 9,
691debfc3dSmrg       _S_showpoint 	= 1L << 10,
701debfc3dSmrg       _S_showpos 	= 1L << 11,
711debfc3dSmrg       _S_skipws 	= 1L << 12,
721debfc3dSmrg       _S_unitbuf 	= 1L << 13,
731debfc3dSmrg       _S_uppercase 	= 1L << 14,
741debfc3dSmrg       _S_adjustfield 	= _S_left | _S_right | _S_internal,
751debfc3dSmrg       _S_basefield 	= _S_dec | _S_oct | _S_hex,
761debfc3dSmrg       _S_floatfield 	= _S_scientific | _S_fixed,
771debfc3dSmrg       _S_ios_fmtflags_end = 1L << 16,
781debfc3dSmrg       _S_ios_fmtflags_max = __INT_MAX__,
791debfc3dSmrg       _S_ios_fmtflags_min = ~__INT_MAX__
801debfc3dSmrg     };
811debfc3dSmrg 
821debfc3dSmrg   inline _GLIBCXX_CONSTEXPR _Ios_Fmtflags
831debfc3dSmrg   operator&(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
841debfc3dSmrg   { return _Ios_Fmtflags(static_cast<int>(__a) & static_cast<int>(__b)); }
851debfc3dSmrg 
861debfc3dSmrg   inline _GLIBCXX_CONSTEXPR _Ios_Fmtflags
871debfc3dSmrg   operator|(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
881debfc3dSmrg   { return _Ios_Fmtflags(static_cast<int>(__a) | static_cast<int>(__b)); }
891debfc3dSmrg 
901debfc3dSmrg   inline _GLIBCXX_CONSTEXPR _Ios_Fmtflags
911debfc3dSmrg   operator^(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
921debfc3dSmrg   { return _Ios_Fmtflags(static_cast<int>(__a) ^ static_cast<int>(__b)); }
931debfc3dSmrg 
941debfc3dSmrg   inline _GLIBCXX_CONSTEXPR _Ios_Fmtflags
951debfc3dSmrg   operator~(_Ios_Fmtflags __a)
961debfc3dSmrg   { return _Ios_Fmtflags(~static_cast<int>(__a)); }
971debfc3dSmrg 
981debfc3dSmrg   inline const _Ios_Fmtflags&
991debfc3dSmrg   operator|=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b)
1001debfc3dSmrg   { return __a = __a | __b; }
1011debfc3dSmrg 
1021debfc3dSmrg   inline const _Ios_Fmtflags&
1031debfc3dSmrg   operator&=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b)
1041debfc3dSmrg   { return __a = __a & __b; }
1051debfc3dSmrg 
1061debfc3dSmrg   inline const _Ios_Fmtflags&
1071debfc3dSmrg   operator^=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b)
1081debfc3dSmrg   { return __a = __a ^ __b; }
1091debfc3dSmrg 
1101debfc3dSmrg 
1111debfc3dSmrg   enum _Ios_Openmode
1121debfc3dSmrg     {
1131debfc3dSmrg       _S_app 		= 1L << 0,
1141debfc3dSmrg       _S_ate 		= 1L << 1,
1151debfc3dSmrg       _S_bin 		= 1L << 2,
1161debfc3dSmrg       _S_in 		= 1L << 3,
1171debfc3dSmrg       _S_out 		= 1L << 4,
1181debfc3dSmrg       _S_trunc 		= 1L << 5,
1191debfc3dSmrg       _S_ios_openmode_end = 1L << 16,
1201debfc3dSmrg       _S_ios_openmode_max = __INT_MAX__,
1211debfc3dSmrg       _S_ios_openmode_min = ~__INT_MAX__
1221debfc3dSmrg     };
1231debfc3dSmrg 
1241debfc3dSmrg   inline _GLIBCXX_CONSTEXPR _Ios_Openmode
1251debfc3dSmrg   operator&(_Ios_Openmode __a, _Ios_Openmode __b)
1261debfc3dSmrg   { return _Ios_Openmode(static_cast<int>(__a) & static_cast<int>(__b)); }
1271debfc3dSmrg 
1281debfc3dSmrg   inline _GLIBCXX_CONSTEXPR _Ios_Openmode
1291debfc3dSmrg   operator|(_Ios_Openmode __a, _Ios_Openmode __b)
1301debfc3dSmrg   { return _Ios_Openmode(static_cast<int>(__a) | static_cast<int>(__b)); }
1311debfc3dSmrg 
1321debfc3dSmrg   inline _GLIBCXX_CONSTEXPR _Ios_Openmode
1331debfc3dSmrg   operator^(_Ios_Openmode __a, _Ios_Openmode __b)
1341debfc3dSmrg   { return _Ios_Openmode(static_cast<int>(__a) ^ static_cast<int>(__b)); }
1351debfc3dSmrg 
1361debfc3dSmrg   inline _GLIBCXX_CONSTEXPR _Ios_Openmode
1371debfc3dSmrg   operator~(_Ios_Openmode __a)
1381debfc3dSmrg   { return _Ios_Openmode(~static_cast<int>(__a)); }
1391debfc3dSmrg 
1401debfc3dSmrg   inline const _Ios_Openmode&
1411debfc3dSmrg   operator|=(_Ios_Openmode& __a, _Ios_Openmode __b)
1421debfc3dSmrg   { return __a = __a | __b; }
1431debfc3dSmrg 
1441debfc3dSmrg   inline const _Ios_Openmode&
1451debfc3dSmrg   operator&=(_Ios_Openmode& __a, _Ios_Openmode __b)
1461debfc3dSmrg   { return __a = __a & __b; }
1471debfc3dSmrg 
1481debfc3dSmrg   inline const _Ios_Openmode&
1491debfc3dSmrg   operator^=(_Ios_Openmode& __a, _Ios_Openmode __b)
1501debfc3dSmrg   { return __a = __a ^ __b; }
1511debfc3dSmrg 
1521debfc3dSmrg 
1531debfc3dSmrg   enum _Ios_Iostate
1541debfc3dSmrg     {
1551debfc3dSmrg       _S_goodbit 		= 0,
1561debfc3dSmrg       _S_badbit 		= 1L << 0,
1571debfc3dSmrg       _S_eofbit 		= 1L << 1,
1581debfc3dSmrg       _S_failbit		= 1L << 2,
1591debfc3dSmrg       _S_ios_iostate_end = 1L << 16,
1601debfc3dSmrg       _S_ios_iostate_max = __INT_MAX__,
1611debfc3dSmrg       _S_ios_iostate_min = ~__INT_MAX__
1621debfc3dSmrg     };
1631debfc3dSmrg 
1641debfc3dSmrg   inline _GLIBCXX_CONSTEXPR _Ios_Iostate
1651debfc3dSmrg   operator&(_Ios_Iostate __a, _Ios_Iostate __b)
1661debfc3dSmrg   { return _Ios_Iostate(static_cast<int>(__a) & static_cast<int>(__b)); }
1671debfc3dSmrg 
1681debfc3dSmrg   inline _GLIBCXX_CONSTEXPR _Ios_Iostate
1691debfc3dSmrg   operator|(_Ios_Iostate __a, _Ios_Iostate __b)
1701debfc3dSmrg   { return _Ios_Iostate(static_cast<int>(__a) | static_cast<int>(__b)); }
1711debfc3dSmrg 
1721debfc3dSmrg   inline _GLIBCXX_CONSTEXPR _Ios_Iostate
1731debfc3dSmrg   operator^(_Ios_Iostate __a, _Ios_Iostate __b)
1741debfc3dSmrg   { return _Ios_Iostate(static_cast<int>(__a) ^ static_cast<int>(__b)); }
1751debfc3dSmrg 
1761debfc3dSmrg   inline _GLIBCXX_CONSTEXPR _Ios_Iostate
1771debfc3dSmrg   operator~(_Ios_Iostate __a)
1781debfc3dSmrg   { return _Ios_Iostate(~static_cast<int>(__a)); }
1791debfc3dSmrg 
1801debfc3dSmrg   inline const _Ios_Iostate&
1811debfc3dSmrg   operator|=(_Ios_Iostate& __a, _Ios_Iostate __b)
1821debfc3dSmrg   { return __a = __a | __b; }
1831debfc3dSmrg 
1841debfc3dSmrg   inline const _Ios_Iostate&
1851debfc3dSmrg   operator&=(_Ios_Iostate& __a, _Ios_Iostate __b)
1861debfc3dSmrg   { return __a = __a & __b; }
1871debfc3dSmrg 
1881debfc3dSmrg   inline const  _Ios_Iostate&
1891debfc3dSmrg   operator^=(_Ios_Iostate& __a, _Ios_Iostate __b)
1901debfc3dSmrg   { return __a = __a ^ __b; }
1911debfc3dSmrg 
1921debfc3dSmrg 
1931debfc3dSmrg   enum _Ios_Seekdir
1941debfc3dSmrg     {
1951debfc3dSmrg       _S_beg = 0,
1961debfc3dSmrg       _S_cur = _GLIBCXX_STDIO_SEEK_CUR,
1971debfc3dSmrg       _S_end = _GLIBCXX_STDIO_SEEK_END,
1981debfc3dSmrg       _S_ios_seekdir_end = 1L << 16
1991debfc3dSmrg     };
2001debfc3dSmrg 
2011debfc3dSmrg #if __cplusplus >= 201103L
2021debfc3dSmrg   /// I/O error code
2031debfc3dSmrg   enum class io_errc { stream = 1 };
2041debfc3dSmrg 
2051debfc3dSmrg   template <> struct is_error_code_enum<io_errc> : public true_type { };
2061debfc3dSmrg 
2071debfc3dSmrg   const error_category& iostream_category() noexcept;
2081debfc3dSmrg 
2091debfc3dSmrg   inline error_code
2101debfc3dSmrg   make_error_code(io_errc __e) noexcept
2111debfc3dSmrg   { return error_code(static_cast<int>(__e), iostream_category()); }
2121debfc3dSmrg 
2131debfc3dSmrg   inline error_condition
2141debfc3dSmrg   make_error_condition(io_errc __e) noexcept
2151debfc3dSmrg   { return error_condition(static_cast<int>(__e), iostream_category()); }
2161debfc3dSmrg #endif
2171debfc3dSmrg 
2181debfc3dSmrg   // 27.4.2  Class ios_base
2191debfc3dSmrg   /**
2201debfc3dSmrg    *  @brief  The base of the I/O class hierarchy.
2211debfc3dSmrg    *  @ingroup io
2221debfc3dSmrg    *
2231debfc3dSmrg    *  This class defines everything that can be defined about I/O that does
2241debfc3dSmrg    *  not depend on the type of characters being input or output.  Most
2251debfc3dSmrg    *  people will only see @c ios_base when they need to specify the full
2261debfc3dSmrg    *  name of the various I/O flags (e.g., the openmodes).
2271debfc3dSmrg   */
2281debfc3dSmrg   class ios_base
2291debfc3dSmrg   {
2301debfc3dSmrg #if _GLIBCXX_USE_CXX11_ABI
2311debfc3dSmrg #if __cplusplus < 201103L
2321debfc3dSmrg     // Type that is layout-compatible with std::system_error
2331debfc3dSmrg     struct system_error : std::runtime_error
2341debfc3dSmrg     {
2351debfc3dSmrg       // Type that is layout-compatible with std::error_code
2361debfc3dSmrg       struct error_code
2371debfc3dSmrg       {
2381debfc3dSmrg 	error_code() { }
2391debfc3dSmrg       private:
2401debfc3dSmrg 	int		_M_value;
2411debfc3dSmrg 	const void*	_M_cat;
2421debfc3dSmrg       } _M_code;
2431debfc3dSmrg     };
2441debfc3dSmrg #endif
2451debfc3dSmrg #endif
2461debfc3dSmrg   public:
2471debfc3dSmrg 
2481debfc3dSmrg     /**
2491debfc3dSmrg      *  @brief These are thrown to indicate problems with io.
2501debfc3dSmrg      *  @ingroup exceptions
2511debfc3dSmrg      *
2521debfc3dSmrg      *  27.4.2.1.1  Class ios_base::failure
2531debfc3dSmrg      */
2541debfc3dSmrg #if _GLIBCXX_USE_CXX11_ABI
2551debfc3dSmrg     class _GLIBCXX_ABI_TAG_CXX11 failure : public system_error
2561debfc3dSmrg     {
2571debfc3dSmrg     public:
2581debfc3dSmrg       explicit
2591debfc3dSmrg       failure(const string& __str);
2601debfc3dSmrg 
2611debfc3dSmrg #if __cplusplus >= 201103L
2621debfc3dSmrg       explicit
2631debfc3dSmrg       failure(const string&, const error_code&);
2641debfc3dSmrg 
2651debfc3dSmrg       explicit
2661debfc3dSmrg       failure(const char*, const error_code& = io_errc::stream);
2671debfc3dSmrg #endif
2681debfc3dSmrg 
2691debfc3dSmrg       virtual
2701debfc3dSmrg       ~failure() throw();
2711debfc3dSmrg 
2721debfc3dSmrg       virtual const char*
2731debfc3dSmrg       what() const throw();
2741debfc3dSmrg     };
2751debfc3dSmrg #else
2761debfc3dSmrg     class failure : public exception
2771debfc3dSmrg     {
2781debfc3dSmrg     public:
2791debfc3dSmrg       // _GLIBCXX_RESOLVE_LIB_DEFECTS
2801debfc3dSmrg       // 48.  Use of non-existent exception constructor
2811debfc3dSmrg       explicit
2821debfc3dSmrg       failure(const string& __str) throw();
2831debfc3dSmrg 
2841debfc3dSmrg       // This declaration is not useless:
2851debfc3dSmrg       // http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Vague-Linkage.html
2861debfc3dSmrg       virtual
2871debfc3dSmrg       ~failure() throw();
2881debfc3dSmrg 
2891debfc3dSmrg       virtual const char*
2901debfc3dSmrg       what() const throw();
2911debfc3dSmrg 
292*8feb0f0bSmrg #if __cplusplus >= 201103L
293*8feb0f0bSmrg       // Define the new members required by C++11,
294*8feb0f0bSmrg       // even though the error_code cannot be stored.
295*8feb0f0bSmrg 
296*8feb0f0bSmrg       explicit
297*8feb0f0bSmrg       failure(const string& __s, const error_code&) noexcept
298*8feb0f0bSmrg       : failure(__s)
299*8feb0f0bSmrg       { }
300*8feb0f0bSmrg 
301*8feb0f0bSmrg       explicit
302*8feb0f0bSmrg       failure(const char* __s, const error_code& = error_code{})
303*8feb0f0bSmrg       : failure(string(__s))
304*8feb0f0bSmrg       { }
305*8feb0f0bSmrg 
306*8feb0f0bSmrg       // Stand-in for system_error::code() but returning by value.
307*8feb0f0bSmrg       error_code code() const noexcept { return error_code{}; }
308*8feb0f0bSmrg #endif
309*8feb0f0bSmrg 
3101debfc3dSmrg     private:
3111debfc3dSmrg       string _M_msg;
3121debfc3dSmrg     };
3131debfc3dSmrg #endif
3141debfc3dSmrg 
3151debfc3dSmrg     // 27.4.2.1.2  Type ios_base::fmtflags
3161debfc3dSmrg     /**
3171debfc3dSmrg      *  @brief This is a bitmask type.
3181debfc3dSmrg      *
3191debfc3dSmrg      *  @c @a _Ios_Fmtflags is implementation-defined, but it is valid to
3201debfc3dSmrg      *  perform bitwise operations on these values and expect the Right
3211debfc3dSmrg      *  Thing to happen.  Defined objects of type fmtflags are:
3221debfc3dSmrg      *  - boolalpha
3231debfc3dSmrg      *  - dec
3241debfc3dSmrg      *  - fixed
3251debfc3dSmrg      *  - hex
3261debfc3dSmrg      *  - internal
3271debfc3dSmrg      *  - left
3281debfc3dSmrg      *  - oct
3291debfc3dSmrg      *  - right
3301debfc3dSmrg      *  - scientific
3311debfc3dSmrg      *  - showbase
3321debfc3dSmrg      *  - showpoint
3331debfc3dSmrg      *  - showpos
3341debfc3dSmrg      *  - skipws
3351debfc3dSmrg      *  - unitbuf
3361debfc3dSmrg      *  - uppercase
3371debfc3dSmrg      *  - adjustfield
3381debfc3dSmrg      *  - basefield
3391debfc3dSmrg      *  - floatfield
3401debfc3dSmrg     */
3411debfc3dSmrg     typedef _Ios_Fmtflags fmtflags;
3421debfc3dSmrg 
3431debfc3dSmrg     /// Insert/extract @c bool in alphabetic rather than numeric format.
3441debfc3dSmrg     static const fmtflags boolalpha =   _S_boolalpha;
3451debfc3dSmrg 
3461debfc3dSmrg     /// Converts integer input or generates integer output in decimal base.
3471debfc3dSmrg     static const fmtflags dec =         _S_dec;
3481debfc3dSmrg 
3491debfc3dSmrg     /// Generate floating-point output in fixed-point notation.
3501debfc3dSmrg     static const fmtflags fixed =       _S_fixed;
3511debfc3dSmrg 
3521debfc3dSmrg     /// Converts integer input or generates integer output in hexadecimal base.
3531debfc3dSmrg     static const fmtflags hex =         _S_hex;
3541debfc3dSmrg 
3551debfc3dSmrg     /// Adds fill characters at a designated internal point in certain
3561debfc3dSmrg     /// generated output, or identical to @c right if no such point is
3571debfc3dSmrg     /// designated.
3581debfc3dSmrg     static const fmtflags internal =    _S_internal;
3591debfc3dSmrg 
3601debfc3dSmrg     /// Adds fill characters on the right (final positions) of certain
3611debfc3dSmrg     /// generated output.  (I.e., the thing you print is flush left.)
3621debfc3dSmrg     static const fmtflags left =        _S_left;
3631debfc3dSmrg 
3641debfc3dSmrg     /// Converts integer input or generates integer output in octal base.
3651debfc3dSmrg     static const fmtflags oct =         _S_oct;
3661debfc3dSmrg 
3671debfc3dSmrg     /// Adds fill characters on the left (initial positions) of certain
3681debfc3dSmrg     /// generated output.  (I.e., the thing you print is flush right.)
3691debfc3dSmrg     static const fmtflags right =       _S_right;
3701debfc3dSmrg 
3711debfc3dSmrg     /// Generates floating-point output in scientific notation.
3721debfc3dSmrg     static const fmtflags scientific =  _S_scientific;
3731debfc3dSmrg 
3741debfc3dSmrg     /// Generates a prefix indicating the numeric base of generated integer
3751debfc3dSmrg     /// output.
3761debfc3dSmrg     static const fmtflags showbase =    _S_showbase;
3771debfc3dSmrg 
3781debfc3dSmrg     /// Generates a decimal-point character unconditionally in generated
3791debfc3dSmrg     /// floating-point output.
3801debfc3dSmrg     static const fmtflags showpoint =   _S_showpoint;
3811debfc3dSmrg 
3821debfc3dSmrg     /// Generates a + sign in non-negative generated numeric output.
3831debfc3dSmrg     static const fmtflags showpos =     _S_showpos;
3841debfc3dSmrg 
3851debfc3dSmrg     /// Skips leading white space before certain input operations.
3861debfc3dSmrg     static const fmtflags skipws =      _S_skipws;
3871debfc3dSmrg 
3881debfc3dSmrg     /// Flushes output after each output operation.
3891debfc3dSmrg     static const fmtflags unitbuf =     _S_unitbuf;
3901debfc3dSmrg 
3911debfc3dSmrg     /// Replaces certain lowercase letters with their uppercase equivalents
3921debfc3dSmrg     /// in generated output.
3931debfc3dSmrg     static const fmtflags uppercase =   _S_uppercase;
3941debfc3dSmrg 
3951debfc3dSmrg     /// A mask of left|right|internal.  Useful for the 2-arg form of @c setf.
3961debfc3dSmrg     static const fmtflags adjustfield = _S_adjustfield;
3971debfc3dSmrg 
3981debfc3dSmrg     /// A mask of dec|oct|hex.  Useful for the 2-arg form of @c setf.
3991debfc3dSmrg     static const fmtflags basefield =   _S_basefield;
4001debfc3dSmrg 
4011debfc3dSmrg     /// A mask of scientific|fixed.  Useful for the 2-arg form of @c setf.
4021debfc3dSmrg     static const fmtflags floatfield =  _S_floatfield;
4031debfc3dSmrg 
4041debfc3dSmrg     // 27.4.2.1.3  Type ios_base::iostate
4051debfc3dSmrg     /**
4061debfc3dSmrg      *  @brief This is a bitmask type.
4071debfc3dSmrg      *
4081debfc3dSmrg      *  @c @a _Ios_Iostate is implementation-defined, but it is valid to
4091debfc3dSmrg      *  perform bitwise operations on these values and expect the Right
4101debfc3dSmrg      *  Thing to happen.  Defined objects of type iostate are:
4111debfc3dSmrg      *  - badbit
4121debfc3dSmrg      *  - eofbit
4131debfc3dSmrg      *  - failbit
4141debfc3dSmrg      *  - goodbit
4151debfc3dSmrg     */
4161debfc3dSmrg     typedef _Ios_Iostate iostate;
4171debfc3dSmrg 
4181debfc3dSmrg     /// Indicates a loss of integrity in an input or output sequence (such
4191debfc3dSmrg     /// as an irrecoverable read error from a file).
4201debfc3dSmrg     static const iostate badbit =	_S_badbit;
4211debfc3dSmrg 
4221debfc3dSmrg     /// Indicates that an input operation reached the end of an input sequence.
4231debfc3dSmrg     static const iostate eofbit =	_S_eofbit;
4241debfc3dSmrg 
4251debfc3dSmrg     /// Indicates that an input operation failed to read the expected
4261debfc3dSmrg     /// characters, or that an output operation failed to generate the
4271debfc3dSmrg     /// desired characters.
4281debfc3dSmrg     static const iostate failbit =	_S_failbit;
4291debfc3dSmrg 
4301debfc3dSmrg     /// Indicates all is well.
4311debfc3dSmrg     static const iostate goodbit =	_S_goodbit;
4321debfc3dSmrg 
4331debfc3dSmrg     // 27.4.2.1.4  Type ios_base::openmode
4341debfc3dSmrg     /**
4351debfc3dSmrg      *  @brief This is a bitmask type.
4361debfc3dSmrg      *
4371debfc3dSmrg      *  @c @a _Ios_Openmode is implementation-defined, but it is valid to
4381debfc3dSmrg      *  perform bitwise operations on these values and expect the Right
4391debfc3dSmrg      *  Thing to happen.  Defined objects of type openmode are:
4401debfc3dSmrg      *  - app
4411debfc3dSmrg      *  - ate
4421debfc3dSmrg      *  - binary
4431debfc3dSmrg      *  - in
4441debfc3dSmrg      *  - out
4451debfc3dSmrg      *  - trunc
4461debfc3dSmrg     */
4471debfc3dSmrg     typedef _Ios_Openmode openmode;
4481debfc3dSmrg 
4491debfc3dSmrg     /// Seek to end before each write.
4501debfc3dSmrg     static const openmode app =		_S_app;
4511debfc3dSmrg 
4521debfc3dSmrg     /// Open and seek to end immediately after opening.
4531debfc3dSmrg     static const openmode ate =		_S_ate;
4541debfc3dSmrg 
4551debfc3dSmrg     /// Perform input and output in binary mode (as opposed to text mode).
4561debfc3dSmrg     /// This is probably not what you think it is; see
4571debfc3dSmrg     /// https://gcc.gnu.org/onlinedocs/libstdc++/manual/fstreams.html#std.io.filestreams.binary
4581debfc3dSmrg     static const openmode binary =	_S_bin;
4591debfc3dSmrg 
4601debfc3dSmrg     /// Open for input.  Default for @c ifstream and fstream.
4611debfc3dSmrg     static const openmode in =		_S_in;
4621debfc3dSmrg 
4631debfc3dSmrg     /// Open for output.  Default for @c ofstream and fstream.
4641debfc3dSmrg     static const openmode out =		_S_out;
4651debfc3dSmrg 
466a2dc1f3fSmrg     /// Truncate an existing stream when opening.  Default for @c ofstream.
4671debfc3dSmrg     static const openmode trunc =	_S_trunc;
4681debfc3dSmrg 
4691debfc3dSmrg     // 27.4.2.1.5  Type ios_base::seekdir
4701debfc3dSmrg     /**
4711debfc3dSmrg      *  @brief This is an enumerated type.
4721debfc3dSmrg      *
4731debfc3dSmrg      *  @c @a _Ios_Seekdir is implementation-defined.  Defined values
4741debfc3dSmrg      *  of type seekdir are:
4751debfc3dSmrg      *  - beg
4761debfc3dSmrg      *  - cur, equivalent to @c SEEK_CUR in the C standard library.
4771debfc3dSmrg      *  - end, equivalent to @c SEEK_END in the C standard library.
4781debfc3dSmrg     */
4791debfc3dSmrg     typedef _Ios_Seekdir seekdir;
4801debfc3dSmrg 
4811debfc3dSmrg     /// Request a seek relative to the beginning of the stream.
4821debfc3dSmrg     static const seekdir beg =		_S_beg;
4831debfc3dSmrg 
4841debfc3dSmrg     /// Request a seek relative to the current position within the sequence.
4851debfc3dSmrg     static const seekdir cur =		_S_cur;
4861debfc3dSmrg 
4871debfc3dSmrg     /// Request a seek relative to the current end of the sequence.
4881debfc3dSmrg     static const seekdir end =		_S_end;
4891debfc3dSmrg 
490a2dc1f3fSmrg #if __cplusplus <= 201402L
491a2dc1f3fSmrg     // Annex D.6 (removed in C++17)
492*8feb0f0bSmrg     typedef int io_state
493*8feb0f0bSmrg       _GLIBCXX_DEPRECATED_SUGGEST("std::iostate");
494*8feb0f0bSmrg     typedef int open_mode
495*8feb0f0bSmrg       _GLIBCXX_DEPRECATED_SUGGEST("std::openmode");
496*8feb0f0bSmrg     typedef int seek_dir
497*8feb0f0bSmrg       _GLIBCXX_DEPRECATED_SUGGEST("std::seekdir");
4981debfc3dSmrg 
499*8feb0f0bSmrg     typedef std::streampos streampos
500*8feb0f0bSmrg       _GLIBCXX_DEPRECATED_SUGGEST("std::streampos");
501*8feb0f0bSmrg     typedef std::streamoff streamoff
502*8feb0f0bSmrg       _GLIBCXX_DEPRECATED_SUGGEST("std::streamoff");
503a2dc1f3fSmrg #endif
5041debfc3dSmrg 
5051debfc3dSmrg     // Callbacks;
5061debfc3dSmrg     /**
5071debfc3dSmrg      *  @brief  The set of events that may be passed to an event callback.
5081debfc3dSmrg      *
5091debfc3dSmrg      *  erase_event is used during ~ios() and copyfmt().  imbue_event is used
5101debfc3dSmrg      *  during imbue().  copyfmt_event is used during copyfmt().
5111debfc3dSmrg     */
5121debfc3dSmrg     enum event
5131debfc3dSmrg     {
5141debfc3dSmrg       erase_event,
5151debfc3dSmrg       imbue_event,
5161debfc3dSmrg       copyfmt_event
5171debfc3dSmrg     };
5181debfc3dSmrg 
5191debfc3dSmrg     /**
5201debfc3dSmrg      *  @brief  The type of an event callback function.
5211debfc3dSmrg      *  @param  __e  One of the members of the event enum.
5221debfc3dSmrg      *  @param  __b  Reference to the ios_base object.
5231debfc3dSmrg      *  @param  __i  The integer provided when the callback was registered.
5241debfc3dSmrg      *
5251debfc3dSmrg      *  Event callbacks are user defined functions that get called during
5261debfc3dSmrg      *  several ios_base and basic_ios functions, specifically imbue(),
5271debfc3dSmrg      *  copyfmt(), and ~ios().
5281debfc3dSmrg     */
5291debfc3dSmrg     typedef void (*event_callback) (event __e, ios_base& __b, int __i);
5301debfc3dSmrg 
5311debfc3dSmrg     /**
5321debfc3dSmrg      *  @brief  Add the callback __fn with parameter __index.
5331debfc3dSmrg      *  @param  __fn  The function to add.
5341debfc3dSmrg      *  @param  __index  The integer to pass to the function when invoked.
5351debfc3dSmrg      *
5361debfc3dSmrg      *  Registers a function as an event callback with an integer parameter to
5371debfc3dSmrg      *  be passed to the function when invoked.  Multiple copies of the
5381debfc3dSmrg      *  function are allowed.  If there are multiple callbacks, they are
5391debfc3dSmrg      *  invoked in the order they were registered.
5401debfc3dSmrg     */
5411debfc3dSmrg     void
5421debfc3dSmrg     register_callback(event_callback __fn, int __index);
5431debfc3dSmrg 
5441debfc3dSmrg   protected:
5451debfc3dSmrg     streamsize		_M_precision;
5461debfc3dSmrg     streamsize		_M_width;
5471debfc3dSmrg     fmtflags		_M_flags;
5481debfc3dSmrg     iostate		_M_exception;
5491debfc3dSmrg     iostate		_M_streambuf_state;
5501debfc3dSmrg 
5511debfc3dSmrg     // 27.4.2.6  Members for callbacks
5521debfc3dSmrg     // 27.4.2.6  ios_base callbacks
5531debfc3dSmrg     struct _Callback_list
5541debfc3dSmrg     {
5551debfc3dSmrg       // Data Members
5561debfc3dSmrg       _Callback_list*		_M_next;
5571debfc3dSmrg       ios_base::event_callback	_M_fn;
5581debfc3dSmrg       int			_M_index;
5591debfc3dSmrg       _Atomic_word		_M_refcount;  // 0 means one reference.
5601debfc3dSmrg 
5611debfc3dSmrg       _Callback_list(ios_base::event_callback __fn, int __index,
5621debfc3dSmrg 		     _Callback_list* __cb)
5631debfc3dSmrg       : _M_next(__cb), _M_fn(__fn), _M_index(__index), _M_refcount(0) { }
5641debfc3dSmrg 
5651debfc3dSmrg       void
5661debfc3dSmrg       _M_add_reference() { __gnu_cxx::__atomic_add_dispatch(&_M_refcount, 1); }
5671debfc3dSmrg 
5681debfc3dSmrg       // 0 => OK to delete.
5691debfc3dSmrg       int
5701debfc3dSmrg       _M_remove_reference()
5711debfc3dSmrg       {
5721debfc3dSmrg         // Be race-detector-friendly.  For more info see bits/c++config.
5731debfc3dSmrg         _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(&_M_refcount);
5741debfc3dSmrg         int __res = __gnu_cxx::__exchange_and_add_dispatch(&_M_refcount, -1);
5751debfc3dSmrg         if (__res == 0)
5761debfc3dSmrg           {
5771debfc3dSmrg             _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(&_M_refcount);
5781debfc3dSmrg           }
5791debfc3dSmrg         return __res;
5801debfc3dSmrg       }
5811debfc3dSmrg     };
5821debfc3dSmrg 
5831debfc3dSmrg      _Callback_list*	_M_callbacks;
5841debfc3dSmrg 
5851debfc3dSmrg     void
5861debfc3dSmrg     _M_call_callbacks(event __ev) throw();
5871debfc3dSmrg 
5881debfc3dSmrg     void
5891debfc3dSmrg     _M_dispose_callbacks(void) throw();
5901debfc3dSmrg 
5911debfc3dSmrg     // 27.4.2.5  Members for iword/pword storage
5921debfc3dSmrg     struct _Words
5931debfc3dSmrg     {
5941debfc3dSmrg       void*	_M_pword;
5951debfc3dSmrg       long	_M_iword;
5961debfc3dSmrg       _Words() : _M_pword(0), _M_iword(0) { }
5971debfc3dSmrg     };
5981debfc3dSmrg 
5991debfc3dSmrg     // Only for failed iword/pword calls.
6001debfc3dSmrg     _Words		_M_word_zero;
6011debfc3dSmrg 
6021debfc3dSmrg     // Guaranteed storage.
6031debfc3dSmrg     // The first 5 iword and pword slots are reserved for internal use.
6041debfc3dSmrg     enum { _S_local_word_size = 8 };
6051debfc3dSmrg     _Words		_M_local_word[_S_local_word_size];
6061debfc3dSmrg 
6071debfc3dSmrg     // Allocated storage.
6081debfc3dSmrg     int			_M_word_size;
6091debfc3dSmrg     _Words*		_M_word;
6101debfc3dSmrg 
6111debfc3dSmrg     _Words&
6121debfc3dSmrg     _M_grow_words(int __index, bool __iword);
6131debfc3dSmrg 
6141debfc3dSmrg     // Members for locale and locale caching.
6151debfc3dSmrg     locale		_M_ios_locale;
6161debfc3dSmrg 
6171debfc3dSmrg     void
6181debfc3dSmrg     _M_init() throw();
6191debfc3dSmrg 
6201debfc3dSmrg   public:
6211debfc3dSmrg 
6221debfc3dSmrg     // 27.4.2.1.6  Class ios_base::Init
6231debfc3dSmrg     // Used to initialize standard streams. In theory, g++ could use
6241debfc3dSmrg     // -finit-priority to order this stuff correctly without going
6251debfc3dSmrg     // through these machinations.
6261debfc3dSmrg     class Init
6271debfc3dSmrg     {
6281debfc3dSmrg       friend class ios_base;
6291debfc3dSmrg     public:
6301debfc3dSmrg       Init();
6311debfc3dSmrg       ~Init();
6321debfc3dSmrg 
633c0a68be4Smrg #if __cplusplus >= 201103L
634c0a68be4Smrg       Init(const Init&) = default;
635c0a68be4Smrg       Init& operator=(const Init&) = default;
636c0a68be4Smrg #endif
637c0a68be4Smrg 
6381debfc3dSmrg     private:
6391debfc3dSmrg       static _Atomic_word	_S_refcount;
6401debfc3dSmrg       static bool		_S_synced_with_stdio;
6411debfc3dSmrg     };
6421debfc3dSmrg 
6431debfc3dSmrg     // [27.4.2.2] fmtflags state functions
6441debfc3dSmrg     /**
6451debfc3dSmrg      *  @brief  Access to format flags.
6461debfc3dSmrg      *  @return  The format control flags for both input and output.
6471debfc3dSmrg     */
6481debfc3dSmrg     fmtflags
6491debfc3dSmrg     flags() const
6501debfc3dSmrg     { return _M_flags; }
6511debfc3dSmrg 
6521debfc3dSmrg     /**
6531debfc3dSmrg      *  @brief  Setting new format flags all at once.
6541debfc3dSmrg      *  @param  __fmtfl  The new flags to set.
6551debfc3dSmrg      *  @return  The previous format control flags.
6561debfc3dSmrg      *
6571debfc3dSmrg      *  This function overwrites all the format flags with @a __fmtfl.
6581debfc3dSmrg     */
6591debfc3dSmrg     fmtflags
6601debfc3dSmrg     flags(fmtflags __fmtfl)
6611debfc3dSmrg     {
6621debfc3dSmrg       fmtflags __old = _M_flags;
6631debfc3dSmrg       _M_flags = __fmtfl;
6641debfc3dSmrg       return __old;
6651debfc3dSmrg     }
6661debfc3dSmrg 
6671debfc3dSmrg     /**
6681debfc3dSmrg      *  @brief  Setting new format flags.
6691debfc3dSmrg      *  @param  __fmtfl  Additional flags to set.
6701debfc3dSmrg      *  @return  The previous format control flags.
6711debfc3dSmrg      *
6721debfc3dSmrg      *  This function sets additional flags in format control.  Flags that
6731debfc3dSmrg      *  were previously set remain set.
6741debfc3dSmrg     */
6751debfc3dSmrg     fmtflags
6761debfc3dSmrg     setf(fmtflags __fmtfl)
6771debfc3dSmrg     {
6781debfc3dSmrg       fmtflags __old = _M_flags;
6791debfc3dSmrg       _M_flags |= __fmtfl;
6801debfc3dSmrg       return __old;
6811debfc3dSmrg     }
6821debfc3dSmrg 
6831debfc3dSmrg     /**
6841debfc3dSmrg      *  @brief  Setting new format flags.
6851debfc3dSmrg      *  @param  __fmtfl  Additional flags to set.
6861debfc3dSmrg      *  @param  __mask  The flags mask for @a fmtfl.
6871debfc3dSmrg      *  @return  The previous format control flags.
6881debfc3dSmrg      *
6891debfc3dSmrg      *  This function clears @a mask in the format flags, then sets
6901debfc3dSmrg      *  @a fmtfl @c & @a mask.  An example mask is @c ios_base::adjustfield.
6911debfc3dSmrg     */
6921debfc3dSmrg     fmtflags
6931debfc3dSmrg     setf(fmtflags __fmtfl, fmtflags __mask)
6941debfc3dSmrg     {
6951debfc3dSmrg       fmtflags __old = _M_flags;
6961debfc3dSmrg       _M_flags &= ~__mask;
6971debfc3dSmrg       _M_flags |= (__fmtfl & __mask);
6981debfc3dSmrg       return __old;
6991debfc3dSmrg     }
7001debfc3dSmrg 
7011debfc3dSmrg     /**
7021debfc3dSmrg      *  @brief  Clearing format flags.
7031debfc3dSmrg      *  @param  __mask  The flags to unset.
7041debfc3dSmrg      *
7051debfc3dSmrg      *  This function clears @a __mask in the format flags.
7061debfc3dSmrg     */
7071debfc3dSmrg     void
7081debfc3dSmrg     unsetf(fmtflags __mask)
7091debfc3dSmrg     { _M_flags &= ~__mask; }
7101debfc3dSmrg 
7111debfc3dSmrg     /**
7121debfc3dSmrg      *  @brief  Flags access.
7131debfc3dSmrg      *  @return  The precision to generate on certain output operations.
7141debfc3dSmrg      *
7151debfc3dSmrg      *  Be careful if you try to give a definition of @a precision here; see
7161debfc3dSmrg      *  DR 189.
7171debfc3dSmrg     */
7181debfc3dSmrg     streamsize
7191debfc3dSmrg     precision() const
7201debfc3dSmrg     { return _M_precision; }
7211debfc3dSmrg 
7221debfc3dSmrg     /**
7231debfc3dSmrg      *  @brief  Changing flags.
7241debfc3dSmrg      *  @param  __prec  The new precision value.
7251debfc3dSmrg      *  @return  The previous value of precision().
7261debfc3dSmrg     */
7271debfc3dSmrg     streamsize
7281debfc3dSmrg     precision(streamsize __prec)
7291debfc3dSmrg     {
7301debfc3dSmrg       streamsize __old = _M_precision;
7311debfc3dSmrg       _M_precision = __prec;
7321debfc3dSmrg       return __old;
7331debfc3dSmrg     }
7341debfc3dSmrg 
7351debfc3dSmrg     /**
7361debfc3dSmrg      *  @brief  Flags access.
7371debfc3dSmrg      *  @return  The minimum field width to generate on output operations.
7381debfc3dSmrg      *
7391debfc3dSmrg      *  <em>Minimum field width</em> refers to the number of characters.
7401debfc3dSmrg     */
7411debfc3dSmrg     streamsize
7421debfc3dSmrg     width() const
7431debfc3dSmrg     { return _M_width; }
7441debfc3dSmrg 
7451debfc3dSmrg     /**
7461debfc3dSmrg      *  @brief  Changing flags.
7471debfc3dSmrg      *  @param  __wide  The new width value.
7481debfc3dSmrg      *  @return  The previous value of width().
7491debfc3dSmrg     */
7501debfc3dSmrg     streamsize
7511debfc3dSmrg     width(streamsize __wide)
7521debfc3dSmrg     {
7531debfc3dSmrg       streamsize __old = _M_width;
7541debfc3dSmrg       _M_width = __wide;
7551debfc3dSmrg       return __old;
7561debfc3dSmrg     }
7571debfc3dSmrg 
7581debfc3dSmrg     // [27.4.2.4] ios_base static members
7591debfc3dSmrg     /**
7601debfc3dSmrg      *  @brief  Interaction with the standard C I/O objects.
7611debfc3dSmrg      *  @param  __sync  Whether to synchronize or not.
7621debfc3dSmrg      *  @return  True if the standard streams were previously synchronized.
7631debfc3dSmrg      *
7641debfc3dSmrg      *  The synchronization referred to is @e only that between the standard
7651debfc3dSmrg      *  C facilities (e.g., stdout) and the standard C++ objects (e.g.,
7661debfc3dSmrg      *  cout).  User-declared streams are unaffected.  See
7671debfc3dSmrg      *  https://gcc.gnu.org/onlinedocs/libstdc++/manual/fstreams.html#std.io.filestreams.binary
7681debfc3dSmrg     */
7691debfc3dSmrg     static bool
7701debfc3dSmrg     sync_with_stdio(bool __sync = true);
7711debfc3dSmrg 
7721debfc3dSmrg     // [27.4.2.3] ios_base locale functions
7731debfc3dSmrg     /**
7741debfc3dSmrg      *  @brief  Setting a new locale.
7751debfc3dSmrg      *  @param  __loc  The new locale.
7761debfc3dSmrg      *  @return  The previous locale.
7771debfc3dSmrg      *
7781debfc3dSmrg      *  Sets the new locale for this stream, and then invokes each callback
7791debfc3dSmrg      *  with imbue_event.
7801debfc3dSmrg     */
7811debfc3dSmrg     locale
7821debfc3dSmrg     imbue(const locale& __loc) throw();
7831debfc3dSmrg 
7841debfc3dSmrg     /**
7851debfc3dSmrg      *  @brief  Locale access
7861debfc3dSmrg      *  @return  A copy of the current locale.
7871debfc3dSmrg      *
7881debfc3dSmrg      *  If @c imbue(loc) has previously been called, then this function
7891debfc3dSmrg      *  returns @c loc.  Otherwise, it returns a copy of @c std::locale(),
7901debfc3dSmrg      *  the global C++ locale.
7911debfc3dSmrg     */
7921debfc3dSmrg     locale
7931debfc3dSmrg     getloc() const
7941debfc3dSmrg     { return _M_ios_locale; }
7951debfc3dSmrg 
7961debfc3dSmrg     /**
7971debfc3dSmrg      *  @brief  Locale access
7981debfc3dSmrg      *  @return  A reference to the current locale.
7991debfc3dSmrg      *
8001debfc3dSmrg      *  Like getloc above, but returns a reference instead of
8011debfc3dSmrg      *  generating a copy.
8021debfc3dSmrg     */
8031debfc3dSmrg     const locale&
8041debfc3dSmrg     _M_getloc() const
8051debfc3dSmrg     { return _M_ios_locale; }
8061debfc3dSmrg 
8071debfc3dSmrg     // [27.4.2.5] ios_base storage functions
8081debfc3dSmrg     /**
8091debfc3dSmrg      *  @brief  Access to unique indices.
8101debfc3dSmrg      *  @return  An integer different from all previous calls.
8111debfc3dSmrg      *
8121debfc3dSmrg      *  This function returns a unique integer every time it is called.  It
8131debfc3dSmrg      *  can be used for any purpose, but is primarily intended to be a unique
8141debfc3dSmrg      *  index for the iword and pword functions.  The expectation is that an
8151debfc3dSmrg      *  application calls xalloc in order to obtain an index in the iword and
8161debfc3dSmrg      *  pword arrays that can be used without fear of conflict.
8171debfc3dSmrg      *
8181debfc3dSmrg      *  The implementation maintains a static variable that is incremented and
8191debfc3dSmrg      *  returned on each invocation.  xalloc is guaranteed to return an index
8201debfc3dSmrg      *  that is safe to use in the iword and pword arrays.
8211debfc3dSmrg     */
8221debfc3dSmrg     static int
8231debfc3dSmrg     xalloc() throw();
8241debfc3dSmrg 
8251debfc3dSmrg     /**
8261debfc3dSmrg      *  @brief  Access to integer array.
8271debfc3dSmrg      *  @param  __ix  Index into the array.
8281debfc3dSmrg      *  @return  A reference to an integer associated with the index.
8291debfc3dSmrg      *
8301debfc3dSmrg      *  The iword function provides access to an array of integers that can be
8311debfc3dSmrg      *  used for any purpose.  The array grows as required to hold the
8321debfc3dSmrg      *  supplied index.  All integers in the array are initialized to 0.
8331debfc3dSmrg      *
8341debfc3dSmrg      *  The implementation reserves several indices.  You should use xalloc to
8351debfc3dSmrg      *  obtain an index that is safe to use.  Also note that since the array
8361debfc3dSmrg      *  can grow dynamically, it is not safe to hold onto the reference.
8371debfc3dSmrg     */
8381debfc3dSmrg     long&
8391debfc3dSmrg     iword(int __ix)
8401debfc3dSmrg     {
841c0a68be4Smrg       _Words& __word = ((unsigned)__ix < (unsigned)_M_word_size)
8421debfc3dSmrg 			? _M_word[__ix] : _M_grow_words(__ix, true);
8431debfc3dSmrg       return __word._M_iword;
8441debfc3dSmrg     }
8451debfc3dSmrg 
8461debfc3dSmrg     /**
8471debfc3dSmrg      *  @brief  Access to void pointer array.
8481debfc3dSmrg      *  @param  __ix  Index into the array.
8491debfc3dSmrg      *  @return  A reference to a void* associated with the index.
8501debfc3dSmrg      *
8511debfc3dSmrg      *  The pword function provides access to an array of pointers that can be
8521debfc3dSmrg      *  used for any purpose.  The array grows as required to hold the
8531debfc3dSmrg      *  supplied index.  All pointers in the array are initialized to 0.
8541debfc3dSmrg      *
8551debfc3dSmrg      *  The implementation reserves several indices.  You should use xalloc to
8561debfc3dSmrg      *  obtain an index that is safe to use.  Also note that since the array
8571debfc3dSmrg      *  can grow dynamically, it is not safe to hold onto the reference.
8581debfc3dSmrg     */
8591debfc3dSmrg     void*&
8601debfc3dSmrg     pword(int __ix)
8611debfc3dSmrg     {
862c0a68be4Smrg       _Words& __word = ((unsigned)__ix < (unsigned)_M_word_size)
8631debfc3dSmrg 			? _M_word[__ix] : _M_grow_words(__ix, false);
8641debfc3dSmrg       return __word._M_pword;
8651debfc3dSmrg     }
8661debfc3dSmrg 
8671debfc3dSmrg     // Destructor
8681debfc3dSmrg     /**
8691debfc3dSmrg      *  Invokes each callback with erase_event.  Destroys local storage.
8701debfc3dSmrg      *
8711debfc3dSmrg      *  Note that the ios_base object for the standard streams never gets
8721debfc3dSmrg      *  destroyed.  As a result, any callbacks registered with the standard
8731debfc3dSmrg      *  streams will not get invoked with erase_event (unless copyfmt is
8741debfc3dSmrg      *  used).
8751debfc3dSmrg     */
8761debfc3dSmrg     virtual ~ios_base();
8771debfc3dSmrg 
8781debfc3dSmrg   protected:
8791debfc3dSmrg     ios_base() throw ();
8801debfc3dSmrg 
8811debfc3dSmrg #if __cplusplus < 201103L
8821debfc3dSmrg   // _GLIBCXX_RESOLVE_LIB_DEFECTS
8831debfc3dSmrg   // 50.  Copy constructor and assignment operator of ios_base
8841debfc3dSmrg   private:
8851debfc3dSmrg     ios_base(const ios_base&);
8861debfc3dSmrg 
8871debfc3dSmrg     ios_base&
8881debfc3dSmrg     operator=(const ios_base&);
8891debfc3dSmrg #else
8901debfc3dSmrg   public:
8911debfc3dSmrg     ios_base(const ios_base&) = delete;
8921debfc3dSmrg 
8931debfc3dSmrg     ios_base&
8941debfc3dSmrg     operator=(const ios_base&) = delete;
8951debfc3dSmrg 
8961debfc3dSmrg   protected:
8971debfc3dSmrg     void
8981debfc3dSmrg     _M_move(ios_base&) noexcept;
8991debfc3dSmrg 
9001debfc3dSmrg     void
9011debfc3dSmrg     _M_swap(ios_base& __rhs) noexcept;
9021debfc3dSmrg #endif
9031debfc3dSmrg   };
9041debfc3dSmrg 
9051debfc3dSmrg   // [27.4.5.1] fmtflags manipulators
9061debfc3dSmrg   /// Calls base.setf(ios_base::boolalpha).
9071debfc3dSmrg   inline ios_base&
9081debfc3dSmrg   boolalpha(ios_base& __base)
9091debfc3dSmrg   {
9101debfc3dSmrg     __base.setf(ios_base::boolalpha);
9111debfc3dSmrg     return __base;
9121debfc3dSmrg   }
9131debfc3dSmrg 
9141debfc3dSmrg   /// Calls base.unsetf(ios_base::boolalpha).
9151debfc3dSmrg   inline ios_base&
9161debfc3dSmrg   noboolalpha(ios_base& __base)
9171debfc3dSmrg   {
9181debfc3dSmrg     __base.unsetf(ios_base::boolalpha);
9191debfc3dSmrg     return __base;
9201debfc3dSmrg   }
9211debfc3dSmrg 
9221debfc3dSmrg   /// Calls base.setf(ios_base::showbase).
9231debfc3dSmrg   inline ios_base&
9241debfc3dSmrg   showbase(ios_base& __base)
9251debfc3dSmrg   {
9261debfc3dSmrg     __base.setf(ios_base::showbase);
9271debfc3dSmrg     return __base;
9281debfc3dSmrg   }
9291debfc3dSmrg 
9301debfc3dSmrg   /// Calls base.unsetf(ios_base::showbase).
9311debfc3dSmrg   inline ios_base&
9321debfc3dSmrg   noshowbase(ios_base& __base)
9331debfc3dSmrg   {
9341debfc3dSmrg     __base.unsetf(ios_base::showbase);
9351debfc3dSmrg     return __base;
9361debfc3dSmrg   }
9371debfc3dSmrg 
9381debfc3dSmrg   /// Calls base.setf(ios_base::showpoint).
9391debfc3dSmrg   inline ios_base&
9401debfc3dSmrg   showpoint(ios_base& __base)
9411debfc3dSmrg   {
9421debfc3dSmrg     __base.setf(ios_base::showpoint);
9431debfc3dSmrg     return __base;
9441debfc3dSmrg   }
9451debfc3dSmrg 
9461debfc3dSmrg   /// Calls base.unsetf(ios_base::showpoint).
9471debfc3dSmrg   inline ios_base&
9481debfc3dSmrg   noshowpoint(ios_base& __base)
9491debfc3dSmrg   {
9501debfc3dSmrg     __base.unsetf(ios_base::showpoint);
9511debfc3dSmrg     return __base;
9521debfc3dSmrg   }
9531debfc3dSmrg 
9541debfc3dSmrg   /// Calls base.setf(ios_base::showpos).
9551debfc3dSmrg   inline ios_base&
9561debfc3dSmrg   showpos(ios_base& __base)
9571debfc3dSmrg   {
9581debfc3dSmrg     __base.setf(ios_base::showpos);
9591debfc3dSmrg     return __base;
9601debfc3dSmrg   }
9611debfc3dSmrg 
9621debfc3dSmrg   /// Calls base.unsetf(ios_base::showpos).
9631debfc3dSmrg   inline ios_base&
9641debfc3dSmrg   noshowpos(ios_base& __base)
9651debfc3dSmrg   {
9661debfc3dSmrg     __base.unsetf(ios_base::showpos);
9671debfc3dSmrg     return __base;
9681debfc3dSmrg   }
9691debfc3dSmrg 
9701debfc3dSmrg   /// Calls base.setf(ios_base::skipws).
9711debfc3dSmrg   inline ios_base&
9721debfc3dSmrg   skipws(ios_base& __base)
9731debfc3dSmrg   {
9741debfc3dSmrg     __base.setf(ios_base::skipws);
9751debfc3dSmrg     return __base;
9761debfc3dSmrg   }
9771debfc3dSmrg 
9781debfc3dSmrg   /// Calls base.unsetf(ios_base::skipws).
9791debfc3dSmrg   inline ios_base&
9801debfc3dSmrg   noskipws(ios_base& __base)
9811debfc3dSmrg   {
9821debfc3dSmrg     __base.unsetf(ios_base::skipws);
9831debfc3dSmrg     return __base;
9841debfc3dSmrg   }
9851debfc3dSmrg 
9861debfc3dSmrg   /// Calls base.setf(ios_base::uppercase).
9871debfc3dSmrg   inline ios_base&
9881debfc3dSmrg   uppercase(ios_base& __base)
9891debfc3dSmrg   {
9901debfc3dSmrg     __base.setf(ios_base::uppercase);
9911debfc3dSmrg     return __base;
9921debfc3dSmrg   }
9931debfc3dSmrg 
9941debfc3dSmrg   /// Calls base.unsetf(ios_base::uppercase).
9951debfc3dSmrg   inline ios_base&
9961debfc3dSmrg   nouppercase(ios_base& __base)
9971debfc3dSmrg   {
9981debfc3dSmrg     __base.unsetf(ios_base::uppercase);
9991debfc3dSmrg     return __base;
10001debfc3dSmrg   }
10011debfc3dSmrg 
10021debfc3dSmrg   /// Calls base.setf(ios_base::unitbuf).
10031debfc3dSmrg   inline ios_base&
10041debfc3dSmrg   unitbuf(ios_base& __base)
10051debfc3dSmrg   {
10061debfc3dSmrg      __base.setf(ios_base::unitbuf);
10071debfc3dSmrg      return __base;
10081debfc3dSmrg   }
10091debfc3dSmrg 
10101debfc3dSmrg   /// Calls base.unsetf(ios_base::unitbuf).
10111debfc3dSmrg   inline ios_base&
10121debfc3dSmrg   nounitbuf(ios_base& __base)
10131debfc3dSmrg   {
10141debfc3dSmrg      __base.unsetf(ios_base::unitbuf);
10151debfc3dSmrg      return __base;
10161debfc3dSmrg   }
10171debfc3dSmrg 
10181debfc3dSmrg   // [27.4.5.2] adjustfield manipulators
10191debfc3dSmrg   /// Calls base.setf(ios_base::internal, ios_base::adjustfield).
10201debfc3dSmrg   inline ios_base&
10211debfc3dSmrg   internal(ios_base& __base)
10221debfc3dSmrg   {
10231debfc3dSmrg      __base.setf(ios_base::internal, ios_base::adjustfield);
10241debfc3dSmrg      return __base;
10251debfc3dSmrg   }
10261debfc3dSmrg 
10271debfc3dSmrg   /// Calls base.setf(ios_base::left, ios_base::adjustfield).
10281debfc3dSmrg   inline ios_base&
10291debfc3dSmrg   left(ios_base& __base)
10301debfc3dSmrg   {
10311debfc3dSmrg     __base.setf(ios_base::left, ios_base::adjustfield);
10321debfc3dSmrg     return __base;
10331debfc3dSmrg   }
10341debfc3dSmrg 
10351debfc3dSmrg   /// Calls base.setf(ios_base::right, ios_base::adjustfield).
10361debfc3dSmrg   inline ios_base&
10371debfc3dSmrg   right(ios_base& __base)
10381debfc3dSmrg   {
10391debfc3dSmrg     __base.setf(ios_base::right, ios_base::adjustfield);
10401debfc3dSmrg     return __base;
10411debfc3dSmrg   }
10421debfc3dSmrg 
10431debfc3dSmrg   // [27.4.5.3] basefield manipulators
10441debfc3dSmrg   /// Calls base.setf(ios_base::dec, ios_base::basefield).
10451debfc3dSmrg   inline ios_base&
10461debfc3dSmrg   dec(ios_base& __base)
10471debfc3dSmrg   {
10481debfc3dSmrg     __base.setf(ios_base::dec, ios_base::basefield);
10491debfc3dSmrg     return __base;
10501debfc3dSmrg   }
10511debfc3dSmrg 
10521debfc3dSmrg   /// Calls base.setf(ios_base::hex, ios_base::basefield).
10531debfc3dSmrg   inline ios_base&
10541debfc3dSmrg   hex(ios_base& __base)
10551debfc3dSmrg   {
10561debfc3dSmrg     __base.setf(ios_base::hex, ios_base::basefield);
10571debfc3dSmrg     return __base;
10581debfc3dSmrg   }
10591debfc3dSmrg 
10601debfc3dSmrg   /// Calls base.setf(ios_base::oct, ios_base::basefield).
10611debfc3dSmrg   inline ios_base&
10621debfc3dSmrg   oct(ios_base& __base)
10631debfc3dSmrg   {
10641debfc3dSmrg     __base.setf(ios_base::oct, ios_base::basefield);
10651debfc3dSmrg     return __base;
10661debfc3dSmrg   }
10671debfc3dSmrg 
10681debfc3dSmrg   // [27.4.5.4] floatfield manipulators
10691debfc3dSmrg   /// Calls base.setf(ios_base::fixed, ios_base::floatfield).
10701debfc3dSmrg   inline ios_base&
10711debfc3dSmrg   fixed(ios_base& __base)
10721debfc3dSmrg   {
10731debfc3dSmrg     __base.setf(ios_base::fixed, ios_base::floatfield);
10741debfc3dSmrg     return __base;
10751debfc3dSmrg   }
10761debfc3dSmrg 
10771debfc3dSmrg   /// Calls base.setf(ios_base::scientific, ios_base::floatfield).
10781debfc3dSmrg   inline ios_base&
10791debfc3dSmrg   scientific(ios_base& __base)
10801debfc3dSmrg   {
10811debfc3dSmrg     __base.setf(ios_base::scientific, ios_base::floatfield);
10821debfc3dSmrg     return __base;
10831debfc3dSmrg   }
10841debfc3dSmrg 
10851debfc3dSmrg #if __cplusplus >= 201103L
10861debfc3dSmrg   // New C++11 floatfield manipulators
10871debfc3dSmrg 
10881debfc3dSmrg   /// Calls
10891debfc3dSmrg   /// base.setf(ios_base::fixed|ios_base::scientific, ios_base::floatfield)
10901debfc3dSmrg   inline ios_base&
10911debfc3dSmrg   hexfloat(ios_base& __base)
10921debfc3dSmrg   {
10931debfc3dSmrg     __base.setf(ios_base::fixed | ios_base::scientific, ios_base::floatfield);
10941debfc3dSmrg     return __base;
10951debfc3dSmrg   }
10961debfc3dSmrg 
10971debfc3dSmrg   /// Calls @c base.unsetf(ios_base::floatfield)
10981debfc3dSmrg   inline ios_base&
10991debfc3dSmrg   defaultfloat(ios_base& __base)
11001debfc3dSmrg   {
11011debfc3dSmrg     __base.unsetf(ios_base::floatfield);
11021debfc3dSmrg     return __base;
11031debfc3dSmrg   }
11041debfc3dSmrg #endif
11051debfc3dSmrg 
11061debfc3dSmrg _GLIBCXX_END_NAMESPACE_VERSION
11071debfc3dSmrg } // namespace
11081debfc3dSmrg 
11091debfc3dSmrg #endif /* _IOS_BASE_H */
1110