1// Standard stream manipulators -*- C++ -*- 2 3// Copyright (C) 1997, 1998, 1999, 2001, 2002, 2003 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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// 32// ISO C++ 14882: 27.6.3 Standard manipulators 33// 34 35/** @file iomanip 36 * This is a Standard C++ Library header. You should @c #include this header 37 * in your programs, rather than any of the "st[dl]_*.h" implementation files. 38 */ 39 40#ifndef _CPP_IOMANIP 41#define _CPP_IOMANIP 1 42 43#pragma GCC system_header 44 45#include <bits/c++config.h> 46#include <istream> 47#include <functional> 48 49namespace std 50{ 51 // [27.6.3] standard manipulators 52 // Also see DR 183. 53 54 struct _Resetiosflags { ios_base::fmtflags _M_mask; }; 55 56 /** 57 * @brief Manipulator for @c setf. 58 * @param mask A format flags mask. 59 * 60 * Sent to a stream object, this manipulator resets the specified flags, 61 * via @e stream.setf(0,mask). 62 */ 63 inline _Resetiosflags 64 resetiosflags(ios_base::fmtflags __mask) 65 { 66 _Resetiosflags __x; 67 __x._M_mask = __mask; 68 return __x; 69 } 70 71 template<typename _CharT, typename _Traits> 72 inline basic_istream<_CharT,_Traits>& 73 operator>>(basic_istream<_CharT,_Traits>& __is, _Resetiosflags __f) 74 { 75 __is.setf(ios_base::fmtflags(0), __f._M_mask); 76 return __is; 77 } 78 79 template<typename _CharT, typename _Traits> 80 inline basic_ostream<_CharT,_Traits>& 81 operator<<(basic_ostream<_CharT,_Traits>& __os, _Resetiosflags __f) 82 { 83 __os.setf(ios_base::fmtflags(0), __f._M_mask); 84 return __os; 85 } 86 87 88 struct _Setiosflags { ios_base::fmtflags _M_mask; }; 89 90 /** 91 * @brief Manipulator for @c setf. 92 * @param mask A format flags mask. 93 * 94 * Sent to a stream object, this manipulator sets the format flags 95 * to @a mask. 96 */ 97 inline _Setiosflags 98 setiosflags(ios_base::fmtflags __mask) 99 { 100 _Setiosflags __x; 101 __x._M_mask = __mask; 102 return __x; 103 } 104 105 template<typename _CharT, typename _Traits> 106 inline basic_istream<_CharT,_Traits>& 107 operator>>(basic_istream<_CharT,_Traits>& __is, _Setiosflags __f) 108 { 109 __is.setf(__f._M_mask); 110 return __is; 111 } 112 113 template<typename _CharT, typename _Traits> 114 inline basic_ostream<_CharT,_Traits>& 115 operator<<(basic_ostream<_CharT,_Traits>& __os, _Setiosflags __f) 116 { 117 __os.setf(__f._M_mask); 118 return __os; 119 } 120 121 122 struct _Setbase { int _M_base; }; 123 124 /** 125 * @brief Manipulator for @c setf. 126 * @param base A numeric base. 127 * 128 * Sent to a stream object, this manipulator changes the 129 * @c ios_base::basefield flags to @c oct, @c dec, or @c hex when @a base 130 * is 8, 10, or 16, accordingly, and to 0 if @a base is any other value. 131 */ 132 inline _Setbase 133 setbase(int __base) 134 { 135 _Setbase __x; 136 __x._M_base = __base; 137 return __x; 138 } 139 140 template<typename _CharT, typename _Traits> 141 inline basic_istream<_CharT,_Traits>& 142 operator>>(basic_istream<_CharT,_Traits>& __is, _Setbase __f) 143 { 144 __is.setf(__f._M_base == 8 ? ios_base::oct : 145 __f._M_base == 10 ? ios_base::dec : 146 __f._M_base == 16 ? ios_base::hex : 147 ios_base::fmtflags(0), ios_base::basefield); 148 return __is; 149 } 150 151 template<typename _CharT, typename _Traits> 152 inline basic_ostream<_CharT,_Traits>& 153 operator<<(basic_ostream<_CharT,_Traits>& __os, _Setbase __f) 154 { 155 __os.setf(__f._M_base == 8 ? ios_base::oct : 156 __f._M_base == 10 ? ios_base::dec : 157 __f._M_base == 16 ? ios_base::hex : 158 ios_base::fmtflags(0), ios_base::basefield); 159 return __os; 160 } 161 162 163 template<typename _CharT> 164 struct _Setfill { _CharT _M_c; }; 165 166 /** 167 * @brief Manipulator for @c fill. 168 * @param c The new fill character. 169 * 170 * Sent to a stream object, this manipulator calls @c fill(c) for that 171 * object. 172 */ 173 template<typename _CharT> 174 inline _Setfill<_CharT> 175 setfill(_CharT __c) 176 { 177 _Setfill<_CharT> __x; 178 __x._M_c = __c; 179 return __x; 180 } 181 182 template<typename _CharT, typename _Traits> 183 inline basic_istream<_CharT,_Traits>& 184 operator>>(basic_istream<_CharT,_Traits>& __is, _Setfill<_CharT> __f) 185 { 186 __is.fill(__f._M_c); 187 return __is; 188 } 189 190 template<typename _CharT, typename _Traits> 191 inline basic_ostream<_CharT,_Traits>& 192 operator<<(basic_ostream<_CharT,_Traits>& __os, _Setfill<_CharT> __f) 193 { 194 __os.fill(__f._M_c); 195 return __os; 196 } 197 198 199 struct _Setprecision { int _M_n; }; 200 201 /** 202 * @brief Manipulator for @c precision. 203 * @param n The new precision. 204 * 205 * Sent to a stream object, this manipulator calls @c precision(n) for 206 * that object. 207 */ 208 inline _Setprecision 209 setprecision(int __n) 210 { 211 _Setprecision __x; 212 __x._M_n = __n; 213 return __x; 214 } 215 216 template<typename _CharT, typename _Traits> 217 inline basic_istream<_CharT,_Traits>& 218 operator>>(basic_istream<_CharT,_Traits>& __is, _Setprecision __f) 219 { 220 __is.precision(__f._M_n); 221 return __is; 222 } 223 224 template<typename _CharT, typename _Traits> 225 inline basic_ostream<_CharT,_Traits>& 226 operator<<(basic_ostream<_CharT,_Traits>& __os, _Setprecision __f) 227 { 228 __os.precision(__f._M_n); 229 return __os; 230 } 231 232 233 struct _Setw { int _M_n; }; 234 235 /** 236 * @brief Manipulator for @c width. 237 * @param n The new width. 238 * 239 * Sent to a stream object, this manipulator calls @c width(n) for 240 * that object. 241 */ 242 inline _Setw 243 setw(int __n) 244 { 245 _Setw __x; 246 __x._M_n = __n; 247 return __x; 248 } 249 250 template<typename _CharT, typename _Traits> 251 inline basic_istream<_CharT,_Traits>& 252 operator>>(basic_istream<_CharT,_Traits>& __is, _Setw __f) 253 { 254 __is.width(__f._M_n); 255 return __is; 256 } 257 258 template<typename _CharT, typename _Traits> 259 inline basic_ostream<_CharT,_Traits>& 260 operator<<(basic_ostream<_CharT,_Traits>& __os, _Setw __f) 261 { 262 __os.width(__f._M_n); 263 return __os; 264 } 265 266 // Inhibit implicit instantiations for required instantiations, 267 // which are defined via explicit instantiations elsewhere. 268 // NB: This syntax is a GNU extension. 269#if _GLIBCPP_EXTERN_TEMPLATE 270 extern template ostream& operator<<(ostream&, _Setfill<char>); 271 extern template ostream& operator<<(ostream&, _Setiosflags); 272 extern template ostream& operator<<(ostream&, _Resetiosflags); 273 extern template ostream& operator<<(ostream&, _Setbase); 274 extern template ostream& operator<<(ostream&, _Setprecision); 275 extern template ostream& operator<<(ostream&, _Setw); 276 extern template istream& operator>>(istream&, _Setfill<char>); 277 extern template istream& operator>>(istream&, _Setiosflags); 278 extern template istream& operator>>(istream&, _Resetiosflags); 279 extern template istream& operator>>(istream&, _Setbase); 280 extern template istream& operator>>(istream&, _Setprecision); 281 extern template istream& operator>>(istream&, _Setw); 282 283#if defined(_GLIBCPP_USE_WCHAR_T) || defined(_GLIBCPP_USE_TYPE_WCHAR_T) 284 extern template wostream& operator<<(wostream&, _Setfill<wchar_t>); 285 extern template wostream& operator<<(wostream&, _Setiosflags); 286 extern template wostream& operator<<(wostream&, _Resetiosflags); 287 extern template wostream& operator<<(wostream&, _Setbase); 288 extern template wostream& operator<<(wostream&, _Setprecision); 289 extern template wostream& operator<<(wostream&, _Setw); 290 extern template wistream& operator>>(wistream&, _Setfill<wchar_t>); 291 extern template wistream& operator>>(wistream&, _Setiosflags); 292 extern template wistream& operator>>(wistream&, _Resetiosflags); 293 extern template wistream& operator>>(wistream&, _Setbase); 294 extern template wistream& operator>>(wistream&, _Setprecision); 295 extern template wistream& operator>>(wistream&, _Setw); 296#endif 297#endif 298} // namespace std 299 300#endif 301