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