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