100db7afdSDavid E. O'Brien // Standard stream manipulators -*- C++ -*- 200db7afdSDavid E. O'Brien 3*f8a1b7d9SAlexander Kabaev // Copyright (C) 1997, 1998, 1999, 2001, 2002, 2003, 2005 41b86b14eSAlexander Kabaev // Free Software Foundation, Inc. 500db7afdSDavid E. O'Brien // 600db7afdSDavid E. O'Brien // This file is part of the GNU ISO C++ Library. This library is free 700db7afdSDavid E. O'Brien // software; you can redistribute it and/or modify it under the 800db7afdSDavid E. O'Brien // terms of the GNU General Public License as published by the 900db7afdSDavid E. O'Brien // Free Software Foundation; either version 2, or (at your option) 1000db7afdSDavid E. O'Brien // any later version. 1100db7afdSDavid E. O'Brien 1200db7afdSDavid E. O'Brien // This library is distributed in the hope that it will be useful, 1300db7afdSDavid E. O'Brien // but WITHOUT ANY WARRANTY; without even the implied warranty of 1400db7afdSDavid E. O'Brien // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1500db7afdSDavid E. O'Brien // GNU General Public License for more details. 1600db7afdSDavid E. O'Brien 1700db7afdSDavid E. O'Brien // You should have received a copy of the GNU General Public License along 1800db7afdSDavid E. O'Brien // with this library; see the file COPYING. If not, write to the Free 19*f8a1b7d9SAlexander Kabaev // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 2000db7afdSDavid E. O'Brien // USA. 2100db7afdSDavid E. O'Brien 2200db7afdSDavid E. O'Brien // As a special exception, you may use this file as part of a free software 2300db7afdSDavid E. O'Brien // library without restriction. Specifically, if other files instantiate 2400db7afdSDavid E. O'Brien // templates or use macros or inline functions from this file, or you compile 2500db7afdSDavid E. O'Brien // this file and link it with other files to produce an executable, this 2600db7afdSDavid E. O'Brien // file does not by itself cause the resulting executable to be covered by 2700db7afdSDavid E. O'Brien // the GNU General Public License. This exception does not however 2800db7afdSDavid E. O'Brien // invalidate any other reasons why the executable file might be covered by 2900db7afdSDavid E. O'Brien // the GNU General Public License. 3000db7afdSDavid E. O'Brien 31*f8a1b7d9SAlexander Kabaev /** @file iomanip 32*f8a1b7d9SAlexander Kabaev * This is a Standard C++ Library header. 33*f8a1b7d9SAlexander Kabaev */ 34*f8a1b7d9SAlexander Kabaev 3500db7afdSDavid E. O'Brien // 3600db7afdSDavid E. O'Brien // ISO C++ 14882: 27.6.3 Standard manipulators 3700db7afdSDavid E. O'Brien // 3800db7afdSDavid E. O'Brien 39ffeaf689SAlexander Kabaev #ifndef _GLIBCXX_IOMANIP 40ffeaf689SAlexander Kabaev #define _GLIBCXX_IOMANIP 1 4100db7afdSDavid E. O'Brien 4200db7afdSDavid E. O'Brien #pragma GCC system_header 4300db7afdSDavid E. O'Brien 4400db7afdSDavid E. O'Brien #include <bits/c++config.h> 4500db7afdSDavid E. O'Brien #include <istream> 4600db7afdSDavid E. O'Brien #include <functional> 4700db7afdSDavid E. O'Brien 48*f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NAMESPACE(std) 49*f8a1b7d9SAlexander Kabaev 501b86b14eSAlexander Kabaev // [27.6.3] standard manipulators 511b86b14eSAlexander Kabaev // Also see DR 183. 521b86b14eSAlexander Kabaev 5300db7afdSDavid E. O'Brien struct _Resetiosflags { ios_base::fmtflags _M_mask; }; 5400db7afdSDavid E. O'Brien 551b86b14eSAlexander Kabaev /** 561b86b14eSAlexander Kabaev * @brief Manipulator for @c setf. 571b86b14eSAlexander Kabaev * @param mask A format flags mask. 581b86b14eSAlexander Kabaev * 591b86b14eSAlexander Kabaev * Sent to a stream object, this manipulator resets the specified flags, 601b86b14eSAlexander Kabaev * via @e stream.setf(0,mask). 611b86b14eSAlexander Kabaev */ 6200db7afdSDavid E. O'Brien inline _Resetiosflags resetiosflags(ios_base::fmtflags __mask)6300db7afdSDavid E. O'Brien resetiosflags(ios_base::fmtflags __mask) 6400db7afdSDavid E. O'Brien { 6500db7afdSDavid E. O'Brien _Resetiosflags __x; 6600db7afdSDavid E. O'Brien __x._M_mask = __mask; 6700db7afdSDavid E. O'Brien return __x; 6800db7afdSDavid E. O'Brien } 6900db7afdSDavid E. O'Brien 7000db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits> 7100db7afdSDavid E. O'Brien inline basic_istream<_CharT,_Traits>& 7200db7afdSDavid E. O'Brien operator>>(basic_istream<_CharT,_Traits>& __is, _Resetiosflags __f) 7300db7afdSDavid E. O'Brien { 7400db7afdSDavid E. O'Brien __is.setf(ios_base::fmtflags(0), __f._M_mask); 7500db7afdSDavid E. O'Brien return __is; 7600db7afdSDavid E. O'Brien } 7700db7afdSDavid E. O'Brien 7800db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits> 7900db7afdSDavid E. O'Brien inline basic_ostream<_CharT,_Traits>& 8000db7afdSDavid E. O'Brien operator<<(basic_ostream<_CharT,_Traits>& __os, _Resetiosflags __f) 8100db7afdSDavid E. O'Brien { 8200db7afdSDavid E. O'Brien __os.setf(ios_base::fmtflags(0), __f._M_mask); 8300db7afdSDavid E. O'Brien return __os; 8400db7afdSDavid E. O'Brien } 8500db7afdSDavid E. O'Brien 8600db7afdSDavid E. O'Brien 8700db7afdSDavid E. O'Brien struct _Setiosflags { ios_base::fmtflags _M_mask; }; 8800db7afdSDavid E. O'Brien 891b86b14eSAlexander Kabaev /** 901b86b14eSAlexander Kabaev * @brief Manipulator for @c setf. 911b86b14eSAlexander Kabaev * @param mask A format flags mask. 921b86b14eSAlexander Kabaev * 931b86b14eSAlexander Kabaev * Sent to a stream object, this manipulator sets the format flags 941b86b14eSAlexander Kabaev * to @a mask. 951b86b14eSAlexander Kabaev */ 9600db7afdSDavid E. O'Brien inline _Setiosflags setiosflags(ios_base::fmtflags __mask)9700db7afdSDavid E. O'Brien setiosflags(ios_base::fmtflags __mask) 9800db7afdSDavid E. O'Brien { 9900db7afdSDavid E. O'Brien _Setiosflags __x; 10000db7afdSDavid E. O'Brien __x._M_mask = __mask; 10100db7afdSDavid E. O'Brien return __x; 10200db7afdSDavid E. O'Brien } 10300db7afdSDavid E. O'Brien 10400db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits> 10500db7afdSDavid E. O'Brien inline basic_istream<_CharT,_Traits>& 10600db7afdSDavid E. O'Brien operator>>(basic_istream<_CharT,_Traits>& __is, _Setiosflags __f) 10700db7afdSDavid E. O'Brien { 10800db7afdSDavid E. O'Brien __is.setf(__f._M_mask); 10900db7afdSDavid E. O'Brien return __is; 11000db7afdSDavid E. O'Brien } 11100db7afdSDavid E. O'Brien 11200db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits> 11300db7afdSDavid E. O'Brien inline basic_ostream<_CharT,_Traits>& 11400db7afdSDavid E. O'Brien operator<<(basic_ostream<_CharT,_Traits>& __os, _Setiosflags __f) 11500db7afdSDavid E. O'Brien { 11600db7afdSDavid E. O'Brien __os.setf(__f._M_mask); 11700db7afdSDavid E. O'Brien return __os; 11800db7afdSDavid E. O'Brien } 11900db7afdSDavid E. O'Brien 12000db7afdSDavid E. O'Brien 12100db7afdSDavid E. O'Brien struct _Setbase { int _M_base; }; 12200db7afdSDavid E. O'Brien 1231b86b14eSAlexander Kabaev /** 1241b86b14eSAlexander Kabaev * @brief Manipulator for @c setf. 1251b86b14eSAlexander Kabaev * @param base A numeric base. 1261b86b14eSAlexander Kabaev * 1271b86b14eSAlexander Kabaev * Sent to a stream object, this manipulator changes the 1281b86b14eSAlexander Kabaev * @c ios_base::basefield flags to @c oct, @c dec, or @c hex when @a base 1291b86b14eSAlexander Kabaev * is 8, 10, or 16, accordingly, and to 0 if @a base is any other value. 1301b86b14eSAlexander Kabaev */ 13100db7afdSDavid E. O'Brien inline _Setbase setbase(int __base)13200db7afdSDavid E. O'Brien setbase(int __base) 13300db7afdSDavid E. O'Brien { 13400db7afdSDavid E. O'Brien _Setbase __x; 13500db7afdSDavid E. O'Brien __x._M_base = __base; 13600db7afdSDavid E. O'Brien return __x; 13700db7afdSDavid E. O'Brien } 13800db7afdSDavid E. O'Brien 13900db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits> 14000db7afdSDavid E. O'Brien inline basic_istream<_CharT,_Traits>& 14100db7afdSDavid E. O'Brien operator>>(basic_istream<_CharT,_Traits>& __is, _Setbase __f) 14200db7afdSDavid E. O'Brien { 14300db7afdSDavid E. O'Brien __is.setf(__f._M_base == 8 ? ios_base::oct : 14400db7afdSDavid E. O'Brien __f._M_base == 10 ? ios_base::dec : 14500db7afdSDavid E. O'Brien __f._M_base == 16 ? ios_base::hex : 14600db7afdSDavid E. O'Brien ios_base::fmtflags(0), ios_base::basefield); 14700db7afdSDavid E. O'Brien return __is; 14800db7afdSDavid E. O'Brien } 14900db7afdSDavid E. O'Brien 15000db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits> 15100db7afdSDavid E. O'Brien inline basic_ostream<_CharT,_Traits>& 15200db7afdSDavid E. O'Brien operator<<(basic_ostream<_CharT,_Traits>& __os, _Setbase __f) 15300db7afdSDavid E. O'Brien { 15400db7afdSDavid E. O'Brien __os.setf(__f._M_base == 8 ? ios_base::oct : 15500db7afdSDavid E. O'Brien __f._M_base == 10 ? ios_base::dec : 15600db7afdSDavid E. O'Brien __f._M_base == 16 ? ios_base::hex : 15700db7afdSDavid E. O'Brien ios_base::fmtflags(0), ios_base::basefield); 15800db7afdSDavid E. O'Brien return __os; 15900db7afdSDavid E. O'Brien } 16000db7afdSDavid E. O'Brien 16100db7afdSDavid E. O'Brien 16200db7afdSDavid E. O'Brien template<typename _CharT> 16300db7afdSDavid E. O'Brien struct _Setfill { _CharT _M_c; }; 16400db7afdSDavid E. O'Brien 1651b86b14eSAlexander Kabaev /** 1661b86b14eSAlexander Kabaev * @brief Manipulator for @c fill. 1671b86b14eSAlexander Kabaev * @param c The new fill character. 1681b86b14eSAlexander Kabaev * 1691b86b14eSAlexander Kabaev * Sent to a stream object, this manipulator calls @c fill(c) for that 1701b86b14eSAlexander Kabaev * object. 1711b86b14eSAlexander Kabaev */ 17200db7afdSDavid E. O'Brien template<typename _CharT> 17300db7afdSDavid E. O'Brien inline _Setfill<_CharT> setfill(_CharT __c)17400db7afdSDavid E. O'Brien setfill(_CharT __c) 17500db7afdSDavid E. O'Brien { 17600db7afdSDavid E. O'Brien _Setfill<_CharT> __x; 17700db7afdSDavid E. O'Brien __x._M_c = __c; 17800db7afdSDavid E. O'Brien return __x; 17900db7afdSDavid E. O'Brien } 18000db7afdSDavid E. O'Brien 18100db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits> 18200db7afdSDavid E. O'Brien inline basic_istream<_CharT,_Traits>& 18300db7afdSDavid E. O'Brien operator>>(basic_istream<_CharT,_Traits>& __is, _Setfill<_CharT> __f) 18400db7afdSDavid E. O'Brien { 18500db7afdSDavid E. O'Brien __is.fill(__f._M_c); 18600db7afdSDavid E. O'Brien return __is; 18700db7afdSDavid E. O'Brien } 18800db7afdSDavid E. O'Brien 18900db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits> 19000db7afdSDavid E. O'Brien inline basic_ostream<_CharT,_Traits>& 19100db7afdSDavid E. O'Brien operator<<(basic_ostream<_CharT,_Traits>& __os, _Setfill<_CharT> __f) 19200db7afdSDavid E. O'Brien { 19300db7afdSDavid E. O'Brien __os.fill(__f._M_c); 19400db7afdSDavid E. O'Brien return __os; 19500db7afdSDavid E. O'Brien } 19600db7afdSDavid E. O'Brien 19700db7afdSDavid E. O'Brien 19800db7afdSDavid E. O'Brien struct _Setprecision { int _M_n; }; 19900db7afdSDavid E. O'Brien 2001b86b14eSAlexander Kabaev /** 2011b86b14eSAlexander Kabaev * @brief Manipulator for @c precision. 2021b86b14eSAlexander Kabaev * @param n The new precision. 2031b86b14eSAlexander Kabaev * 2041b86b14eSAlexander Kabaev * Sent to a stream object, this manipulator calls @c precision(n) for 2051b86b14eSAlexander Kabaev * that object. 2061b86b14eSAlexander Kabaev */ 20700db7afdSDavid E. O'Brien inline _Setprecision setprecision(int __n)20800db7afdSDavid E. O'Brien setprecision(int __n) 20900db7afdSDavid E. O'Brien { 21000db7afdSDavid E. O'Brien _Setprecision __x; 21100db7afdSDavid E. O'Brien __x._M_n = __n; 21200db7afdSDavid E. O'Brien return __x; 21300db7afdSDavid E. O'Brien } 21400db7afdSDavid E. O'Brien 21500db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits> 21600db7afdSDavid E. O'Brien inline basic_istream<_CharT,_Traits>& 21700db7afdSDavid E. O'Brien operator>>(basic_istream<_CharT,_Traits>& __is, _Setprecision __f) 21800db7afdSDavid E. O'Brien { 21900db7afdSDavid E. O'Brien __is.precision(__f._M_n); 22000db7afdSDavid E. O'Brien return __is; 22100db7afdSDavid E. O'Brien } 22200db7afdSDavid E. O'Brien 22300db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits> 22400db7afdSDavid E. O'Brien inline basic_ostream<_CharT,_Traits>& 22500db7afdSDavid E. O'Brien operator<<(basic_ostream<_CharT,_Traits>& __os, _Setprecision __f) 22600db7afdSDavid E. O'Brien { 22700db7afdSDavid E. O'Brien __os.precision(__f._M_n); 22800db7afdSDavid E. O'Brien return __os; 22900db7afdSDavid E. O'Brien } 23000db7afdSDavid E. O'Brien 23100db7afdSDavid E. O'Brien 23200db7afdSDavid E. O'Brien struct _Setw { int _M_n; }; 23300db7afdSDavid E. O'Brien 2341b86b14eSAlexander Kabaev /** 2351b86b14eSAlexander Kabaev * @brief Manipulator for @c width. 2361b86b14eSAlexander Kabaev * @param n The new width. 2371b86b14eSAlexander Kabaev * 2381b86b14eSAlexander Kabaev * Sent to a stream object, this manipulator calls @c width(n) for 2391b86b14eSAlexander Kabaev * that object. 2401b86b14eSAlexander Kabaev */ 24100db7afdSDavid E. O'Brien inline _Setw setw(int __n)24200db7afdSDavid E. O'Brien setw(int __n) 24300db7afdSDavid E. O'Brien { 24400db7afdSDavid E. O'Brien _Setw __x; 24500db7afdSDavid E. O'Brien __x._M_n = __n; 24600db7afdSDavid E. O'Brien return __x; 24700db7afdSDavid E. O'Brien } 24800db7afdSDavid E. O'Brien 24900db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits> 25000db7afdSDavid E. O'Brien inline basic_istream<_CharT,_Traits>& 25100db7afdSDavid E. O'Brien operator>>(basic_istream<_CharT,_Traits>& __is, _Setw __f) 25200db7afdSDavid E. O'Brien { 25300db7afdSDavid E. O'Brien __is.width(__f._M_n); 25400db7afdSDavid E. O'Brien return __is; 25500db7afdSDavid E. O'Brien } 25600db7afdSDavid E. O'Brien 25700db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits> 25800db7afdSDavid E. O'Brien inline basic_ostream<_CharT,_Traits>& 25900db7afdSDavid E. O'Brien operator<<(basic_ostream<_CharT,_Traits>& __os, _Setw __f) 26000db7afdSDavid E. O'Brien { 26100db7afdSDavid E. O'Brien __os.width(__f._M_n); 26200db7afdSDavid E. O'Brien return __os; 26300db7afdSDavid E. O'Brien } 26400db7afdSDavid E. O'Brien 26500db7afdSDavid E. O'Brien // Inhibit implicit instantiations for required instantiations, 26600db7afdSDavid E. O'Brien // which are defined via explicit instantiations elsewhere. 26700db7afdSDavid E. O'Brien // NB: This syntax is a GNU extension. 268ffeaf689SAlexander Kabaev #if _GLIBCXX_EXTERN_TEMPLATE 26900db7afdSDavid E. O'Brien extern template ostream& operator<<(ostream&, _Setfill<char>); 27000db7afdSDavid E. O'Brien extern template ostream& operator<<(ostream&, _Setiosflags); 27100db7afdSDavid E. O'Brien extern template ostream& operator<<(ostream&, _Resetiosflags); 27200db7afdSDavid E. O'Brien extern template ostream& operator<<(ostream&, _Setbase); 27300db7afdSDavid E. O'Brien extern template ostream& operator<<(ostream&, _Setprecision); 27400db7afdSDavid E. O'Brien extern template ostream& operator<<(ostream&, _Setw); 27500db7afdSDavid E. O'Brien extern template istream& operator>>(istream&, _Setfill<char>); 27600db7afdSDavid E. O'Brien extern template istream& operator>>(istream&, _Setiosflags); 27700db7afdSDavid E. O'Brien extern template istream& operator>>(istream&, _Resetiosflags); 27800db7afdSDavid E. O'Brien extern template istream& operator>>(istream&, _Setbase); 27900db7afdSDavid E. O'Brien extern template istream& operator>>(istream&, _Setprecision); 28000db7afdSDavid E. O'Brien extern template istream& operator>>(istream&, _Setw); 2818f1134fbSDavid E. O'Brien 282ffeaf689SAlexander Kabaev #ifdef _GLIBCXX_USE_WCHAR_T 2838f1134fbSDavid E. O'Brien extern template wostream& operator<<(wostream&, _Setfill<wchar_t>); 2848f1134fbSDavid E. O'Brien extern template wostream& operator<<(wostream&, _Setiosflags); 2858f1134fbSDavid E. O'Brien extern template wostream& operator<<(wostream&, _Resetiosflags); 2868f1134fbSDavid E. O'Brien extern template wostream& operator<<(wostream&, _Setbase); 2878f1134fbSDavid E. O'Brien extern template wostream& operator<<(wostream&, _Setprecision); 2888f1134fbSDavid E. O'Brien extern template wostream& operator<<(wostream&, _Setw); 28900db7afdSDavid E. O'Brien extern template wistream& operator>>(wistream&, _Setfill<wchar_t>); 29000db7afdSDavid E. O'Brien extern template wistream& operator>>(wistream&, _Setiosflags); 29100db7afdSDavid E. O'Brien extern template wistream& operator>>(wistream&, _Resetiosflags); 29200db7afdSDavid E. O'Brien extern template wistream& operator>>(wistream&, _Setbase); 29300db7afdSDavid E. O'Brien extern template wistream& operator>>(wistream&, _Setprecision); 29400db7afdSDavid E. O'Brien extern template wistream& operator>>(wistream&, _Setw); 2958f1134fbSDavid E. O'Brien #endif 2961b86b14eSAlexander Kabaev #endif 297*f8a1b7d9SAlexander Kabaev 298*f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NAMESPACE 29900db7afdSDavid E. O'Brien 300ffeaf689SAlexander Kabaev #endif /* _GLIBCXX_IOMANIP */ 301