home *** CD-ROM | disk | FTP | other *** search
/ Beginning C++ Through Gam…rogramming (2nd Edition) / BCGP2E.ISO / bloodshed / devcpp-4.9.9.2_setup.exe / iomanip < prev    next >
Text File  |  2005-01-29  |  9KB  |  301 lines

  1. // Standard stream manipulators -*- C++ -*-
  2.  
  3. // Copyright (C) 1997, 1998, 1999, 2001, 2002, 2003
  4. // Free Software Foundation, Inc.
  5. //
  6. // This file is part of the GNU ISO C++ Library.  This library is free
  7. // software; you can redistribute it and/or modify it under the
  8. // terms of the GNU General Public License as published by the
  9. // Free Software Foundation; either version 2, or (at your option)
  10. // any later version.
  11.  
  12. // This library is distributed in the hope that it will be useful,
  13. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. // GNU General Public License for more details.
  16.  
  17. // You should have received a copy of the GNU General Public License along
  18. // with this library; see the file COPYING.  If not, write to the Free
  19. // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
  20. // USA.
  21.  
  22. // As a special exception, you may use this file as part of a free software
  23. // library without restriction.  Specifically, if other files instantiate
  24. // templates or use macros or inline functions from this file, or you compile
  25. // this file and link it with other files to produce an executable, this
  26. // file does not by itself cause the resulting executable to be covered by
  27. // the GNU General Public License.  This exception does not however
  28. // invalidate any other reasons why the executable file might be covered by
  29. // the GNU General Public License.
  30.  
  31. //
  32. // ISO C++ 14882: 27.6.3  Standard manipulators
  33. //
  34.  
  35. /** @file iomanip
  36.  *  This is a Standard C++ Library header.  You should @c #include this header
  37.  *  in your programs, rather than any of the "st[dl]_*.h" implementation files.
  38.  */
  39.  
  40. #ifndef _GLIBCXX_IOMANIP
  41. #define _GLIBCXX_IOMANIP 1
  42.  
  43. #pragma GCC system_header
  44.  
  45. #include <bits/c++config.h>
  46. #include <istream>
  47. #include <functional>
  48.  
  49. namespace std
  50. {
  51.   // [27.6.3] standard manipulators
  52.   // Also see DR 183.
  53.  
  54.   struct _Resetiosflags { ios_base::fmtflags _M_mask; };
  55.  
  56.   /**
  57.    *  @brief  Manipulator for @c setf.
  58.    *  @param  mask  A format flags mask.
  59.    *
  60.    *  Sent to a stream object, this manipulator resets the specified flags,
  61.    *  via @e stream.setf(0,mask).
  62.   */
  63.   inline _Resetiosflags 
  64.   resetiosflags(ios_base::fmtflags __mask)
  65.   { 
  66.     _Resetiosflags __x; 
  67.     __x._M_mask = __mask; 
  68.     return __x; 
  69.   }
  70.  
  71.   template<typename _CharT, typename _Traits>
  72.     inline basic_istream<_CharT,_Traits>& 
  73.     operator>>(basic_istream<_CharT,_Traits>& __is, _Resetiosflags __f)
  74.     { 
  75.       __is.setf(ios_base::fmtflags(0), __f._M_mask); 
  76.       return __is; 
  77.     }
  78.  
  79.   template<typename _CharT, typename _Traits>
  80.     inline basic_ostream<_CharT,_Traits>& 
  81.     operator<<(basic_ostream<_CharT,_Traits>& __os, _Resetiosflags __f)
  82.     { 
  83.       __os.setf(ios_base::fmtflags(0), __f._M_mask); 
  84.       return __os; 
  85.     }
  86.  
  87.  
  88.   struct _Setiosflags { ios_base::fmtflags _M_mask; };
  89.  
  90.   /**
  91.    *  @brief  Manipulator for @c setf.
  92.    *  @param  mask  A format flags mask.
  93.    *
  94.    *  Sent to a stream object, this manipulator sets the format flags
  95.    *  to @a mask.
  96.   */
  97.   inline _Setiosflags 
  98.   setiosflags(ios_base::fmtflags __mask)
  99.   { 
  100.     _Setiosflags __x; 
  101.     __x._M_mask = __mask; 
  102.     return __x; 
  103.   }
  104.  
  105.   template<typename _CharT, typename _Traits>
  106.     inline basic_istream<_CharT,_Traits>& 
  107.     operator>>(basic_istream<_CharT,_Traits>& __is, _Setiosflags __f)
  108.     { 
  109.       __is.setf(__f._M_mask); 
  110.       return __is; 
  111.     }
  112.  
  113.   template<typename _CharT, typename _Traits>
  114.     inline basic_ostream<_CharT,_Traits>& 
  115.     operator<<(basic_ostream<_CharT,_Traits>& __os, _Setiosflags __f)
  116.     { 
  117.       __os.setf(__f._M_mask); 
  118.       return __os; 
  119.     }
  120.  
  121.  
  122.   struct _Setbase { int _M_base; };
  123.  
  124.   /**
  125.    *  @brief  Manipulator for @c setf.
  126.    *  @param  base  A numeric base.
  127.    *
  128.    *  Sent to a stream object, this manipulator changes the
  129.    *  @c ios_base::basefield flags to @c oct, @c dec, or @c hex when @a base
  130.    *  is 8, 10, or 16, accordingly, and to 0 if @a base is any other value.
  131.   */
  132.   inline _Setbase 
  133.   setbase(int __base)
  134.   { 
  135.     _Setbase __x; 
  136.     __x._M_base = __base; 
  137.     return __x; 
  138.   }
  139.  
  140.   template<typename _CharT, typename _Traits>
  141.     inline basic_istream<_CharT,_Traits>& 
  142.     operator>>(basic_istream<_CharT,_Traits>& __is, _Setbase __f)
  143.     {
  144.       __is.setf(__f._M_base ==  8 ? ios_base::oct : 
  145.           __f._M_base == 10 ? ios_base::dec : 
  146.           __f._M_base == 16 ? ios_base::hex : 
  147.           ios_base::fmtflags(0), ios_base::basefield);
  148.       return __is; 
  149.     }
  150.   
  151.   template<typename _CharT, typename _Traits>
  152.     inline basic_ostream<_CharT,_Traits>& 
  153.     operator<<(basic_ostream<_CharT,_Traits>& __os, _Setbase __f)
  154.     {
  155.       __os.setf(__f._M_base ==  8 ? ios_base::oct : 
  156.         __f._M_base == 10 ? ios_base::dec : 
  157.         __f._M_base == 16 ? ios_base::hex : 
  158.         ios_base::fmtflags(0), ios_base::basefield);
  159.       return __os; 
  160.     }
  161.   
  162.  
  163.   template<typename _CharT> 
  164.     struct _Setfill { _CharT _M_c; };
  165.  
  166.   /**
  167.    *  @brief  Manipulator for @c fill.
  168.    *  @param  c  The new fill character.
  169.    *
  170.    *  Sent to a stream object, this manipulator calls @c fill(c) for that
  171.    *  object.
  172.   */
  173.   template<typename _CharT> 
  174.     inline _Setfill<_CharT> 
  175.     setfill(_CharT __c)
  176.     { 
  177.       _Setfill<_CharT> __x; 
  178.       __x._M_c = __c; 
  179.       return __x; 
  180.     }
  181.  
  182.   template<typename _CharT, typename _Traits>
  183.     inline basic_istream<_CharT,_Traits>& 
  184.     operator>>(basic_istream<_CharT,_Traits>& __is, _Setfill<_CharT> __f)
  185.     { 
  186.       __is.fill(__f._M_c); 
  187.       return __is; 
  188.     }
  189.  
  190.   template<typename _CharT, typename _Traits>
  191.     inline basic_ostream<_CharT,_Traits>& 
  192.     operator<<(basic_ostream<_CharT,_Traits>& __os, _Setfill<_CharT> __f)
  193.     { 
  194.       __os.fill(__f._M_c); 
  195.       return __os; 
  196.     }
  197.  
  198.  
  199.   struct _Setprecision { int _M_n; };
  200.  
  201.   /**
  202.    *  @brief  Manipulator for @c precision.
  203.    *  @param  n  The new precision.
  204.    *
  205.    *  Sent to a stream object, this manipulator calls @c precision(n) for
  206.    *  that object.
  207.   */
  208.   inline _Setprecision 
  209.   setprecision(int __n)
  210.   { 
  211.     _Setprecision __x; 
  212.     __x._M_n = __n; 
  213.     return __x; 
  214.   }
  215.  
  216.   template<typename _CharT, typename _Traits>
  217.     inline basic_istream<_CharT,_Traits>& 
  218.     operator>>(basic_istream<_CharT,_Traits>& __is, _Setprecision __f)
  219.     { 
  220.       __is.precision(__f._M_n); 
  221.       return __is; 
  222.     }
  223.  
  224.   template<typename _CharT, typename _Traits>
  225.     inline basic_ostream<_CharT,_Traits>& 
  226.     operator<<(basic_ostream<_CharT,_Traits>& __os, _Setprecision __f)
  227.     { 
  228.       __os.precision(__f._M_n); 
  229.       return __os; 
  230.     }
  231.  
  232.  
  233.   struct _Setw { int _M_n; };
  234.  
  235.   /**
  236.    *  @brief  Manipulator for @c width.
  237.    *  @param  n  The new width.
  238.    *
  239.    *  Sent to a stream object, this manipulator calls @c width(n) for
  240.    *  that object.
  241.   */
  242.   inline _Setw 
  243.   setw(int __n)
  244.   { 
  245.     _Setw __x; 
  246.     __x._M_n = __n; 
  247.     return __x; 
  248.   }
  249.  
  250.   template<typename _CharT, typename _Traits>
  251.     inline basic_istream<_CharT,_Traits>& 
  252.     operator>>(basic_istream<_CharT,_Traits>& __is, _Setw __f)
  253.     { 
  254.       __is.width(__f._M_n); 
  255.       return __is; 
  256.     }
  257.  
  258.   template<typename _CharT, typename _Traits>
  259.     inline basic_ostream<_CharT,_Traits>& 
  260.     operator<<(basic_ostream<_CharT,_Traits>& __os, _Setw __f)
  261.     { 
  262.       __os.width(__f._M_n); 
  263.       return __os; 
  264.     }
  265.  
  266.   // Inhibit implicit instantiations for required instantiations,
  267.   // which are defined via explicit instantiations elsewhere.  
  268.   // NB:  This syntax is a GNU extension.
  269. #if _GLIBCXX_EXTERN_TEMPLATE
  270.   extern template ostream& operator<<(ostream&, _Setfill<char>);
  271.   extern template ostream& operator<<(ostream&, _Setiosflags);
  272.   extern template ostream& operator<<(ostream&, _Resetiosflags);
  273.   extern template ostream& operator<<(ostream&, _Setbase);
  274.   extern template ostream& operator<<(ostream&, _Setprecision);
  275.   extern template ostream& operator<<(ostream&, _Setw);
  276.   extern template istream& operator>>(istream&, _Setfill<char>);
  277.   extern template istream& operator>>(istream&, _Setiosflags);
  278.   extern template istream& operator>>(istream&, _Resetiosflags);
  279.   extern template istream& operator>>(istream&, _Setbase);
  280.   extern template istream& operator>>(istream&, _Setprecision);
  281.   extern template istream& operator>>(istream&, _Setw);
  282.  
  283. #ifdef _GLIBCXX_USE_WCHAR_T
  284.   extern template wostream& operator<<(wostream&, _Setfill<wchar_t>);
  285.   extern template wostream& operator<<(wostream&, _Setiosflags);
  286.   extern template wostream& operator<<(wostream&, _Resetiosflags);
  287.   extern template wostream& operator<<(wostream&, _Setbase);
  288.   extern template wostream& operator<<(wostream&, _Setprecision);
  289.   extern template wostream& operator<<(wostream&, _Setw);
  290.   extern template wistream& operator>>(wistream&, _Setfill<wchar_t>);
  291.   extern template wistream& operator>>(wistream&, _Setiosflags);
  292.   extern template wistream& operator>>(wistream&, _Resetiosflags);
  293.   extern template wistream& operator>>(wistream&, _Setbase);
  294.   extern template wistream& operator>>(wistream&, _Setprecision);
  295.   extern template wistream& operator>>(wistream&, _Setw);
  296. #endif
  297. #endif
  298. } // namespace std
  299.  
  300. #endif /* _GLIBCXX_IOMANIP */
  301.