Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. // Iostreams base classes -*- 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 bits/basic_ios.h
  26.  *  This is an internal header file, included by other library headers.
  27.  *  Do not attempt to use it directly. @headername{ios}
  28.  */
  29.  
  30. #ifndef _BASIC_IOS_H
  31. #define _BASIC_IOS_H 1
  32.  
  33. #pragma GCC system_header
  34.  
  35. #include <bits/localefwd.h>
  36. #include <bits/locale_classes.h>
  37. #include <bits/locale_facets.h>
  38. #include <bits/streambuf_iterator.h>
  39.  
  40. namespace std _GLIBCXX_VISIBILITY(default)
  41. {
  42. _GLIBCXX_BEGIN_NAMESPACE_VERSION
  43.  
  44.   template<typename _Facet>
  45.     inline const _Facet&
  46.     __check_facet(const _Facet* __f)
  47.     {
  48.       if (!__f)
  49.         __throw_bad_cast();
  50.       return *__f;
  51.     }
  52.  
  53.   /**
  54.    *  @brief Template class basic_ios, virtual base class for all
  55.    *  stream classes.
  56.    *  @ingroup io
  57.    *
  58.    *  @tparam _CharT  Type of character stream.
  59.    *  @tparam _Traits  Traits for character type, defaults to
  60.    *                   char_traits<_CharT>.
  61.    *
  62.    *  Most of the member functions called dispatched on stream objects
  63.    *  (e.g., @c std::cout.foo(bar);) are consolidated in this class.
  64.   */
  65.   template<typename _CharT, typename _Traits>
  66.     class basic_ios : public ios_base
  67.     {
  68.     public:
  69.       //@{
  70.       /**
  71.        *  These are standard types.  They permit a standardized way of
  72.        *  referring to names of (or names dependent on) the template
  73.        *  parameters, which are specific to the implementation.
  74.       */
  75.       typedef _CharT                                 char_type;
  76.       typedef typename _Traits::int_type             int_type;
  77.       typedef typename _Traits::pos_type             pos_type;
  78.       typedef typename _Traits::off_type             off_type;
  79.       typedef _Traits                                traits_type;
  80.       //@}
  81.  
  82.       //@{
  83.       /**
  84.        *  These are non-standard types.
  85.       */
  86.       typedef ctype<_CharT>                          __ctype_type;
  87.       typedef num_put<_CharT, ostreambuf_iterator<_CharT, _Traits> >
  88.                                                      __num_put_type;
  89.       typedef num_get<_CharT, istreambuf_iterator<_CharT, _Traits> >
  90.                                                      __num_get_type;
  91.       //@}
  92.  
  93.       // Data members:
  94.     protected:
  95.       basic_ostream<_CharT, _Traits>*                _M_tie;
  96.       mutable char_type                              _M_fill;
  97.       mutable bool                                   _M_fill_init;
  98.       basic_streambuf<_CharT, _Traits>*              _M_streambuf;
  99.  
  100.       // Cached use_facet<ctype>, which is based on the current locale info.
  101.       const __ctype_type*                            _M_ctype;
  102.       // For ostream.
  103.       const __num_put_type*                          _M_num_put;
  104.       // For istream.
  105.       const __num_get_type*                          _M_num_get;
  106.  
  107.     public:
  108.       //@{
  109.       /**
  110.        *  @brief  The quick-and-easy status check.
  111.        *
  112.        *  This allows you to write constructs such as
  113.        *  <code>if (!a_stream) ...</code> and <code>while (a_stream) ...</code>
  114.       */
  115.       operator void*() const
  116.       { return this->fail() ? 0 : const_cast<basic_ios*>(this); }
  117.  
  118.       bool
  119.       operator!() const
  120.       { return this->fail(); }
  121.       //@}
  122.  
  123.       /**
  124.        *  @brief  Returns the error state of the stream buffer.
  125.        *  @return  A bit pattern (well, isn't everything?)
  126.        *
  127.        *  See std::ios_base::iostate for the possible bit values.  Most
  128.        *  users will call one of the interpreting wrappers, e.g., good().
  129.       */
  130.       iostate
  131.       rdstate() const
  132.       { return _M_streambuf_state; }
  133.  
  134.       /**
  135.        *  @brief  [Re]sets the error state.
  136.        *  @param  __state  The new state flag(s) to set.
  137.        *
  138.        *  See std::ios_base::iostate for the possible bit values.  Most
  139.        *  users will not need to pass an argument.
  140.       */
  141.       void
  142.       clear(iostate __state = goodbit);
  143.  
  144.       /**
  145.        *  @brief  Sets additional flags in the error state.
  146.        *  @param  __state  The additional state flag(s) to set.
  147.        *
  148.        *  See std::ios_base::iostate for the possible bit values.
  149.       */
  150.       void
  151.       setstate(iostate __state)
  152.       { this->clear(this->rdstate() | __state); }
  153.  
  154.       // Flip the internal state on for the proper state bits, then re
  155.       // throws the propagated exception if bit also set in
  156.       // exceptions().
  157.       void
  158.       _M_setstate(iostate __state)
  159.       {
  160.         // 27.6.1.2.1 Common requirements.
  161.         // Turn this on without causing an ios::failure to be thrown.
  162.         _M_streambuf_state |= __state;
  163.         if (this->exceptions() & __state)
  164.           __throw_exception_again;
  165.       }
  166.  
  167.       /**
  168.        *  @brief  Fast error checking.
  169.        *  @return  True if no error flags are set.
  170.        *
  171.        *  A wrapper around rdstate.
  172.       */
  173.       bool
  174.       good() const
  175.       { return this->rdstate() == 0; }
  176.  
  177.       /**
  178.        *  @brief  Fast error checking.
  179.        *  @return  True if the eofbit is set.
  180.        *
  181.        *  Note that other iostate flags may also be set.
  182.       */
  183.       bool
  184.       eof() const
  185.       { return (this->rdstate() & eofbit) != 0; }
  186.  
  187.       /**
  188.        *  @brief  Fast error checking.
  189.        *  @return  True if either the badbit or the failbit is set.
  190.        *
  191.        *  Checking the badbit in fail() is historical practice.
  192.        *  Note that other iostate flags may also be set.
  193.       */
  194.       bool
  195.       fail() const
  196.       { return (this->rdstate() & (badbit | failbit)) != 0; }
  197.  
  198.       /**
  199.        *  @brief  Fast error checking.
  200.        *  @return  True if the badbit is set.
  201.        *
  202.        *  Note that other iostate flags may also be set.
  203.       */
  204.       bool
  205.       bad() const
  206.       { return (this->rdstate() & badbit) != 0; }
  207.  
  208.       /**
  209.        *  @brief  Throwing exceptions on errors.
  210.        *  @return  The current exceptions mask.
  211.        *
  212.        *  This changes nothing in the stream.  See the one-argument version
  213.        *  of exceptions(iostate) for the meaning of the return value.
  214.       */
  215.       iostate
  216.       exceptions() const
  217.       { return _M_exception; }
  218.  
  219.       /**
  220.        *  @brief  Throwing exceptions on errors.
  221.        *  @param  __except  The new exceptions mask.
  222.        *
  223.        *  By default, error flags are set silently.  You can set an
  224.        *  exceptions mask for each stream; if a bit in the mask becomes set
  225.        *  in the error flags, then an exception of type
  226.        *  std::ios_base::failure is thrown.
  227.        *
  228.        *  If the error flag is already set when the exceptions mask is
  229.        *  added, the exception is immediately thrown.  Try running the
  230.        *  following under GCC 3.1 or later:
  231.        *  @code
  232.        *  #include <iostream>
  233.        *  #include <fstream>
  234.        *  #include <exception>
  235.        *
  236.        *  int main()
  237.        *  {
  238.        *      std::set_terminate (__gnu_cxx::__verbose_terminate_handler);
  239.        *
  240.        *      std::ifstream f ("/etc/motd");
  241.        *
  242.        *      std::cerr << "Setting badbit\n";
  243.        *      f.setstate (std::ios_base::badbit);
  244.        *
  245.        *      std::cerr << "Setting exception mask\n";
  246.        *      f.exceptions (std::ios_base::badbit);
  247.        *  }
  248.        *  @endcode
  249.       */
  250.       void
  251.       exceptions(iostate __except)
  252.       {
  253.         _M_exception = __except;
  254.         this->clear(_M_streambuf_state);
  255.       }
  256.  
  257.       // Constructor/destructor:
  258.       /**
  259.        *  @brief  Constructor performs initialization.
  260.        *
  261.        *  The parameter is passed by derived streams.
  262.       */
  263.       explicit
  264.       basic_ios(basic_streambuf<_CharT, _Traits>* __sb)
  265.       : ios_base(), _M_tie(0), _M_fill(), _M_fill_init(false), _M_streambuf(0),
  266.         _M_ctype(0), _M_num_put(0), _M_num_get(0)
  267.       { this->init(__sb); }
  268.  
  269.       /**
  270.        *  @brief  Empty.
  271.        *
  272.        *  The destructor does nothing.  More specifically, it does not
  273.        *  destroy the streambuf held by rdbuf().
  274.       */
  275.       virtual
  276.       ~basic_ios() { }
  277.  
  278.       // Members:
  279.       /**
  280.        *  @brief  Fetches the current @e tied stream.
  281.        *  @return  A pointer to the tied stream, or NULL if the stream is
  282.        *           not tied.
  283.        *
  284.        *  A stream may be @e tied (or synchronized) to a second output
  285.        *  stream.  When this stream performs any I/O, the tied stream is
  286.        *  first flushed.  For example, @c std::cin is tied to @c std::cout.
  287.       */
  288.       basic_ostream<_CharT, _Traits>*
  289.       tie() const
  290.       { return _M_tie; }
  291.  
  292.       /**
  293.        *  @brief  Ties this stream to an output stream.
  294.        *  @param  __tiestr  The output stream.
  295.        *  @return  The previously tied output stream, or NULL if the stream
  296.        *           was not tied.
  297.        *
  298.        *  This sets up a new tie; see tie() for more.
  299.       */
  300.       basic_ostream<_CharT, _Traits>*
  301.       tie(basic_ostream<_CharT, _Traits>* __tiestr)
  302.       {
  303.         basic_ostream<_CharT, _Traits>* __old = _M_tie;
  304.         _M_tie = __tiestr;
  305.         return __old;
  306.       }
  307.  
  308.       /**
  309.        *  @brief  Accessing the underlying buffer.
  310.        *  @return  The current stream buffer.
  311.        *
  312.        *  This does not change the state of the stream.
  313.       */
  314.       basic_streambuf<_CharT, _Traits>*
  315.       rdbuf() const
  316.       { return _M_streambuf; }
  317.  
  318.       /**
  319.        *  @brief  Changing the underlying buffer.
  320.        *  @param  __sb  The new stream buffer.
  321.        *  @return  The previous stream buffer.
  322.        *
  323.        *  Associates a new buffer with the current stream, and clears the
  324.        *  error state.
  325.        *
  326.        *  Due to historical accidents which the LWG refuses to correct, the
  327.        *  I/O library suffers from a design error:  this function is hidden
  328.        *  in derived classes by overrides of the zero-argument @c rdbuf(),
  329.        *  which is non-virtual for hysterical raisins.  As a result, you
  330.        *  must use explicit qualifications to access this function via any
  331.        *  derived class.  For example:
  332.        *
  333.        *  @code
  334.        *  std::fstream     foo;         // or some other derived type
  335.        *  std::streambuf*  p = .....;
  336.        *
  337.        *  foo.ios::rdbuf(p);            // ios == basic_ios<char>
  338.        *  @endcode
  339.       */
  340.       basic_streambuf<_CharT, _Traits>*
  341.       rdbuf(basic_streambuf<_CharT, _Traits>* __sb);
  342.  
  343.       /**
  344.        *  @brief  Copies fields of __rhs into this.
  345.        *  @param  __rhs  The source values for the copies.
  346.        *  @return  Reference to this object.
  347.        *
  348.        *  All fields of __rhs are copied into this object except that rdbuf()
  349.        *  and rdstate() remain unchanged.  All values in the pword and iword
  350.        *  arrays are copied.  Before copying, each callback is invoked with
  351.        *  erase_event.  After copying, each (new) callback is invoked with
  352.        *  copyfmt_event.  The final step is to copy exceptions().
  353.       */
  354.       basic_ios&
  355.       copyfmt(const basic_ios& __rhs);
  356.  
  357.       /**
  358.        *  @brief  Retrieves the @a empty character.
  359.        *  @return  The current fill character.
  360.        *
  361.        *  It defaults to a space (' ') in the current locale.
  362.       */
  363.       char_type
  364.       fill() const
  365.       {
  366.         if (!_M_fill_init)
  367.           {
  368.             _M_fill = this->widen(' ');
  369.             _M_fill_init = true;
  370.           }
  371.         return _M_fill;
  372.       }
  373.  
  374.       /**
  375.        *  @brief  Sets a new @a empty character.
  376.        *  @param  __ch  The new character.
  377.        *  @return  The previous fill character.
  378.        *
  379.        *  The fill character is used to fill out space when P+ characters
  380.        *  have been requested (e.g., via setw), Q characters are actually
  381.        *  used, and Q<P.  It defaults to a space (' ') in the current locale.
  382.       */
  383.       char_type
  384.       fill(char_type __ch)
  385.       {
  386.         char_type __old = this->fill();
  387.         _M_fill = __ch;
  388.         return __old;
  389.       }
  390.  
  391.       // Locales:
  392.       /**
  393.        *  @brief  Moves to a new locale.
  394.        *  @param  __loc  The new locale.
  395.        *  @return  The previous locale.
  396.        *
  397.        *  Calls @c ios_base::imbue(loc), and if a stream buffer is associated
  398.        *  with this stream, calls that buffer's @c pubimbue(loc).
  399.        *
  400.        *  Additional l10n notes are at
  401.        *  http://gcc.gnu.org/onlinedocs/libstdc++/manual/localization.html
  402.       */
  403.       locale
  404.       imbue(const locale& __loc);
  405.  
  406.       /**
  407.        *  @brief  Squeezes characters.
  408.        *  @param  __c  The character to narrow.
  409.        *  @param  __dfault  The character to narrow.
  410.        *  @return  The narrowed character.
  411.        *
  412.        *  Maps a character of @c char_type to a character of @c char,
  413.        *  if possible.
  414.        *
  415.        *  Returns the result of
  416.        *  @code
  417.        *    std::use_facet<ctype<char_type> >(getloc()).narrow(c,dfault)
  418.        *  @endcode
  419.        *
  420.        *  Additional l10n notes are at
  421.        *  http://gcc.gnu.org/onlinedocs/libstdc++/manual/localization.html
  422.       */
  423.       char
  424.       narrow(char_type __c, char __dfault) const
  425.       { return __check_facet(_M_ctype).narrow(__c, __dfault); }
  426.  
  427.       /**
  428.        *  @brief  Widens characters.
  429.        *  @param  __c  The character to widen.
  430.        *  @return  The widened character.
  431.        *
  432.        *  Maps a character of @c char to a character of @c char_type.
  433.        *
  434.        *  Returns the result of
  435.        *  @code
  436.        *    std::use_facet<ctype<char_type> >(getloc()).widen(c)
  437.        *  @endcode
  438.        *
  439.        *  Additional l10n notes are at
  440.        *  http://gcc.gnu.org/onlinedocs/libstdc++/manual/localization.html
  441.       */
  442.       char_type
  443.       widen(char __c) const
  444.       { return __check_facet(_M_ctype).widen(__c); }
  445.  
  446.     protected:
  447.       // 27.4.5.1  basic_ios constructors
  448.       /**
  449.        *  @brief  Empty.
  450.        *
  451.        *  The default constructor does nothing and is not normally
  452.        *  accessible to users.
  453.       */
  454.       basic_ios()
  455.       : ios_base(), _M_tie(0), _M_fill(char_type()), _M_fill_init(false),
  456.         _M_streambuf(0), _M_ctype(0), _M_num_put(0), _M_num_get(0)
  457.       { }
  458.  
  459.       /**
  460.        *  @brief  All setup is performed here.
  461.        *
  462.        *  This is called from the public constructor.  It is not virtual and
  463.        *  cannot be redefined.
  464.       */
  465.       void
  466.       init(basic_streambuf<_CharT, _Traits>* __sb);
  467.  
  468.       void
  469.       _M_cache_locale(const locale& __loc);
  470.     };
  471.  
  472. _GLIBCXX_END_NAMESPACE_VERSION
  473. } // namespace
  474.  
  475. #include <bits/basic_ios.tcc>
  476.  
  477. #endif /* _BASIC_IOS_H */
  478.