Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. // Input streams -*- C++ -*-
  2.  
  3. // Copyright (C) 1997-2015 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. //
  26. // ISO C++ 14882: 27.6.1  Input streams
  27. //
  28.  
  29. /** @file include/istream
  30.  *  This is a Standard C++ Library header.
  31.  */
  32.  
  33. #ifndef _GLIBCXX_ISTREAM
  34. #define _GLIBCXX_ISTREAM 1
  35.  
  36. #pragma GCC system_header
  37.  
  38. #include <ios>
  39. #include <ostream>
  40.  
  41. namespace std _GLIBCXX_VISIBILITY(default)
  42. {
  43. _GLIBCXX_BEGIN_NAMESPACE_VERSION
  44.  
  45.   /**
  46.    *  @brief  Template class basic_istream.
  47.    *  @ingroup io
  48.    *
  49.    *  @tparam _CharT  Type of character stream.
  50.    *  @tparam _Traits  Traits for character type, defaults to
  51.    *                   char_traits<_CharT>.
  52.    *
  53.    *  This is the base class for all input streams.  It provides text
  54.    *  formatting of all builtin types, and communicates with any class
  55.    *  derived from basic_streambuf to do the actual input.
  56.   */
  57.   template<typename _CharT, typename _Traits>
  58.     class basic_istream : virtual public basic_ios<_CharT, _Traits>
  59.     {
  60.     public:
  61.       // Types (inherited from basic_ios (27.4.4)):
  62.       typedef _CharT                                    char_type;
  63.       typedef typename _Traits::int_type                int_type;
  64.       typedef typename _Traits::pos_type                pos_type;
  65.       typedef typename _Traits::off_type                off_type;
  66.       typedef _Traits                                   traits_type;
  67.  
  68.       // Non-standard Types:
  69.       typedef basic_streambuf<_CharT, _Traits>          __streambuf_type;
  70.       typedef basic_ios<_CharT, _Traits>                __ios_type;
  71.       typedef basic_istream<_CharT, _Traits>            __istream_type;
  72.       typedef num_get<_CharT, istreambuf_iterator<_CharT, _Traits> >
  73.                                                         __num_get_type;
  74.       typedef ctype<_CharT>                             __ctype_type;
  75.  
  76.     protected:
  77.       // Data Members:
  78.       /**
  79.        *  The number of characters extracted in the previous unformatted
  80.        *  function; see gcount().
  81.       */
  82.       streamsize                _M_gcount;
  83.  
  84.     public:
  85.       /**
  86.        *  @brief  Base constructor.
  87.        *
  88.        *  This ctor is almost never called by the user directly, rather from
  89.        *  derived classes' initialization lists, which pass a pointer to
  90.        *  their own stream buffer.
  91.       */
  92.       explicit
  93.       basic_istream(__streambuf_type* __sb)
  94.       : _M_gcount(streamsize(0))
  95.       { this->init(__sb); }
  96.  
  97.       /**
  98.        *  @brief  Base destructor.
  99.        *
  100.        *  This does very little apart from providing a virtual base dtor.
  101.       */
  102.       virtual
  103.       ~basic_istream()
  104.       { _M_gcount = streamsize(0); }
  105.  
  106.       /// Safe prefix/suffix operations.
  107.       class sentry;
  108.       friend class sentry;
  109.  
  110.       //@{
  111.       /**
  112.        *  @brief  Interface for manipulators.
  113.        *
  114.        *  Manipulators such as @c std::ws and @c std::dec use these
  115.        *  functions in constructs like
  116.        *  <code>std::cin >> std::ws</code>.
  117.        *  For more information, see the iomanip header.
  118.       */
  119.       __istream_type&
  120.       operator>>(__istream_type& (*__pf)(__istream_type&))
  121.       { return __pf(*this); }
  122.  
  123.       __istream_type&
  124.       operator>>(__ios_type& (*__pf)(__ios_type&))
  125.       {
  126.         __pf(*this);
  127.         return *this;
  128.       }
  129.  
  130.       __istream_type&
  131.       operator>>(ios_base& (*__pf)(ios_base&))
  132.       {
  133.         __pf(*this);
  134.         return *this;
  135.       }
  136.       //@}
  137.  
  138.       //@{
  139.       /**
  140.        *  @name Extractors
  141.        *
  142.        *  All the @c operator>> functions (aka <em>formatted input
  143.        *  functions</em>) have some common behavior.  Each starts by
  144.        *  constructing a temporary object of type std::basic_istream::sentry
  145.        *  with the second argument (noskipws) set to false.  This has several
  146.        *  effects, concluding with the setting of a status flag; see the
  147.        *  sentry documentation for more.
  148.        *
  149.        *  If the sentry status is good, the function tries to extract
  150.        *  whatever data is appropriate for the type of the argument.
  151.        *
  152.        *  If an exception is thrown during extraction, ios_base::badbit
  153.        *  will be turned on in the stream's error state without causing an
  154.        *  ios_base::failure to be thrown.  The original exception will then
  155.        *  be rethrown.
  156.       */
  157.  
  158.       //@{
  159.       /**
  160.        *  @brief  Integer arithmetic extractors
  161.        *  @param  __n A variable of builtin integral type.
  162.        *  @return  @c *this if successful
  163.        *
  164.        *  These functions use the stream's current locale (specifically, the
  165.        *  @c num_get facet) to parse the input data.
  166.       */
  167.       __istream_type&
  168.       operator>>(bool& __n)
  169.       { return _M_extract(__n); }
  170.  
  171.       __istream_type&
  172.       operator>>(short& __n);
  173.  
  174.       __istream_type&
  175.       operator>>(unsigned short& __n)
  176.       { return _M_extract(__n); }
  177.  
  178.       __istream_type&
  179.       operator>>(int& __n);
  180.  
  181.       __istream_type&
  182.       operator>>(unsigned int& __n)
  183.       { return _M_extract(__n); }
  184.  
  185.       __istream_type&
  186.       operator>>(long& __n)
  187.       { return _M_extract(__n); }
  188.  
  189.       __istream_type&
  190.       operator>>(unsigned long& __n)
  191.       { return _M_extract(__n); }
  192.  
  193. #ifdef _GLIBCXX_USE_LONG_LONG
  194.       __istream_type&
  195.       operator>>(long long& __n)
  196.       { return _M_extract(__n); }
  197.  
  198.       __istream_type&
  199.       operator>>(unsigned long long& __n)
  200.       { return _M_extract(__n); }
  201. #endif
  202.       //@}
  203.  
  204.       //@{
  205.       /**
  206.        *  @brief  Floating point arithmetic extractors
  207.        *  @param  __f A variable of builtin floating point type.
  208.        *  @return  @c *this if successful
  209.        *
  210.        *  These functions use the stream's current locale (specifically, the
  211.        *  @c num_get facet) to parse the input data.
  212.       */
  213.       __istream_type&
  214.       operator>>(float& __f)
  215.       { return _M_extract(__f); }
  216.  
  217.       __istream_type&
  218.       operator>>(double& __f)
  219.       { return _M_extract(__f); }
  220.  
  221.       __istream_type&
  222.       operator>>(long double& __f)
  223.       { return _M_extract(__f); }
  224.       //@}
  225.  
  226.       /**
  227.        *  @brief  Basic arithmetic extractors
  228.        *  @param  __p A variable of pointer type.
  229.        *  @return  @c *this if successful
  230.        *
  231.        *  These functions use the stream's current locale (specifically, the
  232.        *  @c num_get facet) to parse the input data.
  233.       */
  234.       __istream_type&
  235.       operator>>(void*& __p)
  236.       { return _M_extract(__p); }
  237.  
  238.       /**
  239.        *  @brief  Extracting into another streambuf.
  240.        *  @param  __sb  A pointer to a streambuf
  241.        *
  242.        *  This function behaves like one of the basic arithmetic extractors,
  243.        *  in that it also constructs a sentry object and has the same error
  244.        *  handling behavior.
  245.        *
  246.        *  If @p __sb is NULL, the stream will set failbit in its error state.
  247.        *
  248.        *  Characters are extracted from this stream and inserted into the
  249.        *  @p __sb streambuf until one of the following occurs:
  250.        *
  251.        *  - the input stream reaches end-of-file,
  252.        *  - insertion into the output buffer fails (in this case, the
  253.        *    character that would have been inserted is not extracted), or
  254.        *  - an exception occurs (and in this case is caught)
  255.        *
  256.        *  If the function inserts no characters, failbit is set.
  257.       */
  258.       __istream_type&
  259.       operator>>(__streambuf_type* __sb);
  260.       //@}
  261.  
  262.       // [27.6.1.3] unformatted input
  263.       /**
  264.        *  @brief  Character counting
  265.        *  @return  The number of characters extracted by the previous
  266.        *           unformatted input function dispatched for this stream.
  267.       */
  268.       streamsize
  269.       gcount() const
  270.       { return _M_gcount; }
  271.  
  272.       //@{
  273.       /**
  274.        *  @name Unformatted Input Functions
  275.        *
  276.        *  All the unformatted input functions have some common behavior.
  277.        *  Each starts by constructing a temporary object of type
  278.        *  std::basic_istream::sentry with the second argument (noskipws)
  279.        *  set to true.  This has several effects, concluding with the
  280.        *  setting of a status flag; see the sentry documentation for more.
  281.        *
  282.        *  If the sentry status is good, the function tries to extract
  283.        *  whatever data is appropriate for the type of the argument.
  284.        *
  285.        *  The number of characters extracted is stored for later retrieval
  286.        *  by gcount().
  287.        *
  288.        *  If an exception is thrown during extraction, ios_base::badbit
  289.        *  will be turned on in the stream's error state without causing an
  290.        *  ios_base::failure to be thrown.  The original exception will then
  291.        *  be rethrown.
  292.       */
  293.  
  294.       /**
  295.        *  @brief  Simple extraction.
  296.        *  @return  A character, or eof().
  297.        *
  298.        *  Tries to extract a character.  If none are available, sets failbit
  299.        *  and returns traits::eof().
  300.       */
  301.       int_type
  302.       get();
  303.  
  304.       /**
  305.        *  @brief  Simple extraction.
  306.        *  @param  __c  The character in which to store data.
  307.        *  @return  *this
  308.        *
  309.        *  Tries to extract a character and store it in @a __c.  If none are
  310.        *  available, sets failbit and returns traits::eof().
  311.        *
  312.        *  @note  This function is not overloaded on signed char and
  313.        *         unsigned char.
  314.       */
  315.       __istream_type&
  316.       get(char_type& __c);
  317.  
  318.       /**
  319.        *  @brief  Simple multiple-character extraction.
  320.        *  @param  __s  Pointer to an array.
  321.        *  @param  __n  Maximum number of characters to store in @a __s.
  322.        *  @param  __delim  A "stop" character.
  323.        *  @return  *this
  324.        *
  325.        *  Characters are extracted and stored into @a __s until one of the
  326.        *  following happens:
  327.        *
  328.        *  - @c __n-1 characters are stored
  329.        *  - the input sequence reaches EOF
  330.        *  - the next character equals @a __delim, in which case the character
  331.        *    is not extracted
  332.        *
  333.        * If no characters are stored, failbit is set in the stream's error
  334.        * state.
  335.        *
  336.        * In any case, a null character is stored into the next location in
  337.        * the array.
  338.        *
  339.        *  @note  This function is not overloaded on signed char and
  340.        *         unsigned char.
  341.       */
  342.       __istream_type&
  343.       get(char_type* __s, streamsize __n, char_type __delim);
  344.  
  345.       /**
  346.        *  @brief  Simple multiple-character extraction.
  347.        *  @param  __s  Pointer to an array.
  348.        *  @param  __n  Maximum number of characters to store in @a s.
  349.        *  @return  *this
  350.        *
  351.        *  Returns @c get(__s,__n,widen(&apos;\\n&apos;)).
  352.       */
  353.       __istream_type&
  354.       get(char_type* __s, streamsize __n)
  355.       { return this->get(__s, __n, this->widen('\n')); }
  356.  
  357.       /**
  358.        *  @brief  Extraction into another streambuf.
  359.        *  @param  __sb  A streambuf in which to store data.
  360.        *  @param  __delim  A "stop" character.
  361.        *  @return  *this
  362.        *
  363.        *  Characters are extracted and inserted into @a __sb until one of the
  364.        *  following happens:
  365.        *
  366.        *  - the input sequence reaches EOF
  367.        *  - insertion into the output buffer fails (in this case, the
  368.        *    character that would have been inserted is not extracted)
  369.        *  - the next character equals @a __delim (in this case, the character
  370.        *    is not extracted)
  371.        *  - an exception occurs (and in this case is caught)
  372.        *
  373.        * If no characters are stored, failbit is set in the stream's error
  374.        * state.
  375.       */
  376.       __istream_type&
  377.       get(__streambuf_type& __sb, char_type __delim);
  378.  
  379.       /**
  380.        *  @brief  Extraction into another streambuf.
  381.        *  @param  __sb  A streambuf in which to store data.
  382.        *  @return  *this
  383.        *
  384.        *  Returns @c get(__sb,widen(&apos;\\n&apos;)).
  385.       */
  386.       __istream_type&
  387.       get(__streambuf_type& __sb)
  388.       { return this->get(__sb, this->widen('\n')); }
  389.  
  390.       /**
  391.        *  @brief  String extraction.
  392.        *  @param  __s  A character array in which to store the data.
  393.        *  @param  __n  Maximum number of characters to extract.
  394.        *  @param  __delim  A "stop" character.
  395.        *  @return  *this
  396.        *
  397.        *  Extracts and stores characters into @a __s until one of the
  398.        *  following happens.  Note that these criteria are required to be
  399.        *  tested in the order listed here, to allow an input line to exactly
  400.        *  fill the @a __s array without setting failbit.
  401.        *
  402.        *  -# the input sequence reaches end-of-file, in which case eofbit
  403.        *     is set in the stream error state
  404.        *  -# the next character equals @c __delim, in which case the character
  405.        *     is extracted (and therefore counted in @c gcount()) but not stored
  406.        *  -# @c __n-1 characters are stored, in which case failbit is set
  407.        *     in the stream error state
  408.        *
  409.        *  If no characters are extracted, failbit is set.  (An empty line of
  410.        *  input should therefore not cause failbit to be set.)
  411.        *
  412.        *  In any case, a null character is stored in the next location in
  413.        *  the array.
  414.       */
  415.       __istream_type&
  416.       getline(char_type* __s, streamsize __n, char_type __delim);
  417.  
  418.       /**
  419.        *  @brief  String extraction.
  420.        *  @param  __s  A character array in which to store the data.
  421.        *  @param  __n  Maximum number of characters to extract.
  422.        *  @return  *this
  423.        *
  424.        *  Returns @c getline(__s,__n,widen(&apos;\\n&apos;)).
  425.       */
  426.       __istream_type&
  427.       getline(char_type* __s, streamsize __n)
  428.       { return this->getline(__s, __n, this->widen('\n')); }
  429.  
  430.       /**
  431.        *  @brief  Discarding characters
  432.        *  @param  __n  Number of characters to discard.
  433.        *  @param  __delim  A "stop" character.
  434.        *  @return  *this
  435.        *
  436.        *  Extracts characters and throws them away until one of the
  437.        *  following happens:
  438.        *  - if @a __n @c != @c std::numeric_limits<int>::max(), @a __n
  439.        *    characters are extracted
  440.        *  - the input sequence reaches end-of-file
  441.        *  - the next character equals @a __delim (in this case, the character
  442.        *    is extracted); note that this condition will never occur if
  443.        *    @a __delim equals @c traits::eof().
  444.        *
  445.        *  NB: Provide three overloads, instead of the single function
  446.        *  (with defaults) mandated by the Standard: this leads to a
  447.        *  better performing implementation, while still conforming to
  448.        *  the Standard.
  449.       */
  450.       __istream_type&
  451.       ignore(streamsize __n, int_type __delim);
  452.  
  453.       __istream_type&
  454.       ignore(streamsize __n);
  455.  
  456.       __istream_type&
  457.       ignore();
  458.  
  459.       /**
  460.        *  @brief  Looking ahead in the stream
  461.        *  @return  The next character, or eof().
  462.        *
  463.        *  If, after constructing the sentry object, @c good() is false,
  464.        *  returns @c traits::eof().  Otherwise reads but does not extract
  465.        *  the next input character.
  466.       */
  467.       int_type
  468.       peek();
  469.  
  470.       /**
  471.        *  @brief  Extraction without delimiters.
  472.        *  @param  __s  A character array.
  473.        *  @param  __n  Maximum number of characters to store.
  474.        *  @return  *this
  475.        *
  476.        *  If the stream state is @c good(), extracts characters and stores
  477.        *  them into @a __s until one of the following happens:
  478.        *  - @a __n characters are stored
  479.        *  - the input sequence reaches end-of-file, in which case the error
  480.        *    state is set to @c failbit|eofbit.
  481.        *
  482.        *  @note  This function is not overloaded on signed char and
  483.        *         unsigned char.
  484.       */
  485.       __istream_type&
  486.       read(char_type* __s, streamsize __n);
  487.  
  488.       /**
  489.        *  @brief  Extraction until the buffer is exhausted, but no more.
  490.        *  @param  __s  A character array.
  491.        *  @param  __n  Maximum number of characters to store.
  492.        *  @return  The number of characters extracted.
  493.        *
  494.        *  Extracts characters and stores them into @a __s depending on the
  495.        *  number of characters remaining in the streambuf's buffer,
  496.        *  @c rdbuf()->in_avail(), called @c A here:
  497.        *  - if @c A @c == @c -1, sets eofbit and extracts no characters
  498.        *  - if @c A @c == @c 0, extracts no characters
  499.        *  - if @c A @c > @c 0, extracts @c min(A,n)
  500.        *
  501.        *  The goal is to empty the current buffer, and to not request any
  502.        *  more from the external input sequence controlled by the streambuf.
  503.       */
  504.       streamsize
  505.       readsome(char_type* __s, streamsize __n);
  506.  
  507.       /**
  508.        *  @brief  Unextracting a single character.
  509.        *  @param  __c  The character to push back into the input stream.
  510.        *  @return  *this
  511.        *
  512.        *  If @c rdbuf() is not null, calls @c rdbuf()->sputbackc(c).
  513.        *
  514.        *  If @c rdbuf() is null or if @c sputbackc() fails, sets badbit in
  515.        *  the error state.
  516.        *
  517.        *  @note  This function first clears eofbit.  Since no characters
  518.        *         are extracted, the next call to @c gcount() will return 0,
  519.        *         as required by DR 60.
  520.       */
  521.       __istream_type&
  522.       putback(char_type __c);
  523.  
  524.       /**
  525.        *  @brief  Unextracting the previous character.
  526.        *  @return  *this
  527.        *
  528.        *  If @c rdbuf() is not null, calls @c rdbuf()->sungetc(c).
  529.        *
  530.        *  If @c rdbuf() is null or if @c sungetc() fails, sets badbit in
  531.        *  the error state.
  532.        *
  533.        *  @note  This function first clears eofbit.  Since no characters
  534.        *         are extracted, the next call to @c gcount() will return 0,
  535.        *         as required by DR 60.
  536.       */
  537.       __istream_type&
  538.       unget();
  539.  
  540.       /**
  541.        *  @brief  Synchronizing the stream buffer.
  542.        *  @return  0 on success, -1 on failure
  543.        *
  544.        *  If @c rdbuf() is a null pointer, returns -1.
  545.        *
  546.        *  Otherwise, calls @c rdbuf()->pubsync(), and if that returns -1,
  547.        *  sets badbit and returns -1.
  548.        *
  549.        *  Otherwise, returns 0.
  550.        *
  551.        *  @note  This function does not count the number of characters
  552.        *         extracted, if any, and therefore does not affect the next
  553.        *         call to @c gcount().
  554.       */
  555.       int
  556.       sync();
  557.  
  558.       /**
  559.        *  @brief  Getting the current read position.
  560.        *  @return  A file position object.
  561.        *
  562.        *  If @c fail() is not false, returns @c pos_type(-1) to indicate
  563.        *  failure.  Otherwise returns @c rdbuf()->pubseekoff(0,cur,in).
  564.        *
  565.        *  @note  This function does not count the number of characters
  566.        *         extracted, if any, and therefore does not affect the next
  567.        *         call to @c gcount().  At variance with putback, unget and
  568.        *         seekg, eofbit is not cleared first.
  569.       */
  570.       pos_type
  571.       tellg();
  572.  
  573.       /**
  574.        *  @brief  Changing the current read position.
  575.        *  @param  __pos  A file position object.
  576.        *  @return  *this
  577.        *
  578.        *  If @c fail() is not true, calls @c rdbuf()->pubseekpos(__pos).  If
  579.        *  that function fails, sets failbit.
  580.        *
  581.        *  @note  This function first clears eofbit.  It does not count the
  582.        *         number of characters extracted, if any, and therefore does
  583.        *         not affect the next call to @c gcount().
  584.       */
  585.       __istream_type&
  586.       seekg(pos_type);
  587.  
  588.       /**
  589.        *  @brief  Changing the current read position.
  590.        *  @param  __off  A file offset object.
  591.        *  @param  __dir  The direction in which to seek.
  592.        *  @return  *this
  593.        *
  594.        *  If @c fail() is not true, calls @c rdbuf()->pubseekoff(__off,__dir).
  595.        *  If that function fails, sets failbit.
  596.        *
  597.        *  @note  This function first clears eofbit.  It does not count the
  598.        *         number of characters extracted, if any, and therefore does
  599.        *         not affect the next call to @c gcount().
  600.       */
  601.       __istream_type&
  602.       seekg(off_type, ios_base::seekdir);
  603.       //@}
  604.  
  605.     protected:
  606.       basic_istream()
  607.       : _M_gcount(streamsize(0))
  608.       { this->init(0); }
  609.  
  610. #if __cplusplus >= 201103L
  611.       basic_istream(const basic_istream&) = delete;
  612.  
  613.       basic_istream(basic_istream&& __rhs)
  614.       : __ios_type(), _M_gcount(__rhs._M_gcount)
  615.       {
  616.         __ios_type::move(__rhs);
  617.         __rhs._M_gcount = 0;
  618.       }
  619.  
  620.       // 27.7.3.3 Assign/swap
  621.  
  622.       basic_istream& operator=(const basic_istream&) = delete;
  623.  
  624.       basic_istream&
  625.       operator=(basic_istream&& __rhs)
  626.       {
  627.         swap(__rhs);
  628.         return *this;
  629.       }
  630.  
  631.       void
  632.       swap(basic_istream& __rhs)
  633.       {
  634.         __ios_type::swap(__rhs);
  635.         std::swap(_M_gcount, __rhs._M_gcount);
  636.       }
  637. #endif
  638.  
  639.       template<typename _ValueT>
  640.         __istream_type&
  641.         _M_extract(_ValueT& __v);
  642.     };
  643.  
  644.   /// Explicit specialization declarations, defined in src/istream.cc.
  645.   template<>
  646.     basic_istream<char>&
  647.     basic_istream<char>::
  648.     getline(char_type* __s, streamsize __n, char_type __delim);
  649.  
  650.   template<>
  651.     basic_istream<char>&
  652.     basic_istream<char>::
  653.     ignore(streamsize __n);
  654.  
  655.   template<>
  656.     basic_istream<char>&
  657.     basic_istream<char>::
  658.     ignore(streamsize __n, int_type __delim);
  659.  
  660. #ifdef _GLIBCXX_USE_WCHAR_T
  661.   template<>
  662.     basic_istream<wchar_t>&
  663.     basic_istream<wchar_t>::
  664.     getline(char_type* __s, streamsize __n, char_type __delim);
  665.  
  666.   template<>
  667.     basic_istream<wchar_t>&
  668.     basic_istream<wchar_t>::
  669.     ignore(streamsize __n);
  670.  
  671.   template<>
  672.     basic_istream<wchar_t>&
  673.     basic_istream<wchar_t>::
  674.     ignore(streamsize __n, int_type __delim);
  675. #endif
  676.  
  677.   /**
  678.    *  @brief  Performs setup work for input streams.
  679.    *
  680.    *  Objects of this class are created before all of the standard
  681.    *  extractors are run.  It is responsible for <em>exception-safe
  682.    *  prefix and suffix operations,</em> although only prefix actions
  683.    *  are currently required by the standard.
  684.   */
  685.   template<typename _CharT, typename _Traits>
  686.     class basic_istream<_CharT, _Traits>::sentry
  687.     {
  688.       // Data Members.
  689.       bool _M_ok;
  690.  
  691.     public:
  692.       /// Easy access to dependent types.
  693.       typedef _Traits                                   traits_type;
  694.       typedef basic_streambuf<_CharT, _Traits>          __streambuf_type;
  695.       typedef basic_istream<_CharT, _Traits>            __istream_type;
  696.       typedef typename __istream_type::__ctype_type     __ctype_type;
  697.       typedef typename _Traits::int_type                __int_type;
  698.  
  699.       /**
  700.        *  @brief  The constructor performs all the work.
  701.        *  @param  __is  The input stream to guard.
  702.        *  @param  __noskipws  Whether to consume whitespace or not.
  703.        *
  704.        *  If the stream state is good (@a __is.good() is true), then the
  705.        *  following actions are performed, otherwise the sentry state
  706.        *  is false (<em>not okay</em>) and failbit is set in the
  707.        *  stream state.
  708.        *
  709.        *  The sentry's preparatory actions are:
  710.        *
  711.        *  -# if the stream is tied to an output stream, @c is.tie()->flush()
  712.        *     is called to synchronize the output sequence
  713.        *  -# if @a __noskipws is false, and @c ios_base::skipws is set in
  714.        *     @c is.flags(), the sentry extracts and discards whitespace
  715.        *     characters from the stream.  The currently imbued locale is
  716.        *     used to determine whether each character is whitespace.
  717.        *
  718.        *  If the stream state is still good, then the sentry state becomes
  719.        *  true (@a okay).
  720.       */
  721.       explicit
  722.       sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws = false);
  723.  
  724.       /**
  725.        *  @brief  Quick status checking.
  726.        *  @return  The sentry state.
  727.        *
  728.        *  For ease of use, sentries may be converted to booleans.  The
  729.        *  return value is that of the sentry state (true == okay).
  730.       */
  731. #if __cplusplus >= 201103L
  732.       explicit
  733. #endif
  734.       operator bool() const
  735.       { return _M_ok; }
  736.     };
  737.  
  738.   //@{
  739.   /**
  740.    *  @brief  Character extractors
  741.    *  @param  __in  An input stream.
  742.    *  @param  __c  A character reference.
  743.    *  @return  in
  744.    *
  745.    *  Behaves like one of the formatted arithmetic extractors described in
  746.    *  std::basic_istream.  After constructing a sentry object with good
  747.    *  status, this function extracts a character (if one is available) and
  748.    *  stores it in @a __c.  Otherwise, sets failbit in the input stream.
  749.   */
  750.   template<typename _CharT, typename _Traits>
  751.     basic_istream<_CharT, _Traits>&
  752.     operator>>(basic_istream<_CharT, _Traits>& __in, _CharT& __c);
  753.  
  754.   template<class _Traits>
  755.     inline basic_istream<char, _Traits>&
  756.     operator>>(basic_istream<char, _Traits>& __in, unsigned char& __c)
  757.     { return (__in >> reinterpret_cast<char&>(__c)); }
  758.  
  759.   template<class _Traits>
  760.     inline basic_istream<char, _Traits>&
  761.     operator>>(basic_istream<char, _Traits>& __in, signed char& __c)
  762.     { return (__in >> reinterpret_cast<char&>(__c)); }
  763.   //@}
  764.  
  765.   //@{
  766.   /**
  767.    *  @brief  Character string extractors
  768.    *  @param  __in  An input stream.
  769.    *  @param  __s  A pointer to a character array.
  770.    *  @return  __in
  771.    *
  772.    *  Behaves like one of the formatted arithmetic extractors described in
  773.    *  std::basic_istream.  After constructing a sentry object with good
  774.    *  status, this function extracts up to @c n characters and stores them
  775.    *  into the array starting at @a __s.  @c n is defined as:
  776.    *
  777.    *  - if @c width() is greater than zero, @c n is width() otherwise
  778.    *  - @c n is <em>the number of elements of the largest array of *
  779.    *  - @c char_type that can store a terminating @c eos.</em>
  780.    *  - [27.6.1.2.3]/6
  781.    *
  782.    *  Characters are extracted and stored until one of the following happens:
  783.    *  - @c n-1 characters are stored
  784.    *  - EOF is reached
  785.    *  - the next character is whitespace according to the current locale
  786.    *  - the next character is a null byte (i.e., @c charT() )
  787.    *
  788.    *  @c width(0) is then called for the input stream.
  789.    *
  790.    *  If no characters are extracted, sets failbit.
  791.   */
  792.   template<typename _CharT, typename _Traits>
  793.     basic_istream<_CharT, _Traits>&
  794.     operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s);
  795.  
  796.   // Explicit specialization declaration, defined in src/istream.cc.
  797.   template<>
  798.     basic_istream<char>&
  799.     operator>>(basic_istream<char>& __in, char* __s);
  800.  
  801.   template<class _Traits>
  802.     inline basic_istream<char, _Traits>&
  803.     operator>>(basic_istream<char, _Traits>& __in, unsigned char* __s)
  804.     { return (__in >> reinterpret_cast<char*>(__s)); }
  805.  
  806.   template<class _Traits>
  807.     inline basic_istream<char, _Traits>&
  808.     operator>>(basic_istream<char, _Traits>& __in, signed char* __s)
  809.     { return (__in >> reinterpret_cast<char*>(__s)); }
  810.   //@}
  811.  
  812.   /**
  813.    *  @brief  Template class basic_iostream
  814.    *  @ingroup io
  815.    *
  816.    *  @tparam _CharT  Type of character stream.
  817.    *  @tparam _Traits  Traits for character type, defaults to
  818.    *                   char_traits<_CharT>.
  819.    *
  820.    *  This class multiply inherits from the input and output stream classes
  821.    *  simply to provide a single interface.
  822.   */
  823.   template<typename _CharT, typename _Traits>
  824.     class basic_iostream
  825.     : public basic_istream<_CharT, _Traits>,
  826.       public basic_ostream<_CharT, _Traits>
  827.     {
  828.     public:
  829.       // _GLIBCXX_RESOLVE_LIB_DEFECTS
  830.       // 271. basic_iostream missing typedefs
  831.       // Types (inherited):
  832.       typedef _CharT                                    char_type;
  833.       typedef typename _Traits::int_type                int_type;
  834.       typedef typename _Traits::pos_type                pos_type;
  835.       typedef typename _Traits::off_type                off_type;
  836.       typedef _Traits                                   traits_type;
  837.  
  838.       // Non-standard Types:
  839.       typedef basic_istream<_CharT, _Traits>            __istream_type;
  840.       typedef basic_ostream<_CharT, _Traits>            __ostream_type;
  841.  
  842.       /**
  843.        *  @brief  Constructor does nothing.
  844.        *
  845.        *  Both of the parent classes are initialized with the same
  846.        *  streambuf pointer passed to this constructor.
  847.       */
  848.       explicit
  849.       basic_iostream(basic_streambuf<_CharT, _Traits>* __sb)
  850.       : __istream_type(__sb), __ostream_type(__sb) { }
  851.  
  852.       /**
  853.        *  @brief  Destructor does nothing.
  854.       */
  855.       virtual
  856.       ~basic_iostream() { }
  857.  
  858.     protected:
  859.       basic_iostream()
  860.       : __istream_type(), __ostream_type() { }
  861.  
  862. #if __cplusplus >= 201103L
  863.       basic_iostream(const basic_iostream&) = delete;
  864.  
  865.       basic_iostream(basic_iostream&& __rhs)
  866.       : __istream_type(std::move(__rhs)), __ostream_type(*this)
  867.       { }
  868.  
  869.       // 27.7.3.3 Assign/swap
  870.  
  871.       basic_iostream& operator=(const basic_iostream&) = delete;
  872.  
  873.       basic_iostream&
  874.       operator=(basic_iostream&& __rhs)
  875.       {
  876.         swap(__rhs);
  877.         return *this;
  878.       }
  879.  
  880.       void
  881.       swap(basic_iostream& __rhs)
  882.       { __istream_type::swap(__rhs); }
  883. #endif
  884.     };
  885.  
  886.   /**
  887.    *  @brief  Quick and easy way to eat whitespace
  888.    *
  889.    *  This manipulator extracts whitespace characters, stopping when the
  890.    *  next character is non-whitespace, or when the input sequence is empty.
  891.    *  If the sequence is empty, @c eofbit is set in the stream, but not
  892.    *  @c failbit.
  893.    *
  894.    *  The current locale is used to distinguish whitespace characters.
  895.    *
  896.    *  Example:
  897.    *  @code
  898.    *     MyClass   mc;
  899.    *
  900.    *     std::cin >> std::ws >> mc;
  901.    *  @endcode
  902.    *  will skip leading whitespace before calling operator>> on cin and your
  903.    *  object.  Note that the same effect can be achieved by creating a
  904.    *  std::basic_istream::sentry inside your definition of operator>>.
  905.   */
  906.   template<typename _CharT, typename _Traits>
  907.     basic_istream<_CharT, _Traits>&
  908.     ws(basic_istream<_CharT, _Traits>& __is);
  909.  
  910. #if __cplusplus >= 201103L
  911.   // [27.7.1.6] Rvalue stream extraction
  912.   /**
  913.    *  @brief  Generic extractor for rvalue stream
  914.    *  @param  __is  An input stream.
  915.    *  @param  __x  A reference to the extraction target.
  916.    *  @return  is
  917.    *
  918.    *  This is just a forwarding function to allow extraction from
  919.    *  rvalue streams since they won't bind to the extractor functions
  920.    *  that take an lvalue reference.
  921.   */
  922.   template<typename _CharT, typename _Traits, typename _Tp>
  923.     inline basic_istream<_CharT, _Traits>&
  924.     operator>>(basic_istream<_CharT, _Traits>&& __is, _Tp& __x)
  925.     {
  926.       __is >> __x;
  927.       return __is;
  928.     }
  929. #endif // C++11
  930.  
  931. _GLIBCXX_END_NAMESPACE_VERSION
  932. } // namespace
  933.  
  934. #include <bits/istream.tcc>
  935.  
  936. #endif  /* _GLIBCXX_ISTREAM */
  937.