[cfe-commits] [libcxx] r168209 - /libcxx/trunk/include/iterator

Howard Hinnant hhinnant at apple.com
Fri Nov 16 14:17:24 PST 2012


Author: hhinnant
Date: Fri Nov 16 16:17:23 2012
New Revision: 168209

URL: http://llvm.org/viewvc/llvm-project?rev=168209&view=rev
Log:
istreambuf_iterator increment should call sbumpc instead of snextc.  Patch 
by Kimball Thurston.  This fixes http://llvm.org/bugs/show_bug.cgi?id=14358.

Modified:
    libcxx/trunk/include/iterator

Modified: libcxx/trunk/include/iterator
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/iterator?rev=168209&r1=168208&r2=168209&view=diff
==============================================================================
--- libcxx/trunk/include/iterator (original)
+++ libcxx/trunk/include/iterator Fri Nov 16 16:17:23 2012
@@ -799,7 +799,7 @@
     typedef basic_streambuf<_CharT,_Traits> streambuf_type;
     typedef basic_istream<_CharT,_Traits>   istream_type;
 private:
-    streambuf_type* __sbuf_;
+    mutable streambuf_type* __sbuf_;
 
     class __proxy
     {
@@ -813,13 +813,14 @@
     };
 
     _LIBCPP_INLINE_VISIBILITY
-    void __test_for_eof()
+    bool __test_for_eof() const
     {
         if (__sbuf_ && traits_type::eq_int_type(__sbuf_->sgetc(), traits_type::eof()))
             __sbuf_ = 0;
+        return __sbuf_ == 0;
     }
 public:
-    _LIBCPP_INLINE_VISIBILITY istreambuf_iterator() _NOEXCEPT : __sbuf_(0) {}
+    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR istreambuf_iterator() _NOEXCEPT : __sbuf_(0) {}
     _LIBCPP_INLINE_VISIBILITY istreambuf_iterator(istream_type& __s) _NOEXCEPT
         : __sbuf_(__s.rdbuf()) {__test_for_eof();}
     _LIBCPP_INLINE_VISIBILITY istreambuf_iterator(streambuf_type* __s) _NOEXCEPT
@@ -832,19 +833,16 @@
     _LIBCPP_INLINE_VISIBILITY char_type* operator->() const {return nullptr;}
     _LIBCPP_INLINE_VISIBILITY istreambuf_iterator& operator++()
         {
-            if (traits_type::eq_int_type(__sbuf_->snextc(), traits_type::eof()))
-                __sbuf_ = 0;
+            __sbuf_->sbumpc();
             return *this;
         }
     _LIBCPP_INLINE_VISIBILITY __proxy              operator++(int)
         {
-            char_type __c = __sbuf_->sgetc();
-            ++(*this);
-            return __proxy(__c, __sbuf_);
+            return __proxy(__sbuf_->sbumpc(), __sbuf_);
         }
 
     _LIBCPP_INLINE_VISIBILITY bool equal(const istreambuf_iterator& __b) const
-        {return (__sbuf_ == 0) == (__b.__sbuf_ == 0);}
+        {return __test_for_eof() == __b.__test_for_eof();}
 };
 
 template <class _CharT, class _Traits>





More information about the cfe-commits mailing list