197403Sobrien// Standard stream manipulators -*- C++ -*-
297403Sobrien
3169691Skan// Copyright (C) 1997, 1998, 1999, 2001, 2002, 2003, 2005
4117397Skan// Free Software Foundation, Inc.
597403Sobrien//
697403Sobrien// This file is part of the GNU ISO C++ Library.  This library is free
797403Sobrien// software; you can redistribute it and/or modify it under the
897403Sobrien// terms of the GNU General Public License as published by the
997403Sobrien// Free Software Foundation; either version 2, or (at your option)
1097403Sobrien// any later version.
1197403Sobrien
1297403Sobrien// This library is distributed in the hope that it will be useful,
1397403Sobrien// but WITHOUT ANY WARRANTY; without even the implied warranty of
1497403Sobrien// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1597403Sobrien// GNU General Public License for more details.
1697403Sobrien
1797403Sobrien// You should have received a copy of the GNU General Public License along
1897403Sobrien// with this library; see the file COPYING.  If not, write to the Free
19169691Skan// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
2097403Sobrien// USA.
2197403Sobrien
2297403Sobrien// As a special exception, you may use this file as part of a free software
2397403Sobrien// library without restriction.  Specifically, if other files instantiate
2497403Sobrien// templates or use macros or inline functions from this file, or you compile
2597403Sobrien// this file and link it with other files to produce an executable, this
2697403Sobrien// file does not by itself cause the resulting executable to be covered by
2797403Sobrien// the GNU General Public License.  This exception does not however
2897403Sobrien// invalidate any other reasons why the executable file might be covered by
2997403Sobrien// the GNU General Public License.
3097403Sobrien
31169691Skan/** @file iomanip
32169691Skan *  This is a Standard C++ Library header.
33169691Skan */
34169691Skan
3597403Sobrien//
3697403Sobrien// ISO C++ 14882: 27.6.3  Standard manipulators
3797403Sobrien//
3897403Sobrien
39132720Skan#ifndef _GLIBCXX_IOMANIP
40132720Skan#define _GLIBCXX_IOMANIP 1
4197403Sobrien
4297403Sobrien#pragma GCC system_header
4397403Sobrien
4497403Sobrien#include <bits/c++config.h>
4597403Sobrien#include <istream>
4697403Sobrien#include <functional>
4797403Sobrien
48169691Skan_GLIBCXX_BEGIN_NAMESPACE(std)
49169691Skan
50117397Skan  // [27.6.3] standard manipulators
51117397Skan  // Also see DR 183.
52117397Skan
5397403Sobrien  struct _Resetiosflags { ios_base::fmtflags _M_mask; };
5497403Sobrien
55117397Skan  /**
56117397Skan   *  @brief  Manipulator for @c setf.
57117397Skan   *  @param  mask  A format flags mask.
58117397Skan   *
59117397Skan   *  Sent to a stream object, this manipulator resets the specified flags,
60117397Skan   *  via @e stream.setf(0,mask).
61117397Skan  */
6297403Sobrien  inline _Resetiosflags
6397403Sobrien  resetiosflags(ios_base::fmtflags __mask)
6497403Sobrien  {
6597403Sobrien    _Resetiosflags __x;
6697403Sobrien    __x._M_mask = __mask;
6797403Sobrien    return __x;
6897403Sobrien  }
6997403Sobrien
7097403Sobrien  template<typename _CharT, typename _Traits>
7197403Sobrien    inline basic_istream<_CharT,_Traits>&
7297403Sobrien    operator>>(basic_istream<_CharT,_Traits>& __is, _Resetiosflags __f)
7397403Sobrien    {
7497403Sobrien      __is.setf(ios_base::fmtflags(0), __f._M_mask);
7597403Sobrien      return __is;
7697403Sobrien    }
7797403Sobrien
7897403Sobrien  template<typename _CharT, typename _Traits>
7997403Sobrien    inline basic_ostream<_CharT,_Traits>&
8097403Sobrien    operator<<(basic_ostream<_CharT,_Traits>& __os, _Resetiosflags __f)
8197403Sobrien    {
8297403Sobrien      __os.setf(ios_base::fmtflags(0), __f._M_mask);
8397403Sobrien      return __os;
8497403Sobrien    }
8597403Sobrien
8697403Sobrien
8797403Sobrien  struct _Setiosflags { ios_base::fmtflags _M_mask; };
8897403Sobrien
89117397Skan  /**
90117397Skan   *  @brief  Manipulator for @c setf.
91117397Skan   *  @param  mask  A format flags mask.
92117397Skan   *
93117397Skan   *  Sent to a stream object, this manipulator sets the format flags
94117397Skan   *  to @a mask.
95117397Skan  */
9697403Sobrien  inline _Setiosflags
9797403Sobrien  setiosflags(ios_base::fmtflags __mask)
9897403Sobrien  {
9997403Sobrien    _Setiosflags __x;
10097403Sobrien    __x._M_mask = __mask;
10197403Sobrien    return __x;
10297403Sobrien  }
10397403Sobrien
10497403Sobrien  template<typename _CharT, typename _Traits>
10597403Sobrien    inline basic_istream<_CharT,_Traits>&
10697403Sobrien    operator>>(basic_istream<_CharT,_Traits>& __is, _Setiosflags __f)
10797403Sobrien    {
10897403Sobrien      __is.setf(__f._M_mask);
10997403Sobrien      return __is;
11097403Sobrien    }
11197403Sobrien
11297403Sobrien  template<typename _CharT, typename _Traits>
11397403Sobrien    inline basic_ostream<_CharT,_Traits>&
11497403Sobrien    operator<<(basic_ostream<_CharT,_Traits>& __os, _Setiosflags __f)
11597403Sobrien    {
11697403Sobrien      __os.setf(__f._M_mask);
11797403Sobrien      return __os;
11897403Sobrien    }
11997403Sobrien
12097403Sobrien
12197403Sobrien  struct _Setbase { int _M_base; };
12297403Sobrien
123117397Skan  /**
124117397Skan   *  @brief  Manipulator for @c setf.
125117397Skan   *  @param  base  A numeric base.
126117397Skan   *
127117397Skan   *  Sent to a stream object, this manipulator changes the
128117397Skan   *  @c ios_base::basefield flags to @c oct, @c dec, or @c hex when @a base
129117397Skan   *  is 8, 10, or 16, accordingly, and to 0 if @a base is any other value.
130117397Skan  */
13197403Sobrien  inline _Setbase
13297403Sobrien  setbase(int __base)
13397403Sobrien  {
13497403Sobrien    _Setbase __x;
13597403Sobrien    __x._M_base = __base;
13697403Sobrien    return __x;
13797403Sobrien  }
13897403Sobrien
13997403Sobrien  template<typename _CharT, typename _Traits>
14097403Sobrien    inline basic_istream<_CharT,_Traits>&
14197403Sobrien    operator>>(basic_istream<_CharT,_Traits>& __is, _Setbase __f)
14297403Sobrien    {
14397403Sobrien      __is.setf(__f._M_base ==  8 ? ios_base::oct :
14497403Sobrien	      __f._M_base == 10 ? ios_base::dec :
14597403Sobrien	      __f._M_base == 16 ? ios_base::hex :
14697403Sobrien	      ios_base::fmtflags(0), ios_base::basefield);
14797403Sobrien      return __is;
14897403Sobrien    }
14997403Sobrien
15097403Sobrien  template<typename _CharT, typename _Traits>
15197403Sobrien    inline basic_ostream<_CharT,_Traits>&
15297403Sobrien    operator<<(basic_ostream<_CharT,_Traits>& __os, _Setbase __f)
15397403Sobrien    {
15497403Sobrien      __os.setf(__f._M_base ==  8 ? ios_base::oct :
15597403Sobrien		__f._M_base == 10 ? ios_base::dec :
15697403Sobrien		__f._M_base == 16 ? ios_base::hex :
15797403Sobrien		ios_base::fmtflags(0), ios_base::basefield);
15897403Sobrien      return __os;
15997403Sobrien    }
16097403Sobrien
16197403Sobrien
16297403Sobrien  template<typename _CharT>
16397403Sobrien    struct _Setfill { _CharT _M_c; };
16497403Sobrien
165117397Skan  /**
166117397Skan   *  @brief  Manipulator for @c fill.
167117397Skan   *  @param  c  The new fill character.
168117397Skan   *
169117397Skan   *  Sent to a stream object, this manipulator calls @c fill(c) for that
170117397Skan   *  object.
171117397Skan  */
17297403Sobrien  template<typename _CharT>
17397403Sobrien    inline _Setfill<_CharT>
17497403Sobrien    setfill(_CharT __c)
17597403Sobrien    {
17697403Sobrien      _Setfill<_CharT> __x;
17797403Sobrien      __x._M_c = __c;
17897403Sobrien      return __x;
17997403Sobrien    }
18097403Sobrien
18197403Sobrien  template<typename _CharT, typename _Traits>
18297403Sobrien    inline basic_istream<_CharT,_Traits>&
18397403Sobrien    operator>>(basic_istream<_CharT,_Traits>& __is, _Setfill<_CharT> __f)
18497403Sobrien    {
18597403Sobrien      __is.fill(__f._M_c);
18697403Sobrien      return __is;
18797403Sobrien    }
18897403Sobrien
18997403Sobrien  template<typename _CharT, typename _Traits>
19097403Sobrien    inline basic_ostream<_CharT,_Traits>&
19197403Sobrien    operator<<(basic_ostream<_CharT,_Traits>& __os, _Setfill<_CharT> __f)
19297403Sobrien    {
19397403Sobrien      __os.fill(__f._M_c);
19497403Sobrien      return __os;
19597403Sobrien    }
19697403Sobrien
19797403Sobrien
19897403Sobrien  struct _Setprecision { int _M_n; };
19997403Sobrien
200117397Skan  /**
201117397Skan   *  @brief  Manipulator for @c precision.
202117397Skan   *  @param  n  The new precision.
203117397Skan   *
204117397Skan   *  Sent to a stream object, this manipulator calls @c precision(n) for
205117397Skan   *  that object.
206117397Skan  */
20797403Sobrien  inline _Setprecision
20897403Sobrien  setprecision(int __n)
20997403Sobrien  {
21097403Sobrien    _Setprecision __x;
21197403Sobrien    __x._M_n = __n;
21297403Sobrien    return __x;
21397403Sobrien  }
21497403Sobrien
21597403Sobrien  template<typename _CharT, typename _Traits>
21697403Sobrien    inline basic_istream<_CharT,_Traits>&
21797403Sobrien    operator>>(basic_istream<_CharT,_Traits>& __is, _Setprecision __f)
21897403Sobrien    {
21997403Sobrien      __is.precision(__f._M_n);
22097403Sobrien      return __is;
22197403Sobrien    }
22297403Sobrien
22397403Sobrien  template<typename _CharT, typename _Traits>
22497403Sobrien    inline basic_ostream<_CharT,_Traits>&
22597403Sobrien    operator<<(basic_ostream<_CharT,_Traits>& __os, _Setprecision __f)
22697403Sobrien    {
22797403Sobrien      __os.precision(__f._M_n);
22897403Sobrien      return __os;
22997403Sobrien    }
23097403Sobrien
23197403Sobrien
23297403Sobrien  struct _Setw { int _M_n; };
23397403Sobrien
234117397Skan  /**
235117397Skan   *  @brief  Manipulator for @c width.
236117397Skan   *  @param  n  The new width.
237117397Skan   *
238117397Skan   *  Sent to a stream object, this manipulator calls @c width(n) for
239117397Skan   *  that object.
240117397Skan  */
24197403Sobrien  inline _Setw
24297403Sobrien  setw(int __n)
24397403Sobrien  {
24497403Sobrien    _Setw __x;
24597403Sobrien    __x._M_n = __n;
24697403Sobrien    return __x;
24797403Sobrien  }
24897403Sobrien
24997403Sobrien  template<typename _CharT, typename _Traits>
25097403Sobrien    inline basic_istream<_CharT,_Traits>&
25197403Sobrien    operator>>(basic_istream<_CharT,_Traits>& __is, _Setw __f)
25297403Sobrien    {
25397403Sobrien      __is.width(__f._M_n);
25497403Sobrien      return __is;
25597403Sobrien    }
25697403Sobrien
25797403Sobrien  template<typename _CharT, typename _Traits>
25897403Sobrien    inline basic_ostream<_CharT,_Traits>&
25997403Sobrien    operator<<(basic_ostream<_CharT,_Traits>& __os, _Setw __f)
26097403Sobrien    {
26197403Sobrien      __os.width(__f._M_n);
26297403Sobrien      return __os;
26397403Sobrien    }
26497403Sobrien
26597403Sobrien  // Inhibit implicit instantiations for required instantiations,
26697403Sobrien  // which are defined via explicit instantiations elsewhere.
26797403Sobrien  // NB:  This syntax is a GNU extension.
268132720Skan#if _GLIBCXX_EXTERN_TEMPLATE
26997403Sobrien  extern template ostream& operator<<(ostream&, _Setfill<char>);
27097403Sobrien  extern template ostream& operator<<(ostream&, _Setiosflags);
27197403Sobrien  extern template ostream& operator<<(ostream&, _Resetiosflags);
27297403Sobrien  extern template ostream& operator<<(ostream&, _Setbase);
27397403Sobrien  extern template ostream& operator<<(ostream&, _Setprecision);
27497403Sobrien  extern template ostream& operator<<(ostream&, _Setw);
275107606Sobrien  extern template istream& operator>>(istream&, _Setfill<char>);
276107606Sobrien  extern template istream& operator>>(istream&, _Setiosflags);
277107606Sobrien  extern template istream& operator>>(istream&, _Resetiosflags);
278107606Sobrien  extern template istream& operator>>(istream&, _Setbase);
279107606Sobrien  extern template istream& operator>>(istream&, _Setprecision);
280107606Sobrien  extern template istream& operator>>(istream&, _Setw);
281107606Sobrien
282132720Skan#ifdef _GLIBCXX_USE_WCHAR_T
28397403Sobrien  extern template wostream& operator<<(wostream&, _Setfill<wchar_t>);
28497403Sobrien  extern template wostream& operator<<(wostream&, _Setiosflags);
28597403Sobrien  extern template wostream& operator<<(wostream&, _Resetiosflags);
28697403Sobrien  extern template wostream& operator<<(wostream&, _Setbase);
28797403Sobrien  extern template wostream& operator<<(wostream&, _Setprecision);
28897403Sobrien  extern template wostream& operator<<(wostream&, _Setw);
28997403Sobrien  extern template wistream& operator>>(wistream&, _Setfill<wchar_t>);
29097403Sobrien  extern template wistream& operator>>(wistream&, _Setiosflags);
29197403Sobrien  extern template wistream& operator>>(wistream&, _Resetiosflags);
29297403Sobrien  extern template wistream& operator>>(wistream&, _Setbase);
29397403Sobrien  extern template wistream& operator>>(wistream&, _Setprecision);
29497403Sobrien  extern template wistream& operator>>(wistream&, _Setw);
295107606Sobrien#endif
296117397Skan#endif
29797403Sobrien
298169691Skan_GLIBCXX_END_NAMESPACE
299169691Skan
300132720Skan#endif /* _GLIBCXX_IOMANIP */
301