1 // Standard stream manipulators -*- C++ -*- 2 3 // Copyright (C) 1997, 1998, 1999, 2001, 2002, 2003, 2005 4 // Free Software Foundation, Inc. 5 // 6 // This file is part of the GNU ISO C++ Library. This library is free 7 // software; you can redistribute it and/or modify it under the 8 // terms of the GNU General Public License as published by the 9 // Free Software Foundation; either version 2, or (at your option) 10 // any later version. 11 12 // This library is distributed in the hope that it will be useful, 13 // but WITHOUT ANY WARRANTY; without even the implied warranty of 14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 // GNU General Public License for more details. 16 17 // You should have received a copy of the GNU General Public License along 18 // with this library; see the file COPYING. If not, write to the Free 19 // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 20 // USA. 21 22 // As a special exception, you may use this file as part of a free software 23 // library without restriction. Specifically, if other files instantiate 24 // templates or use macros or inline functions from this file, or you compile 25 // this file and link it with other files to produce an executable, this 26 // file does not by itself cause the resulting executable to be covered by 27 // the GNU General Public License. This exception does not however 28 // invalidate any other reasons why the executable file might be covered by 29 // the GNU General Public License. 30 31 /** @file iomanip 32 * This is a Standard C++ Library header. 33 */ 34 35 // 36 // ISO C++ 14882: 27.6.3 Standard manipulators 37 // 38 39 #ifndef _GLIBCXX_IOMANIP 40 #define _GLIBCXX_IOMANIP 1 41 42 #pragma GCC system_header 43 44 #include <bits/c++config.h> 45 #include <istream> 46 #include <functional> 47 48 _GLIBCXX_BEGIN_NAMESPACE(std) 49 50 // [27.6.3] standard manipulators 51 // Also see DR 183. 52 53 struct _Resetiosflags { ios_base::fmtflags _M_mask; }; 54 55 /** 56 * @brief Manipulator for @c setf. 57 * @param mask A format flags mask. 58 * 59 * Sent to a stream object, this manipulator resets the specified flags, 60 * via @e stream.setf(0,mask). 61 */ 62 inline _Resetiosflags resetiosflags(ios_base::fmtflags __mask)63 resetiosflags(ios_base::fmtflags __mask) 64 { 65 _Resetiosflags __x; 66 __x._M_mask = __mask; 67 return __x; 68 } 69 70 template<typename _CharT, typename _Traits> 71 inline basic_istream<_CharT,_Traits>& 72 operator>>(basic_istream<_CharT,_Traits>& __is, _Resetiosflags __f) 73 { 74 __is.setf(ios_base::fmtflags(0), __f._M_mask); 75 return __is; 76 } 77 78 template<typename _CharT, typename _Traits> 79 inline basic_ostream<_CharT,_Traits>& 80 operator<<(basic_ostream<_CharT,_Traits>& __os, _Resetiosflags __f) 81 { 82 __os.setf(ios_base::fmtflags(0), __f._M_mask); 83 return __os; 84 } 85 86 87 struct _Setiosflags { ios_base::fmtflags _M_mask; }; 88 89 /** 90 * @brief Manipulator for @c setf. 91 * @param mask A format flags mask. 92 * 93 * Sent to a stream object, this manipulator sets the format flags 94 * to @a mask. 95 */ 96 inline _Setiosflags setiosflags(ios_base::fmtflags __mask)97 setiosflags(ios_base::fmtflags __mask) 98 { 99 _Setiosflags __x; 100 __x._M_mask = __mask; 101 return __x; 102 } 103 104 template<typename _CharT, typename _Traits> 105 inline basic_istream<_CharT,_Traits>& 106 operator>>(basic_istream<_CharT,_Traits>& __is, _Setiosflags __f) 107 { 108 __is.setf(__f._M_mask); 109 return __is; 110 } 111 112 template<typename _CharT, typename _Traits> 113 inline basic_ostream<_CharT,_Traits>& 114 operator<<(basic_ostream<_CharT,_Traits>& __os, _Setiosflags __f) 115 { 116 __os.setf(__f._M_mask); 117 return __os; 118 } 119 120 121 struct _Setbase { int _M_base; }; 122 123 /** 124 * @brief Manipulator for @c setf. 125 * @param base A numeric base. 126 * 127 * Sent to a stream object, this manipulator changes the 128 * @c ios_base::basefield flags to @c oct, @c dec, or @c hex when @a base 129 * is 8, 10, or 16, accordingly, and to 0 if @a base is any other value. 130 */ 131 inline _Setbase setbase(int __base)132 setbase(int __base) 133 { 134 _Setbase __x; 135 __x._M_base = __base; 136 return __x; 137 } 138 139 template<typename _CharT, typename _Traits> 140 inline basic_istream<_CharT,_Traits>& 141 operator>>(basic_istream<_CharT,_Traits>& __is, _Setbase __f) 142 { 143 __is.setf(__f._M_base == 8 ? ios_base::oct : 144 __f._M_base == 10 ? ios_base::dec : 145 __f._M_base == 16 ? ios_base::hex : 146 ios_base::fmtflags(0), ios_base::basefield); 147 return __is; 148 } 149 150 template<typename _CharT, typename _Traits> 151 inline basic_ostream<_CharT,_Traits>& 152 operator<<(basic_ostream<_CharT,_Traits>& __os, _Setbase __f) 153 { 154 __os.setf(__f._M_base == 8 ? ios_base::oct : 155 __f._M_base == 10 ? ios_base::dec : 156 __f._M_base == 16 ? ios_base::hex : 157 ios_base::fmtflags(0), ios_base::basefield); 158 return __os; 159 } 160 161 162 template<typename _CharT> 163 struct _Setfill { _CharT _M_c; }; 164 165 /** 166 * @brief Manipulator for @c fill. 167 * @param c The new fill character. 168 * 169 * Sent to a stream object, this manipulator calls @c fill(c) for that 170 * object. 171 */ 172 template<typename _CharT> 173 inline _Setfill<_CharT> setfill(_CharT __c)174 setfill(_CharT __c) 175 { 176 _Setfill<_CharT> __x; 177 __x._M_c = __c; 178 return __x; 179 } 180 181 template<typename _CharT, typename _Traits> 182 inline basic_istream<_CharT,_Traits>& 183 operator>>(basic_istream<_CharT,_Traits>& __is, _Setfill<_CharT> __f) 184 { 185 __is.fill(__f._M_c); 186 return __is; 187 } 188 189 template<typename _CharT, typename _Traits> 190 inline basic_ostream<_CharT,_Traits>& 191 operator<<(basic_ostream<_CharT,_Traits>& __os, _Setfill<_CharT> __f) 192 { 193 __os.fill(__f._M_c); 194 return __os; 195 } 196 197 198 struct _Setprecision { int _M_n; }; 199 200 /** 201 * @brief Manipulator for @c precision. 202 * @param n The new precision. 203 * 204 * Sent to a stream object, this manipulator calls @c precision(n) for 205 * that object. 206 */ 207 inline _Setprecision setprecision(int __n)208 setprecision(int __n) 209 { 210 _Setprecision __x; 211 __x._M_n = __n; 212 return __x; 213 } 214 215 template<typename _CharT, typename _Traits> 216 inline basic_istream<_CharT,_Traits>& 217 operator>>(basic_istream<_CharT,_Traits>& __is, _Setprecision __f) 218 { 219 __is.precision(__f._M_n); 220 return __is; 221 } 222 223 template<typename _CharT, typename _Traits> 224 inline basic_ostream<_CharT,_Traits>& 225 operator<<(basic_ostream<_CharT,_Traits>& __os, _Setprecision __f) 226 { 227 __os.precision(__f._M_n); 228 return __os; 229 } 230 231 232 struct _Setw { int _M_n; }; 233 234 /** 235 * @brief Manipulator for @c width. 236 * @param n The new width. 237 * 238 * Sent to a stream object, this manipulator calls @c width(n) for 239 * that object. 240 */ 241 inline _Setw setw(int __n)242 setw(int __n) 243 { 244 _Setw __x; 245 __x._M_n = __n; 246 return __x; 247 } 248 249 template<typename _CharT, typename _Traits> 250 inline basic_istream<_CharT,_Traits>& 251 operator>>(basic_istream<_CharT,_Traits>& __is, _Setw __f) 252 { 253 __is.width(__f._M_n); 254 return __is; 255 } 256 257 template<typename _CharT, typename _Traits> 258 inline basic_ostream<_CharT,_Traits>& 259 operator<<(basic_ostream<_CharT,_Traits>& __os, _Setw __f) 260 { 261 __os.width(__f._M_n); 262 return __os; 263 } 264 265 // Inhibit implicit instantiations for required instantiations, 266 // which are defined via explicit instantiations elsewhere. 267 // NB: This syntax is a GNU extension. 268 #if _GLIBCXX_EXTERN_TEMPLATE 269 extern template ostream& operator<<(ostream&, _Setfill<char>); 270 extern template ostream& operator<<(ostream&, _Setiosflags); 271 extern template ostream& operator<<(ostream&, _Resetiosflags); 272 extern template ostream& operator<<(ostream&, _Setbase); 273 extern template ostream& operator<<(ostream&, _Setprecision); 274 extern template ostream& operator<<(ostream&, _Setw); 275 extern template istream& operator>>(istream&, _Setfill<char>); 276 extern template istream& operator>>(istream&, _Setiosflags); 277 extern template istream& operator>>(istream&, _Resetiosflags); 278 extern template istream& operator>>(istream&, _Setbase); 279 extern template istream& operator>>(istream&, _Setprecision); 280 extern template istream& operator>>(istream&, _Setw); 281 282 #ifdef _GLIBCXX_USE_WCHAR_T 283 extern template wostream& operator<<(wostream&, _Setfill<wchar_t>); 284 extern template wostream& operator<<(wostream&, _Setiosflags); 285 extern template wostream& operator<<(wostream&, _Resetiosflags); 286 extern template wostream& operator<<(wostream&, _Setbase); 287 extern template wostream& operator<<(wostream&, _Setprecision); 288 extern template wostream& operator<<(wostream&, _Setw); 289 extern template wistream& operator>>(wistream&, _Setfill<wchar_t>); 290 extern template wistream& operator>>(wistream&, _Setiosflags); 291 extern template wistream& operator>>(wistream&, _Resetiosflags); 292 extern template wistream& operator>>(wistream&, _Setbase); 293 extern template wistream& operator>>(wistream&, _Setprecision); 294 extern template wistream& operator>>(wistream&, _Setw); 295 #endif 296 #endif 297 298 _GLIBCXX_END_NAMESPACE 299 300 #endif /* _GLIBCXX_IOMANIP */ 301