Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. // Standard stream manipulators -*- C++ -*-
  2.  
  3. // Copyright (C) 1997-2013 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. #endif
  45.  
  46. namespace std _GLIBCXX_VISIBILITY(default)
  47. {
  48. _GLIBCXX_BEGIN_NAMESPACE_VERSION
  49.  
  50.   // [27.6.3] standard manipulators
  51.   // Also see DR 183.
  52.  
  53.   struct _Resetiosflags { ios_base::fmtflags _M_mask; };
  54.  
  55.   /**
  56.    *  @brief  Manipulator for @c setf.
  57.    *  @param  __mask  A format flags mask.
  58.    *
  59.    *  Sent to a stream object, this manipulator resets the specified flags,
  60.    *  via @e stream.setf(0,__mask).
  61.   */
  62.   inline _Resetiosflags
  63.   resetiosflags(ios_base::fmtflags __mask)
  64.   { return { __mask }; }
  65.  
  66.   template<typename _CharT, typename _Traits>
  67.     inline basic_istream<_CharT, _Traits>&
  68.     operator>>(basic_istream<_CharT, _Traits>& __is, _Resetiosflags __f)
  69.     {
  70.       __is.setf(ios_base::fmtflags(0), __f._M_mask);
  71.       return __is;
  72.     }
  73.  
  74.   template<typename _CharT, typename _Traits>
  75.     inline basic_ostream<_CharT, _Traits>&
  76.     operator<<(basic_ostream<_CharT, _Traits>& __os, _Resetiosflags __f)
  77.     {
  78.       __os.setf(ios_base::fmtflags(0), __f._M_mask);
  79.       return __os;
  80.     }
  81.  
  82.  
  83.   struct _Setiosflags { ios_base::fmtflags _M_mask; };
  84.  
  85.   /**
  86.    *  @brief  Manipulator for @c setf.
  87.    *  @param  __mask  A format flags mask.
  88.    *
  89.    *  Sent to a stream object, this manipulator sets the format flags
  90.    *  to @a __mask.
  91.   */
  92.   inline _Setiosflags
  93.   setiosflags(ios_base::fmtflags __mask)
  94.   { return { __mask }; }
  95.  
  96.   template<typename _CharT, typename _Traits>
  97.     inline basic_istream<_CharT, _Traits>&
  98.     operator>>(basic_istream<_CharT, _Traits>& __is, _Setiosflags __f)
  99.     {
  100.       __is.setf(__f._M_mask);
  101.       return __is;
  102.     }
  103.  
  104.   template<typename _CharT, typename _Traits>
  105.     inline basic_ostream<_CharT, _Traits>&
  106.     operator<<(basic_ostream<_CharT, _Traits>& __os, _Setiosflags __f)
  107.     {
  108.       __os.setf(__f._M_mask);
  109.       return __os;
  110.     }
  111.  
  112.  
  113.   struct _Setbase { int _M_base; };
  114.  
  115.   /**
  116.    *  @brief  Manipulator for @c setf.
  117.    *  @param  __base  A numeric base.
  118.    *
  119.    *  Sent to a stream object, this manipulator changes the
  120.    *  @c ios_base::basefield flags to @c oct, @c dec, or @c hex when @a base
  121.    *  is 8, 10, or 16, accordingly, and to 0 if @a __base is any other value.
  122.   */
  123.   inline _Setbase
  124.   setbase(int __base)
  125.   { return { __base }; }
  126.  
  127.   template<typename _CharT, typename _Traits>
  128.     inline basic_istream<_CharT, _Traits>&
  129.     operator>>(basic_istream<_CharT, _Traits>& __is, _Setbase __f)
  130.     {
  131.       __is.setf(__f._M_base ==  8 ? ios_base::oct :
  132.                 __f._M_base == 10 ? ios_base::dec :
  133.                 __f._M_base == 16 ? ios_base::hex :
  134.                 ios_base::fmtflags(0), ios_base::basefield);
  135.       return __is;
  136.     }
  137.  
  138.   template<typename _CharT, typename _Traits>
  139.     inline basic_ostream<_CharT, _Traits>&
  140.     operator<<(basic_ostream<_CharT, _Traits>& __os, _Setbase __f)
  141.     {
  142.       __os.setf(__f._M_base ==  8 ? ios_base::oct :
  143.                 __f._M_base == 10 ? ios_base::dec :
  144.                 __f._M_base == 16 ? ios_base::hex :
  145.                 ios_base::fmtflags(0), ios_base::basefield);
  146.       return __os;
  147.     }
  148.  
  149.  
  150.   template<typename _CharT>
  151.     struct _Setfill { _CharT _M_c; };
  152.  
  153.   /**
  154.    *  @brief  Manipulator for @c fill.
  155.    *  @param  __c  The new fill character.
  156.    *
  157.    *  Sent to a stream object, this manipulator calls @c fill(__c) for that
  158.    *  object.
  159.   */
  160.   template<typename _CharT>
  161.     inline _Setfill<_CharT>
  162.     setfill(_CharT __c)
  163.     { return { __c }; }
  164.  
  165.   template<typename _CharT, typename _Traits>
  166.     inline basic_istream<_CharT, _Traits>&
  167.     operator>>(basic_istream<_CharT, _Traits>& __is, _Setfill<_CharT> __f)
  168.     {
  169.       __is.fill(__f._M_c);
  170.       return __is;
  171.     }
  172.  
  173.   template<typename _CharT, typename _Traits>
  174.     inline basic_ostream<_CharT, _Traits>&
  175.     operator<<(basic_ostream<_CharT, _Traits>& __os, _Setfill<_CharT> __f)
  176.     {
  177.       __os.fill(__f._M_c);
  178.       return __os;
  179.     }
  180.  
  181.  
  182.   struct _Setprecision { int _M_n; };
  183.  
  184.   /**
  185.    *  @brief  Manipulator for @c precision.
  186.    *  @param  __n  The new precision.
  187.    *
  188.    *  Sent to a stream object, this manipulator calls @c precision(__n) for
  189.    *  that object.
  190.   */
  191.   inline _Setprecision
  192.   setprecision(int __n)
  193.   { return { __n }; }
  194.  
  195.   template<typename _CharT, typename _Traits>
  196.     inline basic_istream<_CharT, _Traits>&
  197.     operator>>(basic_istream<_CharT, _Traits>& __is, _Setprecision __f)
  198.     {
  199.       __is.precision(__f._M_n);
  200.       return __is;
  201.     }
  202.  
  203.   template<typename _CharT, typename _Traits>
  204.     inline basic_ostream<_CharT, _Traits>&
  205.     operator<<(basic_ostream<_CharT, _Traits>& __os, _Setprecision __f)
  206.     {
  207.       __os.precision(__f._M_n);
  208.       return __os;
  209.     }
  210.  
  211.  
  212.   struct _Setw { int _M_n; };
  213.  
  214.   /**
  215.    *  @brief  Manipulator for @c width.
  216.    *  @param  __n  The new width.
  217.    *
  218.    *  Sent to a stream object, this manipulator calls @c width(__n) for
  219.    *  that object.
  220.   */
  221.   inline _Setw
  222.   setw(int __n)
  223.   { return { __n }; }
  224.  
  225.   template<typename _CharT, typename _Traits>
  226.     inline basic_istream<_CharT, _Traits>&
  227.     operator>>(basic_istream<_CharT, _Traits>& __is, _Setw __f)
  228.     {
  229.       __is.width(__f._M_n);
  230.       return __is;
  231.     }
  232.  
  233.   template<typename _CharT, typename _Traits>
  234.     inline basic_ostream<_CharT, _Traits>&
  235.     operator<<(basic_ostream<_CharT, _Traits>& __os, _Setw __f)
  236.     {
  237.       __os.width(__f._M_n);
  238.       return __os;
  239.     }
  240.  
  241. #if __cplusplus >= 201103L
  242.  
  243.   template<typename _MoneyT>
  244.     struct _Get_money { _MoneyT& _M_mon; bool _M_intl; };
  245.  
  246.   /**
  247.    *  @brief  Extended manipulator for extracting money.
  248.    *  @param  __mon  Either long double or a specialization of @c basic_string.
  249.    *  @param  __intl A bool indicating whether international format
  250.    *                 is to be used.
  251.    *
  252.    *  Sent to a stream object, this manipulator extracts @a __mon.
  253.   */
  254.   template<typename _MoneyT>
  255.     inline _Get_money<_MoneyT>
  256.     get_money(_MoneyT& __mon, bool __intl = false)
  257.     { return { __mon, __intl }; }
  258.  
  259.   template<typename _CharT, typename _Traits, typename _MoneyT>
  260.     basic_istream<_CharT, _Traits>&
  261.     operator>>(basic_istream<_CharT, _Traits>& __is, _Get_money<_MoneyT> __f)
  262.     {
  263.       typename basic_istream<_CharT, _Traits>::sentry __cerb(__is, false);
  264.       if (__cerb)
  265.         {
  266.           ios_base::iostate __err = ios_base::goodbit;
  267.           __try
  268.             {
  269.               typedef istreambuf_iterator<_CharT, _Traits>   _Iter;
  270.               typedef money_get<_CharT, _Iter>               _MoneyGet;
  271.  
  272.               const _MoneyGet& __mg = use_facet<_MoneyGet>(__is.getloc());
  273.               __mg.get(_Iter(__is.rdbuf()), _Iter(), __f._M_intl,
  274.                        __is, __err, __f._M_mon);
  275.             }
  276.           __catch(__cxxabiv1::__forced_unwind&)
  277.             {
  278.               __is._M_setstate(ios_base::badbit);
  279.               __throw_exception_again;
  280.             }
  281.           __catch(...)
  282.             { __is._M_setstate(ios_base::badbit); }
  283.           if (__err)
  284.             __is.setstate(__err);
  285.         }
  286.       return __is;
  287.     }
  288.  
  289.  
  290.   template<typename _MoneyT>
  291.     struct _Put_money { const _MoneyT& _M_mon; bool _M_intl; };
  292.  
  293.   /**
  294.    *  @brief  Extended manipulator for inserting money.
  295.    *  @param  __mon  Either long double or a specialization of @c basic_string.
  296.    *  @param  __intl A bool indicating whether international format
  297.    *                 is to be used.
  298.    *
  299.    *  Sent to a stream object, this manipulator inserts @a __mon.
  300.   */
  301.   template<typename _MoneyT>
  302.     inline _Put_money<_MoneyT>
  303.     put_money(const _MoneyT& __mon, bool __intl = false)
  304.     { return { __mon, __intl }; }
  305.  
  306.   template<typename _CharT, typename _Traits, typename _MoneyT>
  307.     basic_ostream<_CharT, _Traits>&
  308.     operator<<(basic_ostream<_CharT, _Traits>& __os, _Put_money<_MoneyT> __f)
  309.     {
  310.       typename basic_ostream<_CharT, _Traits>::sentry __cerb(__os);
  311.       if (__cerb)
  312.         {
  313.           ios_base::iostate __err = ios_base::goodbit;
  314.           __try
  315.             {
  316.               typedef ostreambuf_iterator<_CharT, _Traits>   _Iter;
  317.               typedef money_put<_CharT, _Iter>               _MoneyPut;
  318.  
  319.               const _MoneyPut& __mp = use_facet<_MoneyPut>(__os.getloc());
  320.               if (__mp.put(_Iter(__os.rdbuf()), __f._M_intl, __os,
  321.                            __os.fill(), __f._M_mon).failed())
  322.                 __err |= ios_base::badbit;
  323.             }
  324.           __catch(__cxxabiv1::__forced_unwind&)
  325.             {
  326.               __os._M_setstate(ios_base::badbit);
  327.               __throw_exception_again;
  328.             }
  329.           __catch(...)
  330.             { __os._M_setstate(ios_base::badbit); }
  331.           if (__err)
  332.             __os.setstate(__err);
  333.         }
  334.       return __os;
  335.     }
  336.  
  337. #endif
  338.  
  339.   // Inhibit implicit instantiations for required instantiations,
  340.   // which are defined via explicit instantiations elsewhere.  
  341.   // NB:  This syntax is a GNU extension.
  342. #if _GLIBCXX_EXTERN_TEMPLATE
  343.   extern template ostream& operator<<(ostream&, _Setfill<char>);
  344.   extern template ostream& operator<<(ostream&, _Setiosflags);
  345.   extern template ostream& operator<<(ostream&, _Resetiosflags);
  346.   extern template ostream& operator<<(ostream&, _Setbase);
  347.   extern template ostream& operator<<(ostream&, _Setprecision);
  348.   extern template ostream& operator<<(ostream&, _Setw);
  349.   extern template istream& operator>>(istream&, _Setfill<char>);
  350.   extern template istream& operator>>(istream&, _Setiosflags);
  351.   extern template istream& operator>>(istream&, _Resetiosflags);
  352.   extern template istream& operator>>(istream&, _Setbase);
  353.   extern template istream& operator>>(istream&, _Setprecision);
  354.   extern template istream& operator>>(istream&, _Setw);
  355.  
  356. #ifdef _GLIBCXX_USE_WCHAR_T
  357.   extern template wostream& operator<<(wostream&, _Setfill<wchar_t>);
  358.   extern template wostream& operator<<(wostream&, _Setiosflags);
  359.   extern template wostream& operator<<(wostream&, _Resetiosflags);
  360.   extern template wostream& operator<<(wostream&, _Setbase);
  361.   extern template wostream& operator<<(wostream&, _Setprecision);
  362.   extern template wostream& operator<<(wostream&, _Setw);
  363.   extern template wistream& operator>>(wistream&, _Setfill<wchar_t>);
  364.   extern template wistream& operator>>(wistream&, _Setiosflags);
  365.   extern template wistream& operator>>(wistream&, _Resetiosflags);
  366.   extern template wistream& operator>>(wistream&, _Setbase);
  367.   extern template wistream& operator>>(wistream&, _Setprecision);
  368.   extern template wistream& operator>>(wistream&, _Setw);
  369. #endif
  370. #endif
  371.  
  372. _GLIBCXX_END_NAMESPACE_VERSION
  373. } // namespace
  374.  
  375. #endif /* _GLIBCXX_IOMANIP */
  376.