OSDN Git Service

2003-07-04 Benjamin Kosnik <bkoz@redhat.com>
[pf3gnuchains/gcc-fork.git] / libstdc++-v3 / include / bits / streambuf_iterator.h
index f7317b2..f25cd4f 100644 (file)
@@ -1,6 +1,6 @@
 // Streambuf iterators
 
-// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002
+// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003
 // Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // invalidate any other reasons why the executable file might be covered by
 // the GNU General Public License.
 
-// XXX Should specialize copy, find algorithms for streambuf iterators.
-
 /** @file streambuf_iterator.h
  *  This is an internal header file, included by other library headers.
  *  You should not attempt to use it directly.
  */
 
-#ifndef _CPP_BITS_STREAMBUF_ITERATOR_H
-#define _CPP_BITS_STREAMBUF_ITERATOR_H 1
+#ifndef _STREAMBUF_ITERATOR_H
+#define _STREAMBUF_ITERATOR_H 1
 
 #pragma GCC system_header
 
+#include <streambuf>
+
+// NB: Should specialize copy, find algorithms for streambuf iterators.
+
 namespace std
 {
   // 24.5.3 Template class istreambuf_iterator
@@ -69,66 +71,73 @@ namespace std
 
     public:
       istreambuf_iterator() throw() 
-      : _M_sbuf(0), _M_c(-2) { }
+      : _M_sbuf(0), _M_c(traits_type::eof()) { }
       
       istreambuf_iterator(istream_type& __s) throw()
-      : _M_sbuf(__s.rdbuf()), _M_c(-2) { }
+      : _M_sbuf(__s.rdbuf()), _M_c(traits_type::eof()) { }
 
       istreambuf_iterator(streambuf_type* __s) throw()
-      : _M_sbuf(__s), _M_c(-2) { }
+      : _M_sbuf(__s), _M_c(traits_type::eof()) { }
        
-      // NB: This should really have an int_type return
-      // value, so "end of stream" postion can be checked without
-      // hacking.
+      // NB: The result of operator*() on an end of stream is undefined.
       char_type 
       operator*() const
-      { 
-       // The result of operator*() on an end of stream is undefined.
-       int_type __ret = traits_type::eof();
-       if (_M_sbuf)
-         { 
-           if (_M_c != static_cast<int_type>(-2))
-             __ret = _M_c;
-           else 
-             if ((__ret = _M_sbuf->sgetc()) == traits_type::eof())
-               _M_sbuf = 0;
-         }
-       return traits_type::to_char_type(__ret);
-      }
+      { return traits_type::to_char_type(_M_get()); }
        
       istreambuf_iterator& 
       operator++()
       { 
-       if (_M_sbuf && _M_sbuf->sbumpc() == traits_type::eof())
+       const int_type __eof = traits_type::eof();
+       if (_M_sbuf && traits_type::eq_int_type(_M_sbuf->sbumpc(), __eof))
          _M_sbuf = 0;
        else
-         _M_c = -2;
+         _M_c = __eof;
        return *this; 
       }
 
       istreambuf_iterator
       operator++(int)
       {
+       const int_type __eof = traits_type::eof();
        istreambuf_iterator __old = *this;
-       if (_M_sbuf && (__old._M_c = _M_sbuf->sbumpc()) == traits_type::eof())
+       if (_M_sbuf
+           && traits_type::eq_int_type((__old._M_c = _M_sbuf->sbumpc()), 
+                                       __eof))
          _M_sbuf = 0;
        else
-         _M_c = -2;
+         _M_c = __eof;
        return __old; 
       }
 
-#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
+#ifdef _GLIBCXX_RESOLVE_LIB_DEFECTS
       // 110 istreambuf_iterator::equal not const
       // NB: there is also number 111 (NAD, Future) pending on this function.
       bool 
       equal(const istreambuf_iterator& __b) const
       {
        const int_type __eof = traits_type::eof();
-       bool __thiseof = traits_type::eq_int_type(this->operator*(), __eof);
-       bool __beof = traits_type::eq_int_type(__b.operator*(), __eof);
+       bool __thiseof = traits_type::eq_int_type(_M_get(), __eof);
+       bool __beof = traits_type::eq_int_type(__b._M_get(), __eof);
        return (__thiseof && __beof || (!__thiseof && !__beof));
       }
 #endif
+
+    private:
+      int_type 
+      _M_get() const
+      { 
+       const int_type __eof = traits_type::eof();
+       int_type __ret = __eof;
+       if (_M_sbuf)
+         { 
+           if (!traits_type::eq_int_type(_M_c, __eof))
+             __ret = _M_c;
+           else 
+             if (traits_type::eq_int_type((__ret = _M_sbuf->sgetc()), __eof))
+               _M_sbuf = 0;
+         }
+       return __ret;
+      }
     };
 
   template<typename _CharT, typename _Traits>
@@ -159,7 +168,6 @@ namespace std
       bool             _M_failed;
 
     public:
-      inline 
       ostreambuf_iterator(ostream_type& __s) throw ()
       : _M_sbuf(__s.rdbuf()), _M_failed(!_M_sbuf) { }
       
@@ -167,7 +175,13 @@ namespace std
       : _M_sbuf(__s), _M_failed(!_M_sbuf) { }
 
       ostreambuf_iterator& 
-      operator=(_CharT __c);
+      operator=(_CharT __c)
+      {
+       if (!_M_failed && 
+           _Traits::eq_int_type(_M_sbuf->sputc(__c), _Traits::eof()))
+         _M_failed = true;
+       return *this;
+      }
 
       ostreambuf_iterator& 
       operator*() throw()
@@ -184,16 +198,15 @@ namespace std
       bool 
       failed() const throw()
       { return _M_failed; }
-    };
 
-  template<typename _CharT, typename _Traits>
-    inline ostreambuf_iterator<_CharT, _Traits>&
-    ostreambuf_iterator<_CharT, _Traits>::operator=(_CharT __c)
-    {
-      if (!_M_failed && 
-          _Traits::eq_int_type(_M_sbuf->sputc(__c), _Traits::eof()))
-       _M_failed = true;
-      return *this;
-    }
+      ostreambuf_iterator& 
+      _M_put(const _CharT* __ws, streamsize __len)
+      {
+       if (__builtin_expect(!_M_failed, true)
+           && __builtin_expect(this->_M_sbuf->sputn(__ws, __len) != __len, false))
+         _M_failed = true;
+       return *this;
+      }
+    };
 } // namespace std
 #endif