1*e4b17023SJohn Marino// Standard stream manipulators -*- C++ -*- 2*e4b17023SJohn Marino 3*e4b17023SJohn Marino// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 4*e4b17023SJohn Marino// 2006, 2007, 2008, 2009, 2010, 2011 5*e4b17023SJohn Marino// Free Software Foundation, Inc. 6*e4b17023SJohn Marino// 7*e4b17023SJohn Marino// This file is part of the GNU ISO C++ Library. This library is free 8*e4b17023SJohn Marino// software; you can redistribute it and/or modify it under the 9*e4b17023SJohn Marino// terms of the GNU General Public License as published by the 10*e4b17023SJohn Marino// Free Software Foundation; either version 3, or (at your option) 11*e4b17023SJohn Marino// any later version. 12*e4b17023SJohn Marino 13*e4b17023SJohn Marino// This library is distributed in the hope that it will be useful, 14*e4b17023SJohn Marino// but WITHOUT ANY WARRANTY; without even the implied warranty of 15*e4b17023SJohn Marino// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16*e4b17023SJohn Marino// GNU General Public License for more details. 17*e4b17023SJohn Marino 18*e4b17023SJohn Marino// Under Section 7 of GPL version 3, you are granted additional 19*e4b17023SJohn Marino// permissions described in the GCC Runtime Library Exception, version 20*e4b17023SJohn Marino// 3.1, as published by the Free Software Foundation. 21*e4b17023SJohn Marino 22*e4b17023SJohn Marino// You should have received a copy of the GNU General Public License and 23*e4b17023SJohn Marino// a copy of the GCC Runtime Library Exception along with this program; 24*e4b17023SJohn Marino// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 25*e4b17023SJohn Marino// <http://www.gnu.org/licenses/>. 26*e4b17023SJohn Marino 27*e4b17023SJohn Marino/** @file include/iomanip 28*e4b17023SJohn Marino * This is a Standard C++ Library header. 29*e4b17023SJohn Marino */ 30*e4b17023SJohn Marino 31*e4b17023SJohn Marino// 32*e4b17023SJohn Marino// ISO C++ 14882: 27.6.3 Standard manipulators 33*e4b17023SJohn Marino// 34*e4b17023SJohn Marino 35*e4b17023SJohn Marino#ifndef _GLIBCXX_IOMANIP 36*e4b17023SJohn Marino#define _GLIBCXX_IOMANIP 1 37*e4b17023SJohn Marino 38*e4b17023SJohn Marino#pragma GCC system_header 39*e4b17023SJohn Marino 40*e4b17023SJohn Marino#include <bits/c++config.h> 41*e4b17023SJohn Marino#include <iosfwd> 42*e4b17023SJohn Marino#include <bits/ios_base.h> 43*e4b17023SJohn Marino 44*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__ 45*e4b17023SJohn Marino#include <locale> 46*e4b17023SJohn Marino#endif 47*e4b17023SJohn Marino 48*e4b17023SJohn Marinonamespace std _GLIBCXX_VISIBILITY(default) 49*e4b17023SJohn Marino{ 50*e4b17023SJohn Marino_GLIBCXX_BEGIN_NAMESPACE_VERSION 51*e4b17023SJohn Marino 52*e4b17023SJohn Marino // [27.6.3] standard manipulators 53*e4b17023SJohn Marino // Also see DR 183. 54*e4b17023SJohn Marino 55*e4b17023SJohn Marino struct _Resetiosflags { ios_base::fmtflags _M_mask; }; 56*e4b17023SJohn Marino 57*e4b17023SJohn Marino /** 58*e4b17023SJohn Marino * @brief Manipulator for @c setf. 59*e4b17023SJohn Marino * @param __mask A format flags mask. 60*e4b17023SJohn Marino * 61*e4b17023SJohn Marino * Sent to a stream object, this manipulator resets the specified flags, 62*e4b17023SJohn Marino * via @e stream.setf(0,__mask). 63*e4b17023SJohn Marino */ 64*e4b17023SJohn Marino inline _Resetiosflags 65*e4b17023SJohn Marino resetiosflags(ios_base::fmtflags __mask) 66*e4b17023SJohn Marino { return { __mask }; } 67*e4b17023SJohn Marino 68*e4b17023SJohn Marino template<typename _CharT, typename _Traits> 69*e4b17023SJohn Marino inline basic_istream<_CharT, _Traits>& 70*e4b17023SJohn Marino operator>>(basic_istream<_CharT, _Traits>& __is, _Resetiosflags __f) 71*e4b17023SJohn Marino { 72*e4b17023SJohn Marino __is.setf(ios_base::fmtflags(0), __f._M_mask); 73*e4b17023SJohn Marino return __is; 74*e4b17023SJohn Marino } 75*e4b17023SJohn Marino 76*e4b17023SJohn Marino template<typename _CharT, typename _Traits> 77*e4b17023SJohn Marino inline basic_ostream<_CharT, _Traits>& 78*e4b17023SJohn Marino operator<<(basic_ostream<_CharT, _Traits>& __os, _Resetiosflags __f) 79*e4b17023SJohn Marino { 80*e4b17023SJohn Marino __os.setf(ios_base::fmtflags(0), __f._M_mask); 81*e4b17023SJohn Marino return __os; 82*e4b17023SJohn Marino } 83*e4b17023SJohn Marino 84*e4b17023SJohn Marino 85*e4b17023SJohn Marino struct _Setiosflags { ios_base::fmtflags _M_mask; }; 86*e4b17023SJohn Marino 87*e4b17023SJohn Marino /** 88*e4b17023SJohn Marino * @brief Manipulator for @c setf. 89*e4b17023SJohn Marino * @param __mask A format flags mask. 90*e4b17023SJohn Marino * 91*e4b17023SJohn Marino * Sent to a stream object, this manipulator sets the format flags 92*e4b17023SJohn Marino * to @a __mask. 93*e4b17023SJohn Marino */ 94*e4b17023SJohn Marino inline _Setiosflags 95*e4b17023SJohn Marino setiosflags(ios_base::fmtflags __mask) 96*e4b17023SJohn Marino { return { __mask }; } 97*e4b17023SJohn Marino 98*e4b17023SJohn Marino template<typename _CharT, typename _Traits> 99*e4b17023SJohn Marino inline basic_istream<_CharT, _Traits>& 100*e4b17023SJohn Marino operator>>(basic_istream<_CharT, _Traits>& __is, _Setiosflags __f) 101*e4b17023SJohn Marino { 102*e4b17023SJohn Marino __is.setf(__f._M_mask); 103*e4b17023SJohn Marino return __is; 104*e4b17023SJohn Marino } 105*e4b17023SJohn Marino 106*e4b17023SJohn Marino template<typename _CharT, typename _Traits> 107*e4b17023SJohn Marino inline basic_ostream<_CharT, _Traits>& 108*e4b17023SJohn Marino operator<<(basic_ostream<_CharT, _Traits>& __os, _Setiosflags __f) 109*e4b17023SJohn Marino { 110*e4b17023SJohn Marino __os.setf(__f._M_mask); 111*e4b17023SJohn Marino return __os; 112*e4b17023SJohn Marino } 113*e4b17023SJohn Marino 114*e4b17023SJohn Marino 115*e4b17023SJohn Marino struct _Setbase { int _M_base; }; 116*e4b17023SJohn Marino 117*e4b17023SJohn Marino /** 118*e4b17023SJohn Marino * @brief Manipulator for @c setf. 119*e4b17023SJohn Marino * @param __base A numeric base. 120*e4b17023SJohn Marino * 121*e4b17023SJohn Marino * Sent to a stream object, this manipulator changes the 122*e4b17023SJohn Marino * @c ios_base::basefield flags to @c oct, @c dec, or @c hex when @a base 123*e4b17023SJohn Marino * is 8, 10, or 16, accordingly, and to 0 if @a __base is any other value. 124*e4b17023SJohn Marino */ 125*e4b17023SJohn Marino inline _Setbase 126*e4b17023SJohn Marino setbase(int __base) 127*e4b17023SJohn Marino { return { __base }; } 128*e4b17023SJohn Marino 129*e4b17023SJohn Marino template<typename _CharT, typename _Traits> 130*e4b17023SJohn Marino inline basic_istream<_CharT, _Traits>& 131*e4b17023SJohn Marino operator>>(basic_istream<_CharT, _Traits>& __is, _Setbase __f) 132*e4b17023SJohn Marino { 133*e4b17023SJohn Marino __is.setf(__f._M_base == 8 ? ios_base::oct : 134*e4b17023SJohn Marino __f._M_base == 10 ? ios_base::dec : 135*e4b17023SJohn Marino __f._M_base == 16 ? ios_base::hex : 136*e4b17023SJohn Marino ios_base::fmtflags(0), ios_base::basefield); 137*e4b17023SJohn Marino return __is; 138*e4b17023SJohn Marino } 139*e4b17023SJohn Marino 140*e4b17023SJohn Marino template<typename _CharT, typename _Traits> 141*e4b17023SJohn Marino inline basic_ostream<_CharT, _Traits>& 142*e4b17023SJohn Marino operator<<(basic_ostream<_CharT, _Traits>& __os, _Setbase __f) 143*e4b17023SJohn Marino { 144*e4b17023SJohn Marino __os.setf(__f._M_base == 8 ? ios_base::oct : 145*e4b17023SJohn Marino __f._M_base == 10 ? ios_base::dec : 146*e4b17023SJohn Marino __f._M_base == 16 ? ios_base::hex : 147*e4b17023SJohn Marino ios_base::fmtflags(0), ios_base::basefield); 148*e4b17023SJohn Marino return __os; 149*e4b17023SJohn Marino } 150*e4b17023SJohn Marino 151*e4b17023SJohn Marino 152*e4b17023SJohn Marino template<typename _CharT> 153*e4b17023SJohn Marino struct _Setfill { _CharT _M_c; }; 154*e4b17023SJohn Marino 155*e4b17023SJohn Marino /** 156*e4b17023SJohn Marino * @brief Manipulator for @c fill. 157*e4b17023SJohn Marino * @param __c The new fill character. 158*e4b17023SJohn Marino * 159*e4b17023SJohn Marino * Sent to a stream object, this manipulator calls @c fill(__c) for that 160*e4b17023SJohn Marino * object. 161*e4b17023SJohn Marino */ 162*e4b17023SJohn Marino template<typename _CharT> 163*e4b17023SJohn Marino inline _Setfill<_CharT> 164*e4b17023SJohn Marino setfill(_CharT __c) 165*e4b17023SJohn Marino { return { __c }; } 166*e4b17023SJohn Marino 167*e4b17023SJohn Marino template<typename _CharT, typename _Traits> 168*e4b17023SJohn Marino inline basic_istream<_CharT, _Traits>& 169*e4b17023SJohn Marino operator>>(basic_istream<_CharT, _Traits>& __is, _Setfill<_CharT> __f) 170*e4b17023SJohn Marino { 171*e4b17023SJohn Marino __is.fill(__f._M_c); 172*e4b17023SJohn Marino return __is; 173*e4b17023SJohn Marino } 174*e4b17023SJohn Marino 175*e4b17023SJohn Marino template<typename _CharT, typename _Traits> 176*e4b17023SJohn Marino inline basic_ostream<_CharT, _Traits>& 177*e4b17023SJohn Marino operator<<(basic_ostream<_CharT, _Traits>& __os, _Setfill<_CharT> __f) 178*e4b17023SJohn Marino { 179*e4b17023SJohn Marino __os.fill(__f._M_c); 180*e4b17023SJohn Marino return __os; 181*e4b17023SJohn Marino } 182*e4b17023SJohn Marino 183*e4b17023SJohn Marino 184*e4b17023SJohn Marino struct _Setprecision { int _M_n; }; 185*e4b17023SJohn Marino 186*e4b17023SJohn Marino /** 187*e4b17023SJohn Marino * @brief Manipulator for @c precision. 188*e4b17023SJohn Marino * @param __n The new precision. 189*e4b17023SJohn Marino * 190*e4b17023SJohn Marino * Sent to a stream object, this manipulator calls @c precision(__n) for 191*e4b17023SJohn Marino * that object. 192*e4b17023SJohn Marino */ 193*e4b17023SJohn Marino inline _Setprecision 194*e4b17023SJohn Marino setprecision(int __n) 195*e4b17023SJohn Marino { return { __n }; } 196*e4b17023SJohn Marino 197*e4b17023SJohn Marino template<typename _CharT, typename _Traits> 198*e4b17023SJohn Marino inline basic_istream<_CharT, _Traits>& 199*e4b17023SJohn Marino operator>>(basic_istream<_CharT, _Traits>& __is, _Setprecision __f) 200*e4b17023SJohn Marino { 201*e4b17023SJohn Marino __is.precision(__f._M_n); 202*e4b17023SJohn Marino return __is; 203*e4b17023SJohn Marino } 204*e4b17023SJohn Marino 205*e4b17023SJohn Marino template<typename _CharT, typename _Traits> 206*e4b17023SJohn Marino inline basic_ostream<_CharT, _Traits>& 207*e4b17023SJohn Marino operator<<(basic_ostream<_CharT, _Traits>& __os, _Setprecision __f) 208*e4b17023SJohn Marino { 209*e4b17023SJohn Marino __os.precision(__f._M_n); 210*e4b17023SJohn Marino return __os; 211*e4b17023SJohn Marino } 212*e4b17023SJohn Marino 213*e4b17023SJohn Marino 214*e4b17023SJohn Marino struct _Setw { int _M_n; }; 215*e4b17023SJohn Marino 216*e4b17023SJohn Marino /** 217*e4b17023SJohn Marino * @brief Manipulator for @c width. 218*e4b17023SJohn Marino * @param __n The new width. 219*e4b17023SJohn Marino * 220*e4b17023SJohn Marino * Sent to a stream object, this manipulator calls @c width(__n) for 221*e4b17023SJohn Marino * that object. 222*e4b17023SJohn Marino */ 223*e4b17023SJohn Marino inline _Setw 224*e4b17023SJohn Marino setw(int __n) 225*e4b17023SJohn Marino { return { __n }; } 226*e4b17023SJohn Marino 227*e4b17023SJohn Marino template<typename _CharT, typename _Traits> 228*e4b17023SJohn Marino inline basic_istream<_CharT, _Traits>& 229*e4b17023SJohn Marino operator>>(basic_istream<_CharT, _Traits>& __is, _Setw __f) 230*e4b17023SJohn Marino { 231*e4b17023SJohn Marino __is.width(__f._M_n); 232*e4b17023SJohn Marino return __is; 233*e4b17023SJohn Marino } 234*e4b17023SJohn Marino 235*e4b17023SJohn Marino template<typename _CharT, typename _Traits> 236*e4b17023SJohn Marino inline basic_ostream<_CharT, _Traits>& 237*e4b17023SJohn Marino operator<<(basic_ostream<_CharT, _Traits>& __os, _Setw __f) 238*e4b17023SJohn Marino { 239*e4b17023SJohn Marino __os.width(__f._M_n); 240*e4b17023SJohn Marino return __os; 241*e4b17023SJohn Marino } 242*e4b17023SJohn Marino 243*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__ 244*e4b17023SJohn Marino 245*e4b17023SJohn Marino template<typename _MoneyT> 246*e4b17023SJohn Marino struct _Get_money { _MoneyT& _M_mon; bool _M_intl; }; 247*e4b17023SJohn Marino 248*e4b17023SJohn Marino /** 249*e4b17023SJohn Marino * @brief Extended manipulator for extracting money. 250*e4b17023SJohn Marino * @param __mon Either long double or a specialization of @c basic_string. 251*e4b17023SJohn Marino * @param __intl A bool indicating whether international format 252*e4b17023SJohn Marino * is to be used. 253*e4b17023SJohn Marino * 254*e4b17023SJohn Marino * Sent to a stream object, this manipulator extracts @a __mon. 255*e4b17023SJohn Marino */ 256*e4b17023SJohn Marino template<typename _MoneyT> 257*e4b17023SJohn Marino inline _Get_money<_MoneyT> 258*e4b17023SJohn Marino get_money(_MoneyT& __mon, bool __intl = false) 259*e4b17023SJohn Marino { return { __mon, __intl }; } 260*e4b17023SJohn Marino 261*e4b17023SJohn Marino template<typename _CharT, typename _Traits, typename _MoneyT> 262*e4b17023SJohn Marino basic_istream<_CharT, _Traits>& 263*e4b17023SJohn Marino operator>>(basic_istream<_CharT, _Traits>& __is, _Get_money<_MoneyT> __f) 264*e4b17023SJohn Marino { 265*e4b17023SJohn Marino typename basic_istream<_CharT, _Traits>::sentry __cerb(__is, false); 266*e4b17023SJohn Marino if (__cerb) 267*e4b17023SJohn Marino { 268*e4b17023SJohn Marino ios_base::iostate __err = ios_base::goodbit; 269*e4b17023SJohn Marino __try 270*e4b17023SJohn Marino { 271*e4b17023SJohn Marino typedef istreambuf_iterator<_CharT, _Traits> _Iter; 272*e4b17023SJohn Marino typedef money_get<_CharT, _Iter> _MoneyGet; 273*e4b17023SJohn Marino 274*e4b17023SJohn Marino const _MoneyGet& __mg = use_facet<_MoneyGet>(__is.getloc()); 275*e4b17023SJohn Marino __mg.get(_Iter(__is.rdbuf()), _Iter(), __f._M_intl, 276*e4b17023SJohn Marino __is, __err, __f._M_mon); 277*e4b17023SJohn Marino } 278*e4b17023SJohn Marino __catch(__cxxabiv1::__forced_unwind&) 279*e4b17023SJohn Marino { 280*e4b17023SJohn Marino __is._M_setstate(ios_base::badbit); 281*e4b17023SJohn Marino __throw_exception_again; 282*e4b17023SJohn Marino } 283*e4b17023SJohn Marino __catch(...) 284*e4b17023SJohn Marino { __is._M_setstate(ios_base::badbit); } 285*e4b17023SJohn Marino if (__err) 286*e4b17023SJohn Marino __is.setstate(__err); 287*e4b17023SJohn Marino } 288*e4b17023SJohn Marino return __is; 289*e4b17023SJohn Marino } 290*e4b17023SJohn Marino 291*e4b17023SJohn Marino 292*e4b17023SJohn Marino template<typename _MoneyT> 293*e4b17023SJohn Marino struct _Put_money { const _MoneyT& _M_mon; bool _M_intl; }; 294*e4b17023SJohn Marino 295*e4b17023SJohn Marino /** 296*e4b17023SJohn Marino * @brief Extended manipulator for inserting money. 297*e4b17023SJohn Marino * @param __mon Either long double or a specialization of @c basic_string. 298*e4b17023SJohn Marino * @param __intl A bool indicating whether international format 299*e4b17023SJohn Marino * is to be used. 300*e4b17023SJohn Marino * 301*e4b17023SJohn Marino * Sent to a stream object, this manipulator inserts @a __mon. 302*e4b17023SJohn Marino */ 303*e4b17023SJohn Marino template<typename _MoneyT> 304*e4b17023SJohn Marino inline _Put_money<_MoneyT> 305*e4b17023SJohn Marino put_money(const _MoneyT& __mon, bool __intl = false) 306*e4b17023SJohn Marino { return { __mon, __intl }; } 307*e4b17023SJohn Marino 308*e4b17023SJohn Marino template<typename _CharT, typename _Traits, typename _MoneyT> 309*e4b17023SJohn Marino basic_ostream<_CharT, _Traits>& 310*e4b17023SJohn Marino operator<<(basic_ostream<_CharT, _Traits>& __os, _Put_money<_MoneyT> __f) 311*e4b17023SJohn Marino { 312*e4b17023SJohn Marino typename basic_ostream<_CharT, _Traits>::sentry __cerb(__os); 313*e4b17023SJohn Marino if (__cerb) 314*e4b17023SJohn Marino { 315*e4b17023SJohn Marino ios_base::iostate __err = ios_base::goodbit; 316*e4b17023SJohn Marino __try 317*e4b17023SJohn Marino { 318*e4b17023SJohn Marino typedef ostreambuf_iterator<_CharT, _Traits> _Iter; 319*e4b17023SJohn Marino typedef money_put<_CharT, _Iter> _MoneyPut; 320*e4b17023SJohn Marino 321*e4b17023SJohn Marino const _MoneyPut& __mp = use_facet<_MoneyPut>(__os.getloc()); 322*e4b17023SJohn Marino if (__mp.put(_Iter(__os.rdbuf()), __f._M_intl, __os, 323*e4b17023SJohn Marino __os.fill(), __f._M_mon).failed()) 324*e4b17023SJohn Marino __err |= ios_base::badbit; 325*e4b17023SJohn Marino } 326*e4b17023SJohn Marino __catch(__cxxabiv1::__forced_unwind&) 327*e4b17023SJohn Marino { 328*e4b17023SJohn Marino __os._M_setstate(ios_base::badbit); 329*e4b17023SJohn Marino __throw_exception_again; 330*e4b17023SJohn Marino } 331*e4b17023SJohn Marino __catch(...) 332*e4b17023SJohn Marino { __os._M_setstate(ios_base::badbit); } 333*e4b17023SJohn Marino if (__err) 334*e4b17023SJohn Marino __os.setstate(__err); 335*e4b17023SJohn Marino } 336*e4b17023SJohn Marino return __os; 337*e4b17023SJohn Marino } 338*e4b17023SJohn Marino 339*e4b17023SJohn Marino#endif 340*e4b17023SJohn Marino 341*e4b17023SJohn Marino // Inhibit implicit instantiations for required instantiations, 342*e4b17023SJohn Marino // which are defined via explicit instantiations elsewhere. 343*e4b17023SJohn Marino // NB: This syntax is a GNU extension. 344*e4b17023SJohn Marino#if _GLIBCXX_EXTERN_TEMPLATE 345*e4b17023SJohn Marino extern template ostream& operator<<(ostream&, _Setfill<char>); 346*e4b17023SJohn Marino extern template ostream& operator<<(ostream&, _Setiosflags); 347*e4b17023SJohn Marino extern template ostream& operator<<(ostream&, _Resetiosflags); 348*e4b17023SJohn Marino extern template ostream& operator<<(ostream&, _Setbase); 349*e4b17023SJohn Marino extern template ostream& operator<<(ostream&, _Setprecision); 350*e4b17023SJohn Marino extern template ostream& operator<<(ostream&, _Setw); 351*e4b17023SJohn Marino extern template istream& operator>>(istream&, _Setfill<char>); 352*e4b17023SJohn Marino extern template istream& operator>>(istream&, _Setiosflags); 353*e4b17023SJohn Marino extern template istream& operator>>(istream&, _Resetiosflags); 354*e4b17023SJohn Marino extern template istream& operator>>(istream&, _Setbase); 355*e4b17023SJohn Marino extern template istream& operator>>(istream&, _Setprecision); 356*e4b17023SJohn Marino extern template istream& operator>>(istream&, _Setw); 357*e4b17023SJohn Marino 358*e4b17023SJohn Marino#ifdef _GLIBCXX_USE_WCHAR_T 359*e4b17023SJohn Marino extern template wostream& operator<<(wostream&, _Setfill<wchar_t>); 360*e4b17023SJohn Marino extern template wostream& operator<<(wostream&, _Setiosflags); 361*e4b17023SJohn Marino extern template wostream& operator<<(wostream&, _Resetiosflags); 362*e4b17023SJohn Marino extern template wostream& operator<<(wostream&, _Setbase); 363*e4b17023SJohn Marino extern template wostream& operator<<(wostream&, _Setprecision); 364*e4b17023SJohn Marino extern template wostream& operator<<(wostream&, _Setw); 365*e4b17023SJohn Marino extern template wistream& operator>>(wistream&, _Setfill<wchar_t>); 366*e4b17023SJohn Marino extern template wistream& operator>>(wistream&, _Setiosflags); 367*e4b17023SJohn Marino extern template wistream& operator>>(wistream&, _Resetiosflags); 368*e4b17023SJohn Marino extern template wistream& operator>>(wistream&, _Setbase); 369*e4b17023SJohn Marino extern template wistream& operator>>(wistream&, _Setprecision); 370*e4b17023SJohn Marino extern template wistream& operator>>(wistream&, _Setw); 371*e4b17023SJohn Marino#endif 372*e4b17023SJohn Marino#endif 373*e4b17023SJohn Marino 374*e4b17023SJohn Marino_GLIBCXX_END_NAMESPACE_VERSION 375*e4b17023SJohn Marino} // namespace 376*e4b17023SJohn Marino 377*e4b17023SJohn Marino#endif /* _GLIBCXX_IOMANIP */ 378