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