1    	// Standard stream manipulators -*- C++ -*-
2    	
3    	// Copyright (C) 1997-2017 Free Software Foundation, Inc.
4    	//
5    	// This file is part of the GNU ISO C++ Library.  This library is free
6    	// software; you can redistribute it and/or modify it under the
7    	// terms of the GNU General Public License as published by the
8    	// Free Software Foundation; either version 3, or (at your option)
9    	// any later version.
10   	
11   	// This library is distributed in the hope that it will be useful,
12   	// but WITHOUT ANY WARRANTY; without even the implied warranty of
13   	// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   	// GNU General Public License for more details.
15   	
16   	// Under Section 7 of GPL version 3, you are granted additional
17   	// permissions described in the GCC Runtime Library Exception, version
18   	// 3.1, as published by the Free Software Foundation.
19   	
20   	// You should have received a copy of the GNU General Public License and
21   	// a copy of the GCC Runtime Library Exception along with this program;
22   	// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23   	// <http://www.gnu.org/licenses/>.
24   	
25   	/** @file include/iomanip
26   	 *  This is a Standard C++ Library header.
27   	 */
28   	
29   	//
30   	// ISO C++ 14882: 27.6.3  Standard manipulators
31   	//
32   	
33   	#ifndef _GLIBCXX_IOMANIP
34   	#define _GLIBCXX_IOMANIP 1
35   	
36   	#pragma GCC system_header
37   	
38   	#include <bits/c++config.h>
39   	#include <iosfwd>
40   	#include <bits/ios_base.h>
41   	
42   	#if __cplusplus >= 201103L
43   	#include <locale>
44   	#if __cplusplus > 201103L
45   	#include <bits/quoted_string.h>
46   	#endif
47   	#endif
48   	
49   	namespace std _GLIBCXX_VISIBILITY(default)
50   	{
51   	_GLIBCXX_BEGIN_NAMESPACE_VERSION
52   	
53   	  // [27.6.3] standard manipulators
54   	  // Also see DR 183.
55   	
56   	  struct _Resetiosflags { ios_base::fmtflags _M_mask; };
57   	
58   	  /**
59   	   *  @brief  Manipulator for @c setf.
60   	   *  @param  __mask  A format flags mask.
61   	   *
62   	   *  Sent to a stream object, this manipulator resets the specified flags,
63   	   *  via @e stream.setf(0,__mask).
64   	  */
65   	  inline _Resetiosflags
66   	  resetiosflags(ios_base::fmtflags __mask)
67   	  { return { __mask }; }
68   	
69   	  template<typename _CharT, typename _Traits>
70   	    inline basic_istream<_CharT, _Traits>&
71   	    operator>>(basic_istream<_CharT, _Traits>& __is, _Resetiosflags __f)
72   	    {
73   	      __is.setf(ios_base::fmtflags(0), __f._M_mask);
74   	      return __is;
75   	    }
76   	
77   	  template<typename _CharT, typename _Traits>
78   	    inline basic_ostream<_CharT, _Traits>&
79   	    operator<<(basic_ostream<_CharT, _Traits>& __os, _Resetiosflags __f)
80   	    {
81   	      __os.setf(ios_base::fmtflags(0), __f._M_mask);
82   	      return __os;
83   	    }
84   	
85   	
86   	  struct _Setiosflags { ios_base::fmtflags _M_mask; };
87   	
88   	  /**
89   	   *  @brief  Manipulator for @c setf.
90   	   *  @param  __mask  A format flags mask.
91   	   *
92   	   *  Sent to a stream object, this manipulator sets the format flags
93   	   *  to @a __mask.
94   	  */
95   	  inline _Setiosflags
96   	  setiosflags(ios_base::fmtflags __mask)
97   	  { return { __mask }; }
98   	
99   	  template<typename _CharT, typename _Traits>
100  	    inline basic_istream<_CharT, _Traits>&
101  	    operator>>(basic_istream<_CharT, _Traits>& __is, _Setiosflags __f)
102  	    {
103  	      __is.setf(__f._M_mask);
104  	      return __is;
105  	    }
106  	
107  	  template<typename _CharT, typename _Traits>
108  	    inline basic_ostream<_CharT, _Traits>&
109  	    operator<<(basic_ostream<_CharT, _Traits>& __os, _Setiosflags __f)
110  	    {
111  	      __os.setf(__f._M_mask);
112  	      return __os;
113  	    }
114  	
115  	
116  	  struct _Setbase { int _M_base; };
117  	
118  	  /**
119  	   *  @brief  Manipulator for @c setf.
120  	   *  @param  __base  A numeric base.
121  	   *
122  	   *  Sent to a stream object, this manipulator changes the
123  	   *  @c ios_base::basefield flags to @c oct, @c dec, or @c hex when @a base
124  	   *  is 8, 10, or 16, accordingly, and to 0 if @a __base is any other value.
125  	  */
126  	  inline _Setbase
127  	  setbase(int __base)
128  	  { return { __base }; }
129  	
130  	  template<typename _CharT, typename _Traits>
131  	    inline basic_istream<_CharT, _Traits>&
132  	    operator>>(basic_istream<_CharT, _Traits>& __is, _Setbase __f)
133  	    {
134  	      __is.setf(__f._M_base ==  8 ? ios_base::oct :
135  			__f._M_base == 10 ? ios_base::dec :
136  			__f._M_base == 16 ? ios_base::hex :
137  			ios_base::fmtflags(0), ios_base::basefield);
138  	      return __is;
139  	    }
140  	
141  	  template<typename _CharT, typename _Traits>
142  	    inline basic_ostream<_CharT, _Traits>&
143  	    operator<<(basic_ostream<_CharT, _Traits>& __os, _Setbase __f)
144  	    {
145  	      __os.setf(__f._M_base ==  8 ? ios_base::oct :
146  			__f._M_base == 10 ? ios_base::dec :
147  			__f._M_base == 16 ? ios_base::hex :
148  			ios_base::fmtflags(0), ios_base::basefield);
149  	      return __os;
150  	    }
151  	
152  	
153  	  template<typename _CharT>
154  	    struct _Setfill { _CharT _M_c; };
155  	
156  	  /**
157  	   *  @brief  Manipulator for @c fill.
158  	   *  @param  __c  The new fill character.
159  	   *
160  	   *  Sent to a stream object, this manipulator calls @c fill(__c) for that
161  	   *  object.
162  	  */
163  	  template<typename _CharT>
164  	    inline _Setfill<_CharT>
165  	    setfill(_CharT __c)
166  	    { return { __c }; }
167  	
168  	  template<typename _CharT, typename _Traits>
169  	    inline basic_istream<_CharT, _Traits>&
170  	    operator>>(basic_istream<_CharT, _Traits>& __is, _Setfill<_CharT> __f)
171  	    {
172  	      __is.fill(__f._M_c);
173  	      return __is;
174  	    }
175  	
176  	  template<typename _CharT, typename _Traits>
177  	    inline basic_ostream<_CharT, _Traits>&
178  	    operator<<(basic_ostream<_CharT, _Traits>& __os, _Setfill<_CharT> __f)
179  	    {
180  	      __os.fill(__f._M_c);
181  	      return __os;
182  	    }
183  	
184  	
185  	  struct _Setprecision { int _M_n; };
186  	
187  	  /**
188  	   *  @brief  Manipulator for @c precision.
189  	   *  @param  __n  The new precision.
190  	   *
191  	   *  Sent to a stream object, this manipulator calls @c precision(__n) for
192  	   *  that object.
193  	  */
194  	  inline _Setprecision
195  	  setprecision(int __n)
196  	  { return { __n }; }
197  	
198  	  template<typename _CharT, typename _Traits>
199  	    inline basic_istream<_CharT, _Traits>&
200  	    operator>>(basic_istream<_CharT, _Traits>& __is, _Setprecision __f)
201  	    {
202  	      __is.precision(__f._M_n);
203  	      return __is;
204  	    }
205  	
206  	  template<typename _CharT, typename _Traits>
207  	    inline basic_ostream<_CharT, _Traits>&
208  	    operator<<(basic_ostream<_CharT, _Traits>& __os, _Setprecision __f)
209  	    {
210  	      __os.precision(__f._M_n);
211  	      return __os;
212  	    }
213  	
214  	
215  	  struct _Setw { int _M_n; };
216  	
217  	  /**
218  	   *  @brief  Manipulator for @c width.
219  	   *  @param  __n  The new width.
220  	   *
221  	   *  Sent to a stream object, this manipulator calls @c width(__n) for
222  	   *  that object.
223  	  */
224  	  inline _Setw
225  	  setw(int __n)
226  	  { return { __n }; }
227  	
228  	  template<typename _CharT, typename _Traits>
229  	    inline basic_istream<_CharT, _Traits>&
230  	    operator>>(basic_istream<_CharT, _Traits>& __is, _Setw __f)
231  	    {
232  	      __is.width(__f._M_n);
233  	      return __is;
234  	    }
235  	
236  	  template<typename _CharT, typename _Traits>
237  	    inline basic_ostream<_CharT, _Traits>&
238  	    operator<<(basic_ostream<_CharT, _Traits>& __os, _Setw __f)
239  	    {
240  	      __os.width(__f._M_n);
241  	      return __os;
242  	    }
243  	
244  	#if __cplusplus >= 201103L
245  	
246  	  template<typename _MoneyT>
247  	    struct _Get_money { _MoneyT& _M_mon; bool _M_intl; };
248  	
249  	  /**
250  	   *  @brief  Extended manipulator for extracting money.
251  	   *  @param  __mon  Either long double or a specialization of @c basic_string.
252  	   *  @param  __intl A bool indicating whether international format
253  	   *                 is to be used.
254  	   *
255  	   *  Sent to a stream object, this manipulator extracts @a __mon.
256  	  */
257  	  template<typename _MoneyT>
258  	    inline _Get_money<_MoneyT>
259  	    get_money(_MoneyT& __mon, bool __intl = false)
260  	    { return { __mon, __intl }; }
261  	
262  	  template<typename _CharT, typename _Traits, typename _MoneyT>
263  	    basic_istream<_CharT, _Traits>&
264  	    operator>>(basic_istream<_CharT, _Traits>& __is, _Get_money<_MoneyT> __f)
265  	    {
266  	      typename basic_istream<_CharT, _Traits>::sentry __cerb(__is, false);
267  	      if (__cerb)
268  		{
269  		  ios_base::iostate __err = ios_base::goodbit;
270  		  __try
271  		    {
272  		      typedef istreambuf_iterator<_CharT, _Traits>   _Iter;
273  		      typedef money_get<_CharT, _Iter>               _MoneyGet;
274  	
275  		      const _MoneyGet& __mg = use_facet<_MoneyGet>(__is.getloc());
276  		      __mg.get(_Iter(__is.rdbuf()), _Iter(), __f._M_intl,
277  			       __is, __err, __f._M_mon);
278  		    }
279  		  __catch(__cxxabiv1::__forced_unwind&)
280  		    {
281  		      __is._M_setstate(ios_base::badbit);
282  		      __throw_exception_again;
283  		    }
284  		  __catch(...)
285  		    { __is._M_setstate(ios_base::badbit); }
286  		  if (__err)
287  		    __is.setstate(__err);
288  		}
289  	      return __is;
290  	    }
291  	
292  	
293  	  template<typename _MoneyT>
294  	    struct _Put_money { const _MoneyT& _M_mon; bool _M_intl; };
295  	
296  	  /**
297  	   *  @brief  Extended manipulator for inserting money.
298  	   *  @param  __mon  Either long double or a specialization of @c basic_string.
299  	   *  @param  __intl A bool indicating whether international format
300  	   *                 is to be used.
301  	   *
302  	   *  Sent to a stream object, this manipulator inserts @a __mon.
303  	  */
304  	  template<typename _MoneyT>
305  	    inline _Put_money<_MoneyT>
306  	    put_money(const _MoneyT& __mon, bool __intl = false)
307  	    { return { __mon, __intl }; }
308  	
309  	  template<typename _CharT, typename _Traits, typename _MoneyT>
310  	    basic_ostream<_CharT, _Traits>&
311  	    operator<<(basic_ostream<_CharT, _Traits>& __os, _Put_money<_MoneyT> __f)
312  	    {
313  	      typename basic_ostream<_CharT, _Traits>::sentry __cerb(__os);
314  	      if (__cerb)
315  		{
316  		  ios_base::iostate __err = ios_base::goodbit;
317  		  __try
318  		    {
319  		      typedef ostreambuf_iterator<_CharT, _Traits>   _Iter;
320  		      typedef money_put<_CharT, _Iter>               _MoneyPut;
321  	
322  		      const _MoneyPut& __mp = use_facet<_MoneyPut>(__os.getloc());
323  		      if (__mp.put(_Iter(__os.rdbuf()), __f._M_intl, __os,
324  				   __os.fill(), __f._M_mon).failed())
325  			__err |= ios_base::badbit;
326  		    }
327  		  __catch(__cxxabiv1::__forced_unwind&)
328  		    {
329  		      __os._M_setstate(ios_base::badbit);
330  		      __throw_exception_again;
331  		    }
332  		  __catch(...)
333  		    { __os._M_setstate(ios_base::badbit); }
334  		  if (__err)
335  		    __os.setstate(__err);
336  		}
337  	      return __os;
338  	    }
339  	
340  	  template<typename _CharT>
341  	    struct _Put_time
342  	    {
343  	      const std::tm* _M_tmb;
344  	      const _CharT* _M_fmt;
345  	    };
346  	
347  	  /**
348  	   *  @brief  Extended manipulator for formatting time.
349  	   *
350  	   *  This manipulator uses time_put::put to format time.
351  	   *  [ext.manip]
352  	   *
353  	   *  @param __tmb  struct tm time data to format.
354  	   *  @param __fmt  format string.
355  	   */
356  	  template<typename _CharT>
357  	    inline _Put_time<_CharT>
358  	    put_time(const std::tm* __tmb, const _CharT* __fmt)
359  	    { return { __tmb, __fmt }; }
360  	
361  	  template<typename _CharT, typename _Traits>
362  	    basic_ostream<_CharT, _Traits>&
363  	    operator<<(basic_ostream<_CharT, _Traits>& __os, _Put_time<_CharT> __f)
364  	    {
365  	      typename basic_ostream<_CharT, _Traits>::sentry __cerb(__os);
366  	      if (__cerb)
367  	        {
368  	          ios_base::iostate __err = ios_base::goodbit;
369  	          __try
370  	            {
371  	              typedef ostreambuf_iterator<_CharT, _Traits>   _Iter;
372  	              typedef time_put<_CharT, _Iter>                _TimePut;
373  	
374  	              const _CharT* const __fmt_end = __f._M_fmt +
375  	                _Traits::length(__f._M_fmt);
376  	
377  	              const _TimePut& __mp = use_facet<_TimePut>(__os.getloc());
378  	              if (__mp.put(_Iter(__os.rdbuf()), __os, __os.fill(),
379  	                           __f._M_tmb, __f._M_fmt, __fmt_end).failed())
380  	                __err |= ios_base::badbit;
381  	            }
382  	          __catch(__cxxabiv1::__forced_unwind&)
383  	            {
384  	              __os._M_setstate(ios_base::badbit);
385  	              __throw_exception_again;
386  	            }
387  	          __catch(...)
388  	            { __os._M_setstate(ios_base::badbit); }
389  	          if (__err)
390  	            __os.setstate(__err);
391  	        }
392  	      return __os;
393  	    }
394  	
395  	  template<typename _CharT>
396  	    struct _Get_time
397  	    {
398  	      std::tm*	    _M_tmb;
399  	      const _CharT* _M_fmt;
400  	    };
401  	
402  	  /**
403  	   *  @brief  Extended manipulator for extracting time.
404  	   *
405  	   *  This manipulator uses time_get::get to extract time.
406  	   *  [ext.manip]
407  	   *
408  	   *  @param __tmb  struct to extract the time data to.
409  	   *  @param __fmt  format string.
410  	   */
411  	  template<typename _CharT>
412  	    inline _Get_time<_CharT>
413  	    get_time(std::tm* __tmb, const _CharT* __fmt)
414  	    { return { __tmb, __fmt }; }
415  	
416  	  template<typename _CharT, typename _Traits>
417  	    basic_istream<_CharT, _Traits>&
418  	    operator>>(basic_istream<_CharT, _Traits>& __is, _Get_time<_CharT> __f)
419  	    {
420  	      typename basic_istream<_CharT, _Traits>::sentry __cerb(__is, false);
421  	      if (__cerb)
422  	        {
423  	          ios_base::iostate __err = ios_base::goodbit;
424  	          __try
425  	            {
426  	              typedef istreambuf_iterator<_CharT, _Traits>   _Iter;
427  	              typedef time_get<_CharT, _Iter>                _TimeGet;
428  	
429  	              const _CharT* const __fmt_end = __f._M_fmt +
430  	                _Traits::length(__f._M_fmt);
431  	
432  	              const _TimeGet& __mg = use_facet<_TimeGet>(__is.getloc());
433  	              __mg.get(_Iter(__is.rdbuf()), _Iter(), __is,
434  	                       __err, __f._M_tmb, __f._M_fmt, __fmt_end);
435  	            }
436  	          __catch(__cxxabiv1::__forced_unwind&)
437  	            {
438  	              __is._M_setstate(ios_base::badbit);
439  	              __throw_exception_again;
440  	            }
441  	          __catch(...)
442  	            { __is._M_setstate(ios_base::badbit); }
443  	          if (__err)
444  	            __is.setstate(__err);
445  	        }
446  	      return __is;
447  	    }
448  	
449  	#if __cplusplus > 201103L
450  	
451  	#define __cpp_lib_quoted_string_io 201304
452  	
453  	  /**
454  	   * @brief Manipulator for quoted strings.
455  	   * @param __string String to quote.
456  	   * @param __delim  Character to quote string with.
457  	   * @param __escape Escape character to escape itself or quote character.
458  	   */
459  	  template<typename _CharT>
460  	    inline auto
461  	    quoted(const _CharT* __string,
462  		   _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\'))
463  	    {
464  	      return __detail::_Quoted_string<const _CharT*, _CharT>(__string, __delim,
465  								     __escape);
466  	    }
467  	
468  	  template<typename _CharT, typename _Traits, typename _Alloc>
469  	    inline auto
470  	    quoted(const basic_string<_CharT, _Traits, _Alloc>& __string,
471  		   _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\'))
472  	    {
473  	      return __detail::_Quoted_string<
474  				const basic_string<_CharT, _Traits, _Alloc>&, _CharT>(
475  					__string, __delim, __escape);
476  	    }
477  	
478  	  template<typename _CharT, typename _Traits, typename _Alloc>
479  	    inline auto
480  	    quoted(basic_string<_CharT, _Traits, _Alloc>& __string,
481  		   _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\'))
482  	    {
483  	      return __detail::_Quoted_string<
484  				basic_string<_CharT, _Traits, _Alloc>&, _CharT>(
485  					__string, __delim, __escape);
486  	    }
487  	
488  	#endif // __cplusplus > 201103L
489  	
490  	#endif // __cplusplus >= 201103L
491  	
492  	  // Inhibit implicit instantiations for required instantiations,
493  	  // which are defined via explicit instantiations elsewhere.
494  	  // NB:  This syntax is a GNU extension.
495  	#if _GLIBCXX_EXTERN_TEMPLATE
496  	  extern template ostream& operator<<(ostream&, _Setfill<char>);
497  	  extern template ostream& operator<<(ostream&, _Setiosflags);
498  	  extern template ostream& operator<<(ostream&, _Resetiosflags);
499  	  extern template ostream& operator<<(ostream&, _Setbase);
500  	  extern template ostream& operator<<(ostream&, _Setprecision);
501  	  extern template ostream& operator<<(ostream&, _Setw);
502  	  extern template istream& operator>>(istream&, _Setfill<char>);
503  	  extern template istream& operator>>(istream&, _Setiosflags);
504  	  extern template istream& operator>>(istream&, _Resetiosflags);
505  	  extern template istream& operator>>(istream&, _Setbase);
506  	  extern template istream& operator>>(istream&, _Setprecision);
507  	  extern template istream& operator>>(istream&, _Setw);
508  	
509  	#ifdef _GLIBCXX_USE_WCHAR_T
510  	  extern template wostream& operator<<(wostream&, _Setfill<wchar_t>);
511  	  extern template wostream& operator<<(wostream&, _Setiosflags);
512  	  extern template wostream& operator<<(wostream&, _Resetiosflags);
513  	  extern template wostream& operator<<(wostream&, _Setbase);
514  	  extern template wostream& operator<<(wostream&, _Setprecision);
515  	  extern template wostream& operator<<(wostream&, _Setw);
516  	  extern template wistream& operator>>(wistream&, _Setfill<wchar_t>);
517  	  extern template wistream& operator>>(wistream&, _Setiosflags);
518  	  extern template wistream& operator>>(wistream&, _Resetiosflags);
519  	  extern template wistream& operator>>(wistream&, _Setbase);
520  	  extern template wistream& operator>>(wistream&, _Setprecision);
521  	  extern template wistream& operator>>(wistream&, _Setw);
522  	#endif
523  	#endif
524  	
525  	_GLIBCXX_END_NAMESPACE_VERSION
526  	} // namespace
527  	
528  	#endif /* _GLIBCXX_IOMANIP */
529