100db7afdSDavid E. O'Brien // Iostreams base classes -*- C++ -*-
200db7afdSDavid E. O'Brien 
3*f8a1b7d9SAlexander Kabaev // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
400db7afdSDavid E. O'Brien // 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 ios_base.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 
36*f8a1b7d9SAlexander Kabaev //
37*f8a1b7d9SAlexander Kabaev // ISO C++ 14882: 27.4  Iostreams base classes
38*f8a1b7d9SAlexander Kabaev //
39*f8a1b7d9SAlexander Kabaev 
40ffeaf689SAlexander Kabaev #ifndef _IOS_BASE_H
41ffeaf689SAlexander Kabaev #define _IOS_BASE_H 1
4200db7afdSDavid E. O'Brien 
4300db7afdSDavid E. O'Brien #pragma GCC system_header
4400db7afdSDavid E. O'Brien 
45*f8a1b7d9SAlexander Kabaev #include <ext/atomicity.h>
461b86b14eSAlexander Kabaev #include <bits/localefwd.h>
471b86b14eSAlexander Kabaev #include <bits/locale_classes.h>
4800db7afdSDavid E. O'Brien 
49*f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NAMESPACE(std)
50*f8a1b7d9SAlexander Kabaev 
5100db7afdSDavid E. O'Brien   // The following definitions of bitmask types are enums, not ints,
5200db7afdSDavid E. O'Brien   // as permitted (but not required) in the standard, in order to provide
5300db7afdSDavid E. O'Brien   // better type safety in iostream calls.  A side effect is that
5400db7afdSDavid E. O'Brien   // expressions involving them are no longer compile-time constants.
55f260e61bSAlexander Kabaev   enum _Ios_Fmtflags
56f260e61bSAlexander Kabaev     {
57f260e61bSAlexander Kabaev       _S_boolalpha 	= 1L << 0,
58f260e61bSAlexander Kabaev       _S_dec 		= 1L << 1,
59f260e61bSAlexander Kabaev       _S_fixed 		= 1L << 2,
60f260e61bSAlexander Kabaev       _S_hex 		= 1L << 3,
61f260e61bSAlexander Kabaev       _S_internal 	= 1L << 4,
62f260e61bSAlexander Kabaev       _S_left 		= 1L << 5,
63f260e61bSAlexander Kabaev       _S_oct 		= 1L << 6,
64f260e61bSAlexander Kabaev       _S_right 		= 1L << 7,
65f260e61bSAlexander Kabaev       _S_scientific 	= 1L << 8,
66f260e61bSAlexander Kabaev       _S_showbase 	= 1L << 9,
67f260e61bSAlexander Kabaev       _S_showpoint 	= 1L << 10,
68f260e61bSAlexander Kabaev       _S_showpos 	= 1L << 11,
69f260e61bSAlexander Kabaev       _S_skipws 	= 1L << 12,
70f260e61bSAlexander Kabaev       _S_unitbuf 	= 1L << 13,
71f260e61bSAlexander Kabaev       _S_uppercase 	= 1L << 14,
72f260e61bSAlexander Kabaev       _S_adjustfield 	= _S_left | _S_right | _S_internal,
73f260e61bSAlexander Kabaev       _S_basefield 	= _S_dec | _S_oct | _S_hex,
74f260e61bSAlexander Kabaev       _S_floatfield 	= _S_scientific | _S_fixed,
75f260e61bSAlexander Kabaev       _S_ios_fmtflags_end = 1L << 16
76f260e61bSAlexander Kabaev     };
7700db7afdSDavid E. O'Brien 
7800db7afdSDavid E. O'Brien   inline _Ios_Fmtflags
7900db7afdSDavid E. O'Brien   operator&(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
8000db7afdSDavid E. O'Brien   { return _Ios_Fmtflags(static_cast<int>(__a) & static_cast<int>(__b)); }
8100db7afdSDavid E. O'Brien 
8200db7afdSDavid E. O'Brien   inline _Ios_Fmtflags
8300db7afdSDavid E. O'Brien   operator|(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
8400db7afdSDavid E. O'Brien   { return _Ios_Fmtflags(static_cast<int>(__a) | static_cast<int>(__b)); }
8500db7afdSDavid E. O'Brien 
8600db7afdSDavid E. O'Brien   inline _Ios_Fmtflags
8700db7afdSDavid E. O'Brien   operator^(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
8800db7afdSDavid E. O'Brien   { return _Ios_Fmtflags(static_cast<int>(__a) ^ static_cast<int>(__b)); }
8900db7afdSDavid E. O'Brien 
90f260e61bSAlexander Kabaev   inline _Ios_Fmtflags&
9100db7afdSDavid E. O'Brien   operator|=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b)
9200db7afdSDavid E. O'Brien   { return __a = __a | __b; }
9300db7afdSDavid E. O'Brien 
94f260e61bSAlexander Kabaev   inline _Ios_Fmtflags&
9500db7afdSDavid E. O'Brien   operator&=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b)
9600db7afdSDavid E. O'Brien   { return __a = __a & __b; }
9700db7afdSDavid E. O'Brien 
98f260e61bSAlexander Kabaev   inline _Ios_Fmtflags&
9900db7afdSDavid E. O'Brien   operator^=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b)
10000db7afdSDavid E. O'Brien   { return __a = __a ^ __b; }
10100db7afdSDavid E. O'Brien 
10200db7afdSDavid E. O'Brien   inline _Ios_Fmtflags
10300db7afdSDavid E. O'Brien   operator~(_Ios_Fmtflags __a)
10400db7afdSDavid E. O'Brien   { return _Ios_Fmtflags(~static_cast<int>(__a)); }
10500db7afdSDavid E. O'Brien 
10600db7afdSDavid E. O'Brien 
107f260e61bSAlexander Kabaev   enum _Ios_Openmode
108f260e61bSAlexander Kabaev     {
109f260e61bSAlexander Kabaev       _S_app 		= 1L << 0,
110f260e61bSAlexander Kabaev       _S_ate 		= 1L << 1,
111f260e61bSAlexander Kabaev       _S_bin 		= 1L << 2,
112f260e61bSAlexander Kabaev       _S_in 		= 1L << 3,
113f260e61bSAlexander Kabaev       _S_out 		= 1L << 4,
114f260e61bSAlexander Kabaev       _S_trunc 		= 1L << 5,
115f260e61bSAlexander Kabaev       _S_ios_openmode_end = 1L << 16
116f260e61bSAlexander Kabaev     };
11700db7afdSDavid E. O'Brien 
11800db7afdSDavid E. O'Brien   inline _Ios_Openmode
11900db7afdSDavid E. O'Brien   operator&(_Ios_Openmode __a, _Ios_Openmode __b)
12000db7afdSDavid E. O'Brien   { return _Ios_Openmode(static_cast<int>(__a) & static_cast<int>(__b)); }
12100db7afdSDavid E. O'Brien 
12200db7afdSDavid E. O'Brien   inline _Ios_Openmode
12300db7afdSDavid E. O'Brien   operator|(_Ios_Openmode __a, _Ios_Openmode __b)
12400db7afdSDavid E. O'Brien   { return _Ios_Openmode(static_cast<int>(__a) | static_cast<int>(__b)); }
12500db7afdSDavid E. O'Brien 
12600db7afdSDavid E. O'Brien   inline _Ios_Openmode
12700db7afdSDavid E. O'Brien   operator^(_Ios_Openmode __a, _Ios_Openmode __b)
12800db7afdSDavid E. O'Brien   { return _Ios_Openmode(static_cast<int>(__a) ^ static_cast<int>(__b)); }
12900db7afdSDavid E. O'Brien 
130f260e61bSAlexander Kabaev   inline _Ios_Openmode&
13100db7afdSDavid E. O'Brien   operator|=(_Ios_Openmode& __a, _Ios_Openmode __b)
13200db7afdSDavid E. O'Brien   { return __a = __a | __b; }
13300db7afdSDavid E. O'Brien 
134f260e61bSAlexander Kabaev   inline _Ios_Openmode&
13500db7afdSDavid E. O'Brien   operator&=(_Ios_Openmode& __a, _Ios_Openmode __b)
13600db7afdSDavid E. O'Brien   { return __a = __a & __b; }
13700db7afdSDavid E. O'Brien 
138f260e61bSAlexander Kabaev   inline _Ios_Openmode&
13900db7afdSDavid E. O'Brien   operator^=(_Ios_Openmode& __a, _Ios_Openmode __b)
14000db7afdSDavid E. O'Brien   { return __a = __a ^ __b; }
14100db7afdSDavid E. O'Brien 
14200db7afdSDavid E. O'Brien   inline _Ios_Openmode
14300db7afdSDavid E. O'Brien   operator~(_Ios_Openmode __a)
14400db7afdSDavid E. O'Brien   { return _Ios_Openmode(~static_cast<int>(__a)); }
14500db7afdSDavid E. O'Brien 
14600db7afdSDavid E. O'Brien 
147f260e61bSAlexander Kabaev   enum _Ios_Iostate
148f260e61bSAlexander Kabaev     {
149f260e61bSAlexander Kabaev       _S_goodbit 		= 0,
150f260e61bSAlexander Kabaev       _S_badbit 		= 1L << 0,
151f260e61bSAlexander Kabaev       _S_eofbit 		= 1L << 1,
152f260e61bSAlexander Kabaev       _S_failbit		= 1L << 2,
153f260e61bSAlexander Kabaev       _S_ios_iostate_end = 1L << 16
154f260e61bSAlexander Kabaev     };
15500db7afdSDavid E. O'Brien 
15600db7afdSDavid E. O'Brien   inline _Ios_Iostate
15700db7afdSDavid E. O'Brien   operator&(_Ios_Iostate __a, _Ios_Iostate __b)
15800db7afdSDavid E. O'Brien   { return _Ios_Iostate(static_cast<int>(__a) & static_cast<int>(__b)); }
15900db7afdSDavid E. O'Brien 
16000db7afdSDavid E. O'Brien   inline _Ios_Iostate
16100db7afdSDavid E. O'Brien   operator|(_Ios_Iostate __a, _Ios_Iostate __b)
16200db7afdSDavid E. O'Brien   { return _Ios_Iostate(static_cast<int>(__a) | static_cast<int>(__b)); }
16300db7afdSDavid E. O'Brien 
16400db7afdSDavid E. O'Brien   inline _Ios_Iostate
16500db7afdSDavid E. O'Brien   operator^(_Ios_Iostate __a, _Ios_Iostate __b)
16600db7afdSDavid E. O'Brien   { return _Ios_Iostate(static_cast<int>(__a) ^ static_cast<int>(__b)); }
16700db7afdSDavid E. O'Brien 
168f260e61bSAlexander Kabaev   inline _Ios_Iostate&
16900db7afdSDavid E. O'Brien   operator|=(_Ios_Iostate& __a, _Ios_Iostate __b)
17000db7afdSDavid E. O'Brien   { return __a = __a | __b; }
17100db7afdSDavid E. O'Brien 
172f260e61bSAlexander Kabaev   inline _Ios_Iostate&
17300db7afdSDavid E. O'Brien   operator&=(_Ios_Iostate& __a, _Ios_Iostate __b)
17400db7afdSDavid E. O'Brien   { return __a = __a & __b; }
17500db7afdSDavid E. O'Brien 
176f260e61bSAlexander Kabaev   inline _Ios_Iostate&
17700db7afdSDavid E. O'Brien   operator^=(_Ios_Iostate& __a, _Ios_Iostate __b)
17800db7afdSDavid E. O'Brien   { return __a = __a ^ __b; }
17900db7afdSDavid E. O'Brien 
18000db7afdSDavid E. O'Brien   inline _Ios_Iostate
18100db7afdSDavid E. O'Brien   operator~(_Ios_Iostate __a)
18200db7afdSDavid E. O'Brien   { return _Ios_Iostate(~static_cast<int>(__a)); }
18300db7afdSDavid E. O'Brien 
184f260e61bSAlexander Kabaev   enum _Ios_Seekdir
185f260e61bSAlexander Kabaev     {
186f260e61bSAlexander Kabaev       _S_beg = 0,
187f260e61bSAlexander Kabaev       _S_cur = SEEK_CUR,
188f260e61bSAlexander Kabaev       _S_end = SEEK_END,
189f260e61bSAlexander Kabaev       _S_ios_seekdir_end = 1L << 16
190f260e61bSAlexander Kabaev     };
19100db7afdSDavid E. O'Brien 
19200db7afdSDavid E. O'Brien   // 27.4.2  Class ios_base
1931b86b14eSAlexander Kabaev   /**
194*f8a1b7d9SAlexander Kabaev    *  @brief  The base of the I/O class hierarchy.
1951b86b14eSAlexander Kabaev    *
1961b86b14eSAlexander Kabaev    *  This class defines everything that can be defined about I/O that does
1971b86b14eSAlexander Kabaev    *  not depend on the type of characters being input or output.  Most
1981b86b14eSAlexander Kabaev    *  people will only see @c ios_base when they need to specify the full
1991b86b14eSAlexander Kabaev    *  name of the various I/O flags (e.g., the openmodes).
2001b86b14eSAlexander Kabaev   */
20100db7afdSDavid E. O'Brien   class ios_base
20200db7afdSDavid E. O'Brien   {
20300db7afdSDavid E. O'Brien   public:
20400db7afdSDavid E. O'Brien 
20500db7afdSDavid E. O'Brien     // 27.4.2.1.1  Class ios_base::failure
2061b86b14eSAlexander Kabaev     /// These are thrown to indicate problems.  Doc me.
20700db7afdSDavid E. O'Brien     class failure : public exception
20800db7afdSDavid E. O'Brien     {
20900db7afdSDavid E. O'Brien     public:
210ffeaf689SAlexander Kabaev       // _GLIBCXX_RESOLVE_LIB_DEFECTS
21100db7afdSDavid E. O'Brien       // 48.  Use of non-existent exception constructor
21200db7afdSDavid E. O'Brien       explicit
21300db7afdSDavid E. O'Brien       failure(const string& __str) throw();
21400db7afdSDavid E. O'Brien 
21500db7afdSDavid E. O'Brien       // This declaration is not useless:
21600db7afdSDavid E. O'Brien       // http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118
21700db7afdSDavid E. O'Brien       virtual
21800db7afdSDavid E. O'Brien       ~failure() throw();
21900db7afdSDavid E. O'Brien 
22000db7afdSDavid E. O'Brien       virtual const char*
22100db7afdSDavid E. O'Brien       what() const throw();
22200db7afdSDavid E. O'Brien 
22300db7afdSDavid E. O'Brien     private:
224ffeaf689SAlexander Kabaev       string _M_msg;
22500db7afdSDavid E. O'Brien     };
22600db7afdSDavid E. O'Brien 
22700db7afdSDavid E. O'Brien     // 27.4.2.1.2  Type ios_base::fmtflags
2281b86b14eSAlexander Kabaev     /**
2291b86b14eSAlexander Kabaev      *  @brief This is a bitmask type.
2301b86b14eSAlexander Kabaev      *
2311b86b14eSAlexander Kabaev      *  @c "_Ios_Fmtflags" is implementation-defined, but it is valid to
2321b86b14eSAlexander Kabaev      *  perform bitwise operations on these values and expect the Right
2331b86b14eSAlexander Kabaev      *  Thing to happen.  Defined objects of type fmtflags are:
2341b86b14eSAlexander Kabaev      *  - boolalpha
2351b86b14eSAlexander Kabaev      *  - dec
2361b86b14eSAlexander Kabaev      *  - fixed
2371b86b14eSAlexander Kabaev      *  - hex
2381b86b14eSAlexander Kabaev      *  - internal
2391b86b14eSAlexander Kabaev      *  - left
2401b86b14eSAlexander Kabaev      *  - oct
2411b86b14eSAlexander Kabaev      *  - right
2421b86b14eSAlexander Kabaev      *  - scientific
2431b86b14eSAlexander Kabaev      *  - showbase
2441b86b14eSAlexander Kabaev      *  - showpoint
2451b86b14eSAlexander Kabaev      *  - showpos
2461b86b14eSAlexander Kabaev      *  - skipws
2471b86b14eSAlexander Kabaev      *  - unitbuf
2481b86b14eSAlexander Kabaev      *  - uppercase
2491b86b14eSAlexander Kabaev      *  - adjustfield
2501b86b14eSAlexander Kabaev      *  - basefield
2511b86b14eSAlexander Kabaev      *  - floatfield
2521b86b14eSAlexander Kabaev     */
25300db7afdSDavid E. O'Brien     typedef _Ios_Fmtflags fmtflags;
254ffeaf689SAlexander Kabaev 
2551b86b14eSAlexander Kabaev     /// Insert/extract @c bool in alphabetic rather than numeric format.
256*f8a1b7d9SAlexander Kabaev     static const fmtflags boolalpha =   _S_boolalpha;
257ffeaf689SAlexander Kabaev 
2581b86b14eSAlexander Kabaev     /// Converts integer input or generates integer output in decimal base.
259*f8a1b7d9SAlexander Kabaev     static const fmtflags dec =         _S_dec;
260ffeaf689SAlexander Kabaev 
2611b86b14eSAlexander Kabaev     /// Generate floating-point output in fixed-point notation.
262*f8a1b7d9SAlexander Kabaev     static const fmtflags fixed =       _S_fixed;
263ffeaf689SAlexander Kabaev 
2641b86b14eSAlexander Kabaev     /// Converts integer input or generates integer output in hexadecimal base.
265*f8a1b7d9SAlexander Kabaev     static const fmtflags hex =         _S_hex;
266ffeaf689SAlexander Kabaev 
2671b86b14eSAlexander Kabaev     /// Adds fill characters at a designated internal point in certain
2681b86b14eSAlexander Kabaev     /// generated output, or identical to @c right if no such point is
2691b86b14eSAlexander Kabaev     /// designated.
270*f8a1b7d9SAlexander Kabaev     static const fmtflags internal =    _S_internal;
271ffeaf689SAlexander Kabaev 
2721b86b14eSAlexander Kabaev     /// Adds fill characters on the right (final positions) of certain
2731b86b14eSAlexander Kabaev     /// generated output.  (I.e., the thing you print is flush left.)
274*f8a1b7d9SAlexander Kabaev     static const fmtflags left =        _S_left;
275ffeaf689SAlexander Kabaev 
2761b86b14eSAlexander Kabaev     /// Converts integer input or generates integer output in octal base.
277*f8a1b7d9SAlexander Kabaev     static const fmtflags oct =         _S_oct;
278ffeaf689SAlexander Kabaev 
2791b86b14eSAlexander Kabaev     /// Adds fill characters on the left (initial positions) of certain
2801b86b14eSAlexander Kabaev     /// generated output.  (I.e., the thing you print is flush right.)
281*f8a1b7d9SAlexander Kabaev     static const fmtflags right =       _S_right;
282ffeaf689SAlexander Kabaev 
2831b86b14eSAlexander Kabaev     /// Generates floating-point output in scientific notation.
284*f8a1b7d9SAlexander Kabaev     static const fmtflags scientific =  _S_scientific;
285ffeaf689SAlexander Kabaev 
2861b86b14eSAlexander Kabaev     /// Generates a prefix indicating the numeric base of generated integer
2871b86b14eSAlexander Kabaev     /// output.
288*f8a1b7d9SAlexander Kabaev     static const fmtflags showbase =    _S_showbase;
289ffeaf689SAlexander Kabaev 
2901b86b14eSAlexander Kabaev     /// Generates a decimal-point character unconditionally in generated
2911b86b14eSAlexander Kabaev     /// floating-point output.
292*f8a1b7d9SAlexander Kabaev     static const fmtflags showpoint =   _S_showpoint;
293ffeaf689SAlexander Kabaev 
2941b86b14eSAlexander Kabaev     /// Generates a + sign in non-negative generated numeric output.
295*f8a1b7d9SAlexander Kabaev     static const fmtflags showpos =     _S_showpos;
296ffeaf689SAlexander Kabaev 
2971b86b14eSAlexander Kabaev     /// Skips leading white space before certain input operations.
298*f8a1b7d9SAlexander Kabaev     static const fmtflags skipws =      _S_skipws;
299ffeaf689SAlexander Kabaev 
3001b86b14eSAlexander Kabaev     /// Flushes output after each output operation.
301*f8a1b7d9SAlexander Kabaev     static const fmtflags unitbuf =     _S_unitbuf;
302ffeaf689SAlexander Kabaev 
3031b86b14eSAlexander Kabaev     /// Replaces certain lowercase letters with their uppercase equivalents
3041b86b14eSAlexander Kabaev     /// in generated output.
305*f8a1b7d9SAlexander Kabaev     static const fmtflags uppercase =   _S_uppercase;
306ffeaf689SAlexander Kabaev 
3071b86b14eSAlexander Kabaev     /// A mask of left|right|internal.  Useful for the 2-arg form of @c setf.
308*f8a1b7d9SAlexander Kabaev     static const fmtflags adjustfield = _S_adjustfield;
309ffeaf689SAlexander Kabaev 
3101b86b14eSAlexander Kabaev     /// A mask of dec|oct|hex.  Useful for the 2-arg form of @c setf.
311*f8a1b7d9SAlexander Kabaev     static const fmtflags basefield =   _S_basefield;
312ffeaf689SAlexander Kabaev 
3131b86b14eSAlexander Kabaev     /// A mask of scientific|fixed.  Useful for the 2-arg form of @c setf.
314*f8a1b7d9SAlexander Kabaev     static const fmtflags floatfield =  _S_floatfield;
31500db7afdSDavid E. O'Brien 
31600db7afdSDavid E. O'Brien     // 27.4.2.1.3  Type ios_base::iostate
3171b86b14eSAlexander Kabaev     /**
3181b86b14eSAlexander Kabaev      *  @brief This is a bitmask type.
3191b86b14eSAlexander Kabaev      *
3201b86b14eSAlexander Kabaev      *  @c "_Ios_Iostate" is implementation-defined, but it is valid to
3211b86b14eSAlexander Kabaev      *  perform bitwise operations on these values and expect the Right
3221b86b14eSAlexander Kabaev      *  Thing to happen.  Defined objects of type iostate are:
3231b86b14eSAlexander Kabaev      *  - badbit
3241b86b14eSAlexander Kabaev      *  - eofbit
3251b86b14eSAlexander Kabaev      *  - failbit
3261b86b14eSAlexander Kabaev      *  - goodbit
3271b86b14eSAlexander Kabaev     */
32800db7afdSDavid E. O'Brien     typedef _Ios_Iostate iostate;
329ffeaf689SAlexander Kabaev 
3301b86b14eSAlexander Kabaev     /// Indicates a loss of integrity in an input or output sequence (such
3311b86b14eSAlexander Kabaev     /// as an irrecoverable read error from a file).
332*f8a1b7d9SAlexander Kabaev     static const iostate badbit =	_S_badbit;
333ffeaf689SAlexander Kabaev 
3341b86b14eSAlexander Kabaev     /// Indicates that an input operation reached the end of an input sequence.
335*f8a1b7d9SAlexander Kabaev     static const iostate eofbit =	_S_eofbit;
336ffeaf689SAlexander Kabaev 
3371b86b14eSAlexander Kabaev     /// Indicates that an input operation failed to read the expected
3381b86b14eSAlexander Kabaev     /// characters, or that an output operation failed to generate the
3391b86b14eSAlexander Kabaev     /// desired characters.
340*f8a1b7d9SAlexander Kabaev     static const iostate failbit =	_S_failbit;
341ffeaf689SAlexander Kabaev 
3421b86b14eSAlexander Kabaev     /// Indicates all is well.
343*f8a1b7d9SAlexander Kabaev     static const iostate goodbit =	_S_goodbit;
34400db7afdSDavid E. O'Brien 
3451b86b14eSAlexander Kabaev     // 27.4.2.1.4  Type ios_base::openmode
3461b86b14eSAlexander Kabaev     /**
3471b86b14eSAlexander Kabaev      *  @brief This is a bitmask type.
3481b86b14eSAlexander Kabaev      *
3491b86b14eSAlexander Kabaev      *  @c "_Ios_Openmode" is implementation-defined, but it is valid to
3501b86b14eSAlexander Kabaev      *  perform bitwise operations on these values and expect the Right
3511b86b14eSAlexander Kabaev      *  Thing to happen.  Defined objects of type openmode are:
3521b86b14eSAlexander Kabaev      *  - app
3531b86b14eSAlexander Kabaev      *  - ate
3541b86b14eSAlexander Kabaev      *  - binary
3551b86b14eSAlexander Kabaev      *  - in
3561b86b14eSAlexander Kabaev      *  - out
3571b86b14eSAlexander Kabaev      *  - trunc
3581b86b14eSAlexander Kabaev     */
35900db7afdSDavid E. O'Brien     typedef _Ios_Openmode openmode;
360ffeaf689SAlexander Kabaev 
3611b86b14eSAlexander Kabaev     /// Seek to end before each write.
362*f8a1b7d9SAlexander Kabaev     static const openmode app =		_S_app;
363ffeaf689SAlexander Kabaev 
3641b86b14eSAlexander Kabaev     /// Open and seek to end immediately after opening.
365*f8a1b7d9SAlexander Kabaev     static const openmode ate =		_S_ate;
366ffeaf689SAlexander Kabaev 
3671b86b14eSAlexander Kabaev     /// Perform input and output in binary mode (as opposed to text mode).
3681b86b14eSAlexander Kabaev     /// This is probably not what you think it is; see
3691b86b14eSAlexander Kabaev     /// http://gcc.gnu.org/onlinedocs/libstdc++/27_io/howto.html#3 and
3701b86b14eSAlexander Kabaev     /// http://gcc.gnu.org/onlinedocs/libstdc++/27_io/howto.html#7 for more.
371*f8a1b7d9SAlexander Kabaev     static const openmode binary =	_S_bin;
372ffeaf689SAlexander Kabaev 
3731b86b14eSAlexander Kabaev     /// Open for input.  Default for @c ifstream and fstream.
374*f8a1b7d9SAlexander Kabaev     static const openmode in =		_S_in;
375ffeaf689SAlexander Kabaev 
3761b86b14eSAlexander Kabaev     /// Open for output.  Default for @c ofstream and fstream.
377*f8a1b7d9SAlexander Kabaev     static const openmode out =		_S_out;
378ffeaf689SAlexander Kabaev 
3791b86b14eSAlexander Kabaev     /// Open for input.  Default for @c ofstream.
380*f8a1b7d9SAlexander Kabaev     static const openmode trunc =	_S_trunc;
38100db7afdSDavid E. O'Brien 
3821b86b14eSAlexander Kabaev     // 27.4.2.1.5  Type ios_base::seekdir
3831b86b14eSAlexander Kabaev     /**
3841b86b14eSAlexander Kabaev      *  @brief This is an enumerated type.
3851b86b14eSAlexander Kabaev      *
3861b86b14eSAlexander Kabaev      *  @c "_Ios_Seekdir" is implementation-defined.  Defined values
3871b86b14eSAlexander Kabaev      *  of type seekdir are:
3881b86b14eSAlexander Kabaev      *  - beg
3891b86b14eSAlexander Kabaev      *  - cur, equivalent to @c SEEK_CUR in the C standard library.
3901b86b14eSAlexander Kabaev      *  - end, equivalent to @c SEEK_END in the C standard library.
3911b86b14eSAlexander Kabaev     */
39200db7afdSDavid E. O'Brien     typedef _Ios_Seekdir seekdir;
393ffeaf689SAlexander Kabaev 
3941b86b14eSAlexander Kabaev     /// Request a seek relative to the beginning of the stream.
395*f8a1b7d9SAlexander Kabaev     static const seekdir beg =		_S_beg;
396ffeaf689SAlexander Kabaev 
3971b86b14eSAlexander Kabaev     /// Request a seek relative to the current position within the sequence.
398*f8a1b7d9SAlexander Kabaev     static const seekdir cur =		_S_cur;
399ffeaf689SAlexander Kabaev 
4001b86b14eSAlexander Kabaev     /// Request a seek relative to the current end of the sequence.
401*f8a1b7d9SAlexander Kabaev     static const seekdir end =		_S_end;
40200db7afdSDavid E. O'Brien 
4031b86b14eSAlexander Kabaev     // Annex D.6
40400db7afdSDavid E. O'Brien     typedef int io_state;
40500db7afdSDavid E. O'Brien     typedef int open_mode;
40600db7afdSDavid E. O'Brien     typedef int seek_dir;
4078f1134fbSDavid E. O'Brien 
4088f1134fbSDavid E. O'Brien     typedef std::streampos streampos;
4098f1134fbSDavid E. O'Brien     typedef std::streamoff streamoff;
41000db7afdSDavid E. O'Brien 
41100db7afdSDavid E. O'Brien     // Callbacks;
4121b86b14eSAlexander Kabaev     /**
413ffeaf689SAlexander Kabaev      *  @brief  The set of events that may be passed to an event callback.
414ffeaf689SAlexander Kabaev      *
415ffeaf689SAlexander Kabaev      *  erase_event is used during ~ios() and copyfmt().  imbue_event is used
416ffeaf689SAlexander Kabaev      *  during imbue().  copyfmt_event is used during copyfmt().
4171b86b14eSAlexander Kabaev     */
41800db7afdSDavid E. O'Brien     enum event
41900db7afdSDavid E. O'Brien     {
42000db7afdSDavid E. O'Brien       erase_event,
42100db7afdSDavid E. O'Brien       imbue_event,
42200db7afdSDavid E. O'Brien       copyfmt_event
42300db7afdSDavid E. O'Brien     };
42400db7afdSDavid E. O'Brien 
4251b86b14eSAlexander Kabaev     /**
426ffeaf689SAlexander Kabaev      *  @brief  The type of an event callback function.
427ffeaf689SAlexander Kabaev      *  @param  event  One of the members of the event enum.
428ffeaf689SAlexander Kabaev      *  @param  ios_base  Reference to the ios_base object.
429ffeaf689SAlexander Kabaev      *  @param  int  The integer provided when the callback was registered.
430ffeaf689SAlexander Kabaev      *
431ffeaf689SAlexander Kabaev      *  Event callbacks are user defined functions that get called during
432ffeaf689SAlexander Kabaev      *  several ios_base and basic_ios functions, specifically imbue(),
433ffeaf689SAlexander Kabaev      *  copyfmt(), and ~ios().
4341b86b14eSAlexander Kabaev     */
43500db7afdSDavid E. O'Brien     typedef void (*event_callback) (event, ios_base&, int);
43600db7afdSDavid E. O'Brien 
4371b86b14eSAlexander Kabaev     /**
438ffeaf689SAlexander Kabaev      *  @brief  Add the callback __fn with parameter __index.
439ffeaf689SAlexander Kabaev      *  @param  __fn  The function to add.
440ffeaf689SAlexander Kabaev      *  @param  __index  The integer to pass to the function when invoked.
441ffeaf689SAlexander Kabaev      *
442ffeaf689SAlexander Kabaev      *  Registers a function as an event callback with an integer parameter to
443ffeaf689SAlexander Kabaev      *  be passed to the function when invoked.  Multiple copies of the
444ffeaf689SAlexander Kabaev      *  function are allowed.  If there are multiple callbacks, they are
445ffeaf689SAlexander Kabaev      *  invoked in the order they were registered.
4461b86b14eSAlexander Kabaev     */
44700db7afdSDavid E. O'Brien     void
44800db7afdSDavid E. O'Brien     register_callback(event_callback __fn, int __index);
44900db7afdSDavid E. O'Brien 
45000db7afdSDavid E. O'Brien   protected:
4511b86b14eSAlexander Kabaev     //@{
4521b86b14eSAlexander Kabaev     /**
4531b86b14eSAlexander Kabaev      *  @if maint
4541b86b14eSAlexander Kabaev      *  ios_base data members (doc me)
4551b86b14eSAlexander Kabaev      *  @endif
4561b86b14eSAlexander Kabaev     */
45700db7afdSDavid E. O'Brien     streamsize		_M_precision;
45800db7afdSDavid E. O'Brien     streamsize		_M_width;
45900db7afdSDavid E. O'Brien     fmtflags		_M_flags;
46000db7afdSDavid E. O'Brien     iostate		_M_exception;
46100db7afdSDavid E. O'Brien     iostate		_M_streambuf_state;
4621b86b14eSAlexander Kabaev     //@}
46300db7afdSDavid E. O'Brien 
46400db7afdSDavid E. O'Brien     // 27.4.2.6  Members for callbacks
46500db7afdSDavid E. O'Brien     // 27.4.2.6  ios_base callbacks
46600db7afdSDavid E. O'Brien     struct _Callback_list
46700db7afdSDavid E. O'Brien     {
46800db7afdSDavid E. O'Brien       // Data Members
46900db7afdSDavid E. O'Brien       _Callback_list*		_M_next;
47000db7afdSDavid E. O'Brien       ios_base::event_callback	_M_fn;
47100db7afdSDavid E. O'Brien       int			_M_index;
47200db7afdSDavid E. O'Brien       _Atomic_word		_M_refcount;  // 0 means one reference.
47300db7afdSDavid E. O'Brien 
_Callback_list_Callback_list47400db7afdSDavid E. O'Brien       _Callback_list(ios_base::event_callback __fn, int __index,
47500db7afdSDavid E. O'Brien 		     _Callback_list* __cb)
47600db7afdSDavid E. O'Brien       : _M_next(__cb), _M_fn(__fn), _M_index(__index), _M_refcount(0) { }
47700db7afdSDavid E. O'Brien 
47800db7afdSDavid E. O'Brien       void
_M_add_reference_Callback_list479*f8a1b7d9SAlexander Kabaev       _M_add_reference() { __gnu_cxx::__atomic_add_dispatch(&_M_refcount, 1); }
48000db7afdSDavid E. O'Brien 
48100db7afdSDavid E. O'Brien       // 0 => OK to delete.
48200db7afdSDavid E. O'Brien       int
_M_remove_reference_Callback_list483ffeaf689SAlexander Kabaev       _M_remove_reference()
484*f8a1b7d9SAlexander Kabaev       { return __gnu_cxx::__exchange_and_add_dispatch(&_M_refcount, -1); }
48500db7afdSDavid E. O'Brien     };
48600db7afdSDavid E. O'Brien 
48700db7afdSDavid E. O'Brien      _Callback_list*	_M_callbacks;
48800db7afdSDavid E. O'Brien 
48900db7afdSDavid E. O'Brien     void
49000db7afdSDavid E. O'Brien     _M_call_callbacks(event __ev) throw();
49100db7afdSDavid E. O'Brien 
49200db7afdSDavid E. O'Brien     void
49300db7afdSDavid E. O'Brien     _M_dispose_callbacks(void);
49400db7afdSDavid E. O'Brien 
49500db7afdSDavid E. O'Brien     // 27.4.2.5  Members for iword/pword storage
49600db7afdSDavid E. O'Brien     struct _Words
49700db7afdSDavid E. O'Brien     {
49800db7afdSDavid E. O'Brien       void*	_M_pword;
49900db7afdSDavid E. O'Brien       long	_M_iword;
_Words_Words50000db7afdSDavid E. O'Brien       _Words() : _M_pword(0), _M_iword(0) { }
50100db7afdSDavid E. O'Brien     };
50200db7afdSDavid E. O'Brien 
50300db7afdSDavid E. O'Brien     // Only for failed iword/pword calls.
50400db7afdSDavid E. O'Brien     _Words		_M_word_zero;
50500db7afdSDavid E. O'Brien 
50600db7afdSDavid E. O'Brien     // Guaranteed storage.
5071b86b14eSAlexander Kabaev     // The first 5 iword and pword slots are reserved for internal use.
508*f8a1b7d9SAlexander Kabaev     enum { _S_local_word_size = 8 };
50900db7afdSDavid E. O'Brien     _Words		_M_local_word[_S_local_word_size];
51000db7afdSDavid E. O'Brien 
51100db7afdSDavid E. O'Brien     // Allocated storage.
51200db7afdSDavid E. O'Brien     int			_M_word_size;
51300db7afdSDavid E. O'Brien     _Words*		_M_word;
51400db7afdSDavid E. O'Brien 
51500db7afdSDavid E. O'Brien     _Words&
516ffeaf689SAlexander Kabaev     _M_grow_words(int __index, bool __iword);
51700db7afdSDavid E. O'Brien 
51800db7afdSDavid E. O'Brien     // Members for locale and locale caching.
51900db7afdSDavid E. O'Brien     locale		_M_ios_locale;
52000db7afdSDavid E. O'Brien 
52100db7afdSDavid E. O'Brien     void
52200db7afdSDavid E. O'Brien     _M_init();
52300db7afdSDavid E. O'Brien 
52400db7afdSDavid E. O'Brien   public:
52500db7afdSDavid E. O'Brien 
52600db7afdSDavid E. O'Brien     // 27.4.2.1.6  Class ios_base::Init
52700db7afdSDavid E. O'Brien     // Used to initialize standard streams. In theory, g++ could use
52800db7afdSDavid E. O'Brien     // -finit-priority to order this stuff correctly without going
52900db7afdSDavid E. O'Brien     // through these machinations.
53000db7afdSDavid E. O'Brien     class Init
53100db7afdSDavid E. O'Brien     {
53200db7afdSDavid E. O'Brien       friend class ios_base;
53300db7afdSDavid E. O'Brien     public:
53400db7afdSDavid E. O'Brien       Init();
53500db7afdSDavid E. O'Brien       ~Init();
53600db7afdSDavid E. O'Brien 
53700db7afdSDavid E. O'Brien     private:
538ffeaf689SAlexander Kabaev       static _Atomic_word	_S_refcount;
53900db7afdSDavid E. O'Brien       static bool		_S_synced_with_stdio;
54000db7afdSDavid E. O'Brien     };
54100db7afdSDavid E. O'Brien 
5421b86b14eSAlexander Kabaev     // [27.4.2.2] fmtflags state functions
5431b86b14eSAlexander Kabaev     /**
5441b86b14eSAlexander Kabaev      *  @brief  Access to format flags.
5451b86b14eSAlexander Kabaev      *  @return  The format control flags for both input and output.
5461b86b14eSAlexander Kabaev     */
54700db7afdSDavid E. O'Brien     inline fmtflags
flags()54800db7afdSDavid E. O'Brien     flags() const { return _M_flags; }
54900db7afdSDavid E. O'Brien 
5501b86b14eSAlexander Kabaev     /**
5511b86b14eSAlexander Kabaev      *  @brief  Setting new format flags all at once.
5521b86b14eSAlexander Kabaev      *  @param  fmtfl  The new flags to set.
5531b86b14eSAlexander Kabaev      *  @return  The previous format control flags.
5541b86b14eSAlexander Kabaev      *
5551b86b14eSAlexander Kabaev      *  This function overwrites all the format flags with @a fmtfl.
5561b86b14eSAlexander Kabaev     */
55700db7afdSDavid E. O'Brien     inline fmtflags
flags(fmtflags __fmtfl)55800db7afdSDavid E. O'Brien     flags(fmtflags __fmtfl)
55900db7afdSDavid E. O'Brien     {
56000db7afdSDavid E. O'Brien       fmtflags __old = _M_flags;
56100db7afdSDavid E. O'Brien       _M_flags = __fmtfl;
56200db7afdSDavid E. O'Brien       return __old;
56300db7afdSDavid E. O'Brien     }
56400db7afdSDavid E. O'Brien 
5651b86b14eSAlexander Kabaev     /**
5661b86b14eSAlexander Kabaev      *  @brief  Setting new format flags.
5671b86b14eSAlexander Kabaev      *  @param  fmtfl  Additional flags to set.
5681b86b14eSAlexander Kabaev      *  @return  The previous format control flags.
5691b86b14eSAlexander Kabaev      *
5701b86b14eSAlexander Kabaev      *  This function sets additional flags in format control.  Flags that
5711b86b14eSAlexander Kabaev      *  were previously set remain set.
5721b86b14eSAlexander Kabaev     */
57300db7afdSDavid E. O'Brien     inline fmtflags
setf(fmtflags __fmtfl)57400db7afdSDavid E. O'Brien     setf(fmtflags __fmtfl)
57500db7afdSDavid E. O'Brien     {
57600db7afdSDavid E. O'Brien       fmtflags __old = _M_flags;
57700db7afdSDavid E. O'Brien       _M_flags |= __fmtfl;
57800db7afdSDavid E. O'Brien       return __old;
57900db7afdSDavid E. O'Brien     }
58000db7afdSDavid E. O'Brien 
5811b86b14eSAlexander Kabaev     /**
5821b86b14eSAlexander Kabaev      *  @brief  Setting new format flags.
5831b86b14eSAlexander Kabaev      *  @param  fmtfl  Additional flags to set.
5841b86b14eSAlexander Kabaev      *  @param  mask  The flags mask for @a fmtfl.
5851b86b14eSAlexander Kabaev      *  @return  The previous format control flags.
5861b86b14eSAlexander Kabaev      *
5871b86b14eSAlexander Kabaev      *  This function clears @a mask in the format flags, then sets
5881b86b14eSAlexander Kabaev      *  @a fmtfl @c & @a mask.  An example mask is @c ios_base::adjustfield.
5891b86b14eSAlexander Kabaev     */
59000db7afdSDavid E. O'Brien     inline fmtflags
setf(fmtflags __fmtfl,fmtflags __mask)59100db7afdSDavid E. O'Brien     setf(fmtflags __fmtfl, fmtflags __mask)
59200db7afdSDavid E. O'Brien     {
59300db7afdSDavid E. O'Brien       fmtflags __old = _M_flags;
59400db7afdSDavid E. O'Brien       _M_flags &= ~__mask;
59500db7afdSDavid E. O'Brien       _M_flags |= (__fmtfl & __mask);
59600db7afdSDavid E. O'Brien       return __old;
59700db7afdSDavid E. O'Brien     }
59800db7afdSDavid E. O'Brien 
5991b86b14eSAlexander Kabaev     /**
6001b86b14eSAlexander Kabaev      *  @brief  Clearing format flags.
6011b86b14eSAlexander Kabaev      *  @param  mask  The flags to unset.
6021b86b14eSAlexander Kabaev      *
6031b86b14eSAlexander Kabaev      *  This function clears @a mask in the format flags.
6041b86b14eSAlexander Kabaev     */
60500db7afdSDavid E. O'Brien     inline void
unsetf(fmtflags __mask)60600db7afdSDavid E. O'Brien     unsetf(fmtflags __mask) { _M_flags &= ~__mask; }
60700db7afdSDavid E. O'Brien 
6081b86b14eSAlexander Kabaev     /**
6091b86b14eSAlexander Kabaev      *  @brief  Flags access.
6101b86b14eSAlexander Kabaev      *  @return  The precision to generate on certain output operations.
6111b86b14eSAlexander Kabaev      *
6121b86b14eSAlexander Kabaev      *  @if maint
6131b86b14eSAlexander Kabaev      *  Be careful if you try to give a definition of "precision" here; see
6141b86b14eSAlexander Kabaev      *  DR 189.
6151b86b14eSAlexander Kabaev      *  @endif
6161b86b14eSAlexander Kabaev     */
61700db7afdSDavid E. O'Brien     inline streamsize
precision()61800db7afdSDavid E. O'Brien     precision() const { return _M_precision; }
61900db7afdSDavid E. O'Brien 
6201b86b14eSAlexander Kabaev     /**
6211b86b14eSAlexander Kabaev      *  @brief  Changing flags.
6221b86b14eSAlexander Kabaev      *  @param  prec  The new precision value.
6231b86b14eSAlexander Kabaev      *  @return  The previous value of precision().
6241b86b14eSAlexander Kabaev     */
62500db7afdSDavid E. O'Brien     inline streamsize
precision(streamsize __prec)62600db7afdSDavid E. O'Brien     precision(streamsize __prec)
62700db7afdSDavid E. O'Brien     {
62800db7afdSDavid E. O'Brien       streamsize __old = _M_precision;
62900db7afdSDavid E. O'Brien       _M_precision = __prec;
63000db7afdSDavid E. O'Brien       return __old;
63100db7afdSDavid E. O'Brien     }
63200db7afdSDavid E. O'Brien 
6331b86b14eSAlexander Kabaev     /**
6341b86b14eSAlexander Kabaev      *  @brief  Flags access.
6351b86b14eSAlexander Kabaev      *  @return  The minimum field width to generate on output operations.
6361b86b14eSAlexander Kabaev      *
6371b86b14eSAlexander Kabaev      *  "Minimum field width" refers to the number of characters.
6381b86b14eSAlexander Kabaev     */
63900db7afdSDavid E. O'Brien     inline streamsize
width()64000db7afdSDavid E. O'Brien     width() const { return _M_width; }
64100db7afdSDavid E. O'Brien 
6421b86b14eSAlexander Kabaev     /**
6431b86b14eSAlexander Kabaev      *  @brief  Changing flags.
6441b86b14eSAlexander Kabaev      *  @param  wide  The new width value.
6451b86b14eSAlexander Kabaev      *  @return  The previous value of width().
6461b86b14eSAlexander Kabaev     */
64700db7afdSDavid E. O'Brien     inline streamsize
width(streamsize __wide)64800db7afdSDavid E. O'Brien     width(streamsize __wide)
64900db7afdSDavid E. O'Brien     {
65000db7afdSDavid E. O'Brien       streamsize __old = _M_width;
65100db7afdSDavid E. O'Brien       _M_width = __wide;
65200db7afdSDavid E. O'Brien       return __old;
65300db7afdSDavid E. O'Brien     }
65400db7afdSDavid E. O'Brien 
6551b86b14eSAlexander Kabaev     // [27.4.2.4] ios_base static members
6561b86b14eSAlexander Kabaev     /**
6571b86b14eSAlexander Kabaev      *  @brief  Interaction with the standard C I/O objects.
6581b86b14eSAlexander Kabaev      *  @param  sync  Whether to synchronize or not.
6591b86b14eSAlexander Kabaev      *  @return  True if the standard streams were previously synchronized.
6601b86b14eSAlexander Kabaev      *
6611b86b14eSAlexander Kabaev      *  The synchronization referred to is @e only that between the standard
6621b86b14eSAlexander Kabaev      *  C facilities (e.g., stdout) and the standard C++ objects (e.g.,
6631b86b14eSAlexander Kabaev      *  cout).  User-declared streams are unaffected.  See
6641b86b14eSAlexander Kabaev      *  http://gcc.gnu.org/onlinedocs/libstdc++/27_io/howto.html#8 for more.
6651b86b14eSAlexander Kabaev     */
66600db7afdSDavid E. O'Brien     static bool
66700db7afdSDavid E. O'Brien     sync_with_stdio(bool __sync = true);
66800db7afdSDavid E. O'Brien 
6691b86b14eSAlexander Kabaev     // [27.4.2.3] ios_base locale functions
6701b86b14eSAlexander Kabaev     /**
6711b86b14eSAlexander Kabaev      *  @brief  Setting a new locale.
6721b86b14eSAlexander Kabaev      *  @param  loc  The new locale.
6731b86b14eSAlexander Kabaev      *  @return  The previous locale.
6741b86b14eSAlexander Kabaev      *
675ffeaf689SAlexander Kabaev      *  Sets the new locale for this stream, and then invokes each callback
676ffeaf689SAlexander Kabaev      *  with imbue_event.
6771b86b14eSAlexander Kabaev     */
67800db7afdSDavid E. O'Brien     locale
67900db7afdSDavid E. O'Brien     imbue(const locale& __loc);
68000db7afdSDavid E. O'Brien 
6811b86b14eSAlexander Kabaev     /**
6821b86b14eSAlexander Kabaev      *  @brief  Locale access
6831b86b14eSAlexander Kabaev      *  @return  A copy of the current locale.
6841b86b14eSAlexander Kabaev      *
6851b86b14eSAlexander Kabaev      *  If @c imbue(loc) has previously been called, then this function
6861b86b14eSAlexander Kabaev      *  returns @c loc.  Otherwise, it returns a copy of @c std::locale(),
6871b86b14eSAlexander Kabaev      *  the global C++ locale.
6881b86b14eSAlexander Kabaev     */
68900db7afdSDavid E. O'Brien     inline locale
getloc()69000db7afdSDavid E. O'Brien     getloc() const { return _M_ios_locale; }
69100db7afdSDavid E. O'Brien 
6921b86b14eSAlexander Kabaev     /**
6931b86b14eSAlexander Kabaev      *  @brief  Locale access
6941b86b14eSAlexander Kabaev      *  @return  A reference to the current locale.
6951b86b14eSAlexander Kabaev      *
6961b86b14eSAlexander Kabaev      *  Like getloc above, but returns a reference instead of
6971b86b14eSAlexander Kabaev      *  generating a copy.
6981b86b14eSAlexander Kabaev     */
6991b86b14eSAlexander Kabaev     inline const locale&
_M_getloc()7001b86b14eSAlexander Kabaev     _M_getloc() const { return _M_ios_locale; }
7011b86b14eSAlexander Kabaev 
7021b86b14eSAlexander Kabaev     // [27.4.2.5] ios_base storage functions
7031b86b14eSAlexander Kabaev     /**
704ffeaf689SAlexander Kabaev      *  @brief  Access to unique indices.
705ffeaf689SAlexander Kabaev      *  @return  An integer different from all previous calls.
706ffeaf689SAlexander Kabaev      *
707ffeaf689SAlexander Kabaev      *  This function returns a unique integer every time it is called.  It
708ffeaf689SAlexander Kabaev      *  can be used for any purpose, but is primarily intended to be a unique
709ffeaf689SAlexander Kabaev      *  index for the iword and pword functions.  The expectation is that an
710ffeaf689SAlexander Kabaev      *  application calls xalloc in order to obtain an index in the iword and
711ffeaf689SAlexander Kabaev      *  pword arrays that can be used without fear of conflict.
712ffeaf689SAlexander Kabaev      *
713ffeaf689SAlexander Kabaev      *  The implementation maintains a static variable that is incremented and
714ffeaf689SAlexander Kabaev      *  returned on each invocation.  xalloc is guaranteed to return an index
715ffeaf689SAlexander Kabaev      *  that is safe to use in the iword and pword arrays.
7161b86b14eSAlexander Kabaev     */
71700db7afdSDavid E. O'Brien     static int
71800db7afdSDavid E. O'Brien     xalloc() throw();
71900db7afdSDavid E. O'Brien 
7201b86b14eSAlexander Kabaev     /**
721ffeaf689SAlexander Kabaev      *  @brief  Access to integer array.
722ffeaf689SAlexander Kabaev      *  @param  __ix  Index into the array.
723ffeaf689SAlexander Kabaev      *  @return  A reference to an integer associated with the index.
724ffeaf689SAlexander Kabaev      *
725ffeaf689SAlexander Kabaev      *  The iword function provides access to an array of integers that can be
726ffeaf689SAlexander Kabaev      *  used for any purpose.  The array grows as required to hold the
727ffeaf689SAlexander Kabaev      *  supplied index.  All integers in the array are initialized to 0.
728ffeaf689SAlexander Kabaev      *
729ffeaf689SAlexander Kabaev      *  The implementation reserves several indices.  You should use xalloc to
730ffeaf689SAlexander Kabaev      *  obtain an index that is safe to use.  Also note that since the array
731ffeaf689SAlexander Kabaev      *  can grow dynamically, it is not safe to hold onto the reference.
7321b86b14eSAlexander Kabaev     */
73300db7afdSDavid E. O'Brien     inline long&
iword(int __ix)73400db7afdSDavid E. O'Brien     iword(int __ix)
73500db7afdSDavid E. O'Brien     {
73600db7afdSDavid E. O'Brien       _Words& __word = (__ix < _M_word_size)
737ffeaf689SAlexander Kabaev 			? _M_word[__ix] : _M_grow_words(__ix, true);
73800db7afdSDavid E. O'Brien       return __word._M_iword;
73900db7afdSDavid E. O'Brien     }
74000db7afdSDavid E. O'Brien 
7411b86b14eSAlexander Kabaev     /**
742ffeaf689SAlexander Kabaev      *  @brief  Access to void pointer array.
743ffeaf689SAlexander Kabaev      *  @param  __ix  Index into the array.
744ffeaf689SAlexander Kabaev      *  @return  A reference to a void* associated with the index.
745ffeaf689SAlexander Kabaev      *
746ffeaf689SAlexander Kabaev      *  The pword function provides access to an array of pointers that can be
747ffeaf689SAlexander Kabaev      *  used for any purpose.  The array grows as required to hold the
748ffeaf689SAlexander Kabaev      *  supplied index.  All pointers in the array are initialized to 0.
749ffeaf689SAlexander Kabaev      *
750ffeaf689SAlexander Kabaev      *  The implementation reserves several indices.  You should use xalloc to
751ffeaf689SAlexander Kabaev      *  obtain an index that is safe to use.  Also note that since the array
752ffeaf689SAlexander Kabaev      *  can grow dynamically, it is not safe to hold onto the reference.
7531b86b14eSAlexander Kabaev     */
75400db7afdSDavid E. O'Brien     inline void*&
pword(int __ix)75500db7afdSDavid E. O'Brien     pword(int __ix)
75600db7afdSDavid E. O'Brien     {
75700db7afdSDavid E. O'Brien       _Words& __word = (__ix < _M_word_size)
758ffeaf689SAlexander Kabaev 			? _M_word[__ix] : _M_grow_words(__ix, false);
75900db7afdSDavid E. O'Brien       return __word._M_pword;
76000db7afdSDavid E. O'Brien     }
76100db7afdSDavid E. O'Brien 
76200db7afdSDavid E. O'Brien     // Destructor
7631b86b14eSAlexander Kabaev     /**
764ffeaf689SAlexander Kabaev      *  Invokes each callback with erase_event.  Destroys local storage.
765ffeaf689SAlexander Kabaev      *
766ffeaf689SAlexander Kabaev      *  Note that the ios_base object for the standard streams never gets
767ffeaf689SAlexander Kabaev      *  destroyed.  As a result, any callbacks registered with the standard
768ffeaf689SAlexander Kabaev      *  streams will not get invoked with erase_event (unless copyfmt is
769ffeaf689SAlexander Kabaev      *  used).
7701b86b14eSAlexander Kabaev     */
771ffeaf689SAlexander Kabaev     virtual ~ios_base();
77200db7afdSDavid E. O'Brien 
77300db7afdSDavid E. O'Brien   protected:
77400db7afdSDavid E. O'Brien     ios_base();
77500db7afdSDavid E. O'Brien 
776ffeaf689SAlexander Kabaev   // _GLIBCXX_RESOLVE_LIB_DEFECTS
77700db7afdSDavid E. O'Brien   // 50.  Copy constructor and assignment operator of ios_base
77800db7afdSDavid E. O'Brien   private:
77900db7afdSDavid E. O'Brien     ios_base(const ios_base&);
78000db7afdSDavid E. O'Brien 
78100db7afdSDavid E. O'Brien     ios_base&
78200db7afdSDavid E. O'Brien     operator=(const ios_base&);
78300db7afdSDavid E. O'Brien   };
78400db7afdSDavid E. O'Brien 
7851b86b14eSAlexander Kabaev   // [27.4.5.1] fmtflags manipulators
7861b86b14eSAlexander Kabaev   /// Calls base.setf(ios_base::boolalpha).
78700db7afdSDavid E. O'Brien   inline ios_base&
boolalpha(ios_base & __base)78800db7afdSDavid E. O'Brien   boolalpha(ios_base& __base)
78900db7afdSDavid E. O'Brien   {
79000db7afdSDavid E. O'Brien     __base.setf(ios_base::boolalpha);
79100db7afdSDavid E. O'Brien     return __base;
79200db7afdSDavid E. O'Brien   }
79300db7afdSDavid E. O'Brien 
7941b86b14eSAlexander Kabaev   /// Calls base.unsetf(ios_base::boolalpha).
79500db7afdSDavid E. O'Brien   inline ios_base&
noboolalpha(ios_base & __base)79600db7afdSDavid E. O'Brien   noboolalpha(ios_base& __base)
79700db7afdSDavid E. O'Brien   {
79800db7afdSDavid E. O'Brien     __base.unsetf(ios_base::boolalpha);
79900db7afdSDavid E. O'Brien     return __base;
80000db7afdSDavid E. O'Brien   }
80100db7afdSDavid E. O'Brien 
8021b86b14eSAlexander Kabaev   /// Calls base.setf(ios_base::showbase).
80300db7afdSDavid E. O'Brien   inline ios_base&
showbase(ios_base & __base)80400db7afdSDavid E. O'Brien   showbase(ios_base& __base)
80500db7afdSDavid E. O'Brien   {
80600db7afdSDavid E. O'Brien     __base.setf(ios_base::showbase);
80700db7afdSDavid E. O'Brien     return __base;
80800db7afdSDavid E. O'Brien   }
80900db7afdSDavid E. O'Brien 
8101b86b14eSAlexander Kabaev   /// Calls base.unsetf(ios_base::showbase).
81100db7afdSDavid E. O'Brien   inline ios_base&
noshowbase(ios_base & __base)81200db7afdSDavid E. O'Brien   noshowbase(ios_base& __base)
81300db7afdSDavid E. O'Brien   {
81400db7afdSDavid E. O'Brien     __base.unsetf(ios_base::showbase);
81500db7afdSDavid E. O'Brien     return __base;
81600db7afdSDavid E. O'Brien   }
81700db7afdSDavid E. O'Brien 
8181b86b14eSAlexander Kabaev   /// Calls base.setf(ios_base::showpoint).
81900db7afdSDavid E. O'Brien   inline ios_base&
showpoint(ios_base & __base)82000db7afdSDavid E. O'Brien   showpoint(ios_base& __base)
82100db7afdSDavid E. O'Brien   {
82200db7afdSDavid E. O'Brien     __base.setf(ios_base::showpoint);
82300db7afdSDavid E. O'Brien     return __base;
82400db7afdSDavid E. O'Brien   }
82500db7afdSDavid E. O'Brien 
8261b86b14eSAlexander Kabaev   /// Calls base.unsetf(ios_base::showpoint).
82700db7afdSDavid E. O'Brien   inline ios_base&
noshowpoint(ios_base & __base)82800db7afdSDavid E. O'Brien   noshowpoint(ios_base& __base)
82900db7afdSDavid E. O'Brien   {
83000db7afdSDavid E. O'Brien     __base.unsetf(ios_base::showpoint);
83100db7afdSDavid E. O'Brien     return __base;
83200db7afdSDavid E. O'Brien   }
83300db7afdSDavid E. O'Brien 
8341b86b14eSAlexander Kabaev   /// Calls base.setf(ios_base::showpos).
83500db7afdSDavid E. O'Brien   inline ios_base&
showpos(ios_base & __base)83600db7afdSDavid E. O'Brien   showpos(ios_base& __base)
83700db7afdSDavid E. O'Brien   {
83800db7afdSDavid E. O'Brien     __base.setf(ios_base::showpos);
83900db7afdSDavid E. O'Brien     return __base;
84000db7afdSDavid E. O'Brien   }
84100db7afdSDavid E. O'Brien 
8421b86b14eSAlexander Kabaev   /// Calls base.unsetf(ios_base::showpos).
84300db7afdSDavid E. O'Brien   inline ios_base&
noshowpos(ios_base & __base)84400db7afdSDavid E. O'Brien   noshowpos(ios_base& __base)
84500db7afdSDavid E. O'Brien   {
84600db7afdSDavid E. O'Brien     __base.unsetf(ios_base::showpos);
84700db7afdSDavid E. O'Brien     return __base;
84800db7afdSDavid E. O'Brien   }
84900db7afdSDavid E. O'Brien 
8501b86b14eSAlexander Kabaev   /// Calls base.setf(ios_base::skipws).
85100db7afdSDavid E. O'Brien   inline ios_base&
skipws(ios_base & __base)85200db7afdSDavid E. O'Brien   skipws(ios_base& __base)
85300db7afdSDavid E. O'Brien   {
85400db7afdSDavid E. O'Brien     __base.setf(ios_base::skipws);
85500db7afdSDavid E. O'Brien     return __base;
85600db7afdSDavid E. O'Brien   }
85700db7afdSDavid E. O'Brien 
8581b86b14eSAlexander Kabaev   /// Calls base.unsetf(ios_base::skipws).
85900db7afdSDavid E. O'Brien   inline ios_base&
noskipws(ios_base & __base)86000db7afdSDavid E. O'Brien   noskipws(ios_base& __base)
86100db7afdSDavid E. O'Brien   {
86200db7afdSDavid E. O'Brien     __base.unsetf(ios_base::skipws);
86300db7afdSDavid E. O'Brien     return __base;
86400db7afdSDavid E. O'Brien   }
86500db7afdSDavid E. O'Brien 
8661b86b14eSAlexander Kabaev   /// Calls base.setf(ios_base::uppercase).
86700db7afdSDavid E. O'Brien   inline ios_base&
uppercase(ios_base & __base)86800db7afdSDavid E. O'Brien   uppercase(ios_base& __base)
86900db7afdSDavid E. O'Brien   {
87000db7afdSDavid E. O'Brien     __base.setf(ios_base::uppercase);
87100db7afdSDavid E. O'Brien     return __base;
87200db7afdSDavid E. O'Brien   }
87300db7afdSDavid E. O'Brien 
8741b86b14eSAlexander Kabaev   /// Calls base.unsetf(ios_base::uppercase).
87500db7afdSDavid E. O'Brien   inline ios_base&
nouppercase(ios_base & __base)87600db7afdSDavid E. O'Brien   nouppercase(ios_base& __base)
87700db7afdSDavid E. O'Brien   {
87800db7afdSDavid E. O'Brien     __base.unsetf(ios_base::uppercase);
87900db7afdSDavid E. O'Brien     return __base;
88000db7afdSDavid E. O'Brien   }
88100db7afdSDavid E. O'Brien 
8821b86b14eSAlexander Kabaev   /// Calls base.setf(ios_base::unitbuf).
88300db7afdSDavid E. O'Brien   inline ios_base&
unitbuf(ios_base & __base)88400db7afdSDavid E. O'Brien   unitbuf(ios_base& __base)
88500db7afdSDavid E. O'Brien   {
88600db7afdSDavid E. O'Brien      __base.setf(ios_base::unitbuf);
88700db7afdSDavid E. O'Brien      return __base;
88800db7afdSDavid E. O'Brien   }
88900db7afdSDavid E. O'Brien 
8901b86b14eSAlexander Kabaev   /// Calls base.unsetf(ios_base::unitbuf).
89100db7afdSDavid E. O'Brien   inline ios_base&
nounitbuf(ios_base & __base)89200db7afdSDavid E. O'Brien   nounitbuf(ios_base& __base)
89300db7afdSDavid E. O'Brien   {
89400db7afdSDavid E. O'Brien      __base.unsetf(ios_base::unitbuf);
89500db7afdSDavid E. O'Brien      return __base;
89600db7afdSDavid E. O'Brien   }
89700db7afdSDavid E. O'Brien 
8981b86b14eSAlexander Kabaev   // [27.4.5.2] adjustfield anipulators
8991b86b14eSAlexander Kabaev   /// Calls base.setf(ios_base::internal, ios_base::adjustfield).
90000db7afdSDavid E. O'Brien   inline ios_base&
internal(ios_base & __base)90100db7afdSDavid E. O'Brien   internal(ios_base& __base)
90200db7afdSDavid E. O'Brien   {
90300db7afdSDavid E. O'Brien      __base.setf(ios_base::internal, ios_base::adjustfield);
90400db7afdSDavid E. O'Brien      return __base;
90500db7afdSDavid E. O'Brien   }
90600db7afdSDavid E. O'Brien 
9071b86b14eSAlexander Kabaev   /// Calls base.setf(ios_base::left, ios_base::adjustfield).
90800db7afdSDavid E. O'Brien   inline ios_base&
left(ios_base & __base)90900db7afdSDavid E. O'Brien   left(ios_base& __base)
91000db7afdSDavid E. O'Brien   {
91100db7afdSDavid E. O'Brien     __base.setf(ios_base::left, ios_base::adjustfield);
91200db7afdSDavid E. O'Brien     return __base;
91300db7afdSDavid E. O'Brien   }
91400db7afdSDavid E. O'Brien 
9151b86b14eSAlexander Kabaev   /// Calls base.setf(ios_base::right, ios_base::adjustfield).
91600db7afdSDavid E. O'Brien   inline ios_base&
right(ios_base & __base)91700db7afdSDavid E. O'Brien   right(ios_base& __base)
91800db7afdSDavid E. O'Brien   {
91900db7afdSDavid E. O'Brien     __base.setf(ios_base::right, ios_base::adjustfield);
92000db7afdSDavid E. O'Brien     return __base;
92100db7afdSDavid E. O'Brien   }
92200db7afdSDavid E. O'Brien 
9231b86b14eSAlexander Kabaev   // [27.4.5.3] basefield anipulators
9241b86b14eSAlexander Kabaev   /// Calls base.setf(ios_base::dec, ios_base::basefield).
92500db7afdSDavid E. O'Brien   inline ios_base&
dec(ios_base & __base)92600db7afdSDavid E. O'Brien   dec(ios_base& __base)
92700db7afdSDavid E. O'Brien   {
92800db7afdSDavid E. O'Brien     __base.setf(ios_base::dec, ios_base::basefield);
92900db7afdSDavid E. O'Brien     return __base;
93000db7afdSDavid E. O'Brien   }
93100db7afdSDavid E. O'Brien 
9321b86b14eSAlexander Kabaev   /// Calls base.setf(ios_base::hex, ios_base::basefield).
93300db7afdSDavid E. O'Brien   inline ios_base&
hex(ios_base & __base)93400db7afdSDavid E. O'Brien   hex(ios_base& __base)
93500db7afdSDavid E. O'Brien   {
93600db7afdSDavid E. O'Brien     __base.setf(ios_base::hex, ios_base::basefield);
93700db7afdSDavid E. O'Brien     return __base;
93800db7afdSDavid E. O'Brien   }
93900db7afdSDavid E. O'Brien 
9401b86b14eSAlexander Kabaev   /// Calls base.setf(ios_base::oct, ios_base::basefield).
94100db7afdSDavid E. O'Brien   inline ios_base&
oct(ios_base & __base)94200db7afdSDavid E. O'Brien   oct(ios_base& __base)
94300db7afdSDavid E. O'Brien   {
94400db7afdSDavid E. O'Brien     __base.setf(ios_base::oct, ios_base::basefield);
94500db7afdSDavid E. O'Brien     return __base;
94600db7afdSDavid E. O'Brien   }
94700db7afdSDavid E. O'Brien 
9481b86b14eSAlexander Kabaev   // [27.4.5.4] floatfield anipulators
9491b86b14eSAlexander Kabaev   /// Calls base.setf(ios_base::fixed, ios_base::floatfield).
95000db7afdSDavid E. O'Brien   inline ios_base&
fixed(ios_base & __base)95100db7afdSDavid E. O'Brien   fixed(ios_base& __base)
95200db7afdSDavid E. O'Brien   {
95300db7afdSDavid E. O'Brien     __base.setf(ios_base::fixed, ios_base::floatfield);
95400db7afdSDavid E. O'Brien     return __base;
95500db7afdSDavid E. O'Brien   }
95600db7afdSDavid E. O'Brien 
9571b86b14eSAlexander Kabaev   /// Calls base.setf(ios_base::scientific, ios_base::floatfield).
95800db7afdSDavid E. O'Brien   inline ios_base&
scientific(ios_base & __base)95900db7afdSDavid E. O'Brien   scientific(ios_base& __base)
96000db7afdSDavid E. O'Brien   {
96100db7afdSDavid E. O'Brien     __base.setf(ios_base::scientific, ios_base::floatfield);
96200db7afdSDavid E. O'Brien     return __base;
96300db7afdSDavid E. O'Brien   }
964*f8a1b7d9SAlexander Kabaev 
965*f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NAMESPACE
96600db7afdSDavid E. O'Brien 
967ffeaf689SAlexander Kabaev #endif /* _IOS_BASE_H */
96800db7afdSDavid E. O'Brien 
969