stdcxx-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Travis Vitek (JIRA)" <j...@apache.org>
Subject [jira] Commented: (STDCXX-645) stream iterators into different streams compare equal
Date Fri, 16 Nov 2007 19:31:43 GMT

    [ https://issues.apache.org/jira/browse/STDCXX-645?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12543180
] 

Travis Vitek commented on STDCXX-645:
-------------------------------------

24.5.1 p1 says that an istream_iterator becomes an end-of-stream iterator when the end of
stream is reached. So checks are required so that two iterators that become end-of-stream
iterators will compare equal.

#include <assert.h> 
#include <iterator> 
#include <sstream> 

int main () 
{ 
    std::istringstream a ("1"); 
    std::istream_iterator<int> i (a); 
    ++i;

    std::istringstream b ("2"); 
    std::istream_iterator<int> j (b); 
    ++j;

    assert (i == j); 

    return 0;
} 

This method needs to return true if both iterators are end-of-stream iterators, or they have
the same non-null stream pointer. Something like this is more appropriate given the implementation
of the other methods

template <class _TypeT, class _CharT, class _Traits, class _Distance>
bool
operator== (const istream_iterator<_TypeT, _CharT, _Traits, _Distance>& __x, 
             const istream_iterator<_TypeT, _CharT, _Traits, _Distance>& __y) 
{ 
    const bool __x_eos = !__x._C_strm || !*__x._C_strm;
    const bool __y_eos = !__x._C_strm || !*__x._C_strm;

    return (__x._C_strm == __y._C_strm) ? true : __x_eos == __y_eos;
}

The other option would be to change our internal definition of end-of-stream to be istream_iterators
with a NULL stream pointer. Then operator++ could be changed to invalidate the stream pointer
when the stream reaches eos. I think this would work.

istream_iterator& operator++ () {
    if (_C_strm && !!*_C_strm)
        *_C_strm >> _C_val;
    else
        _C_strm = 0;
    return *this;
}


> stream iterators into different streams compare equal
> -----------------------------------------------------
>
>                 Key: STDCXX-645
>                 URL: https://issues.apache.org/jira/browse/STDCXX-645
>             Project: C++ Standard Library
>          Issue Type: Bug
>          Components: 24. Iterators
>    Affects Versions: 4.1.3, 4.2.0
>            Reporter: Mark Brown
>
> As Travis says in his reply to my post here:
> http://www.nabble.com/stream-iterators-into-different-streams-compare-equal--tf4721505.html#a13498487:
>     Given 24.5.1.1 p1 and p2, it is pretty clear to me that the two iterators are both
non-end-of-stream type, and they are both created on different streams. The streams are different,
so the iterators should not compare equal. I guess one could claim that 24.5.1.2 p6 conflicts
with 24.5 p3 because 'end-of-stream' isn't clearly defined, but in this particular case that
doesn't matter.
> This program aborts with stdcxx but not with gcc:
> #include <assert.h>
> #include <iterator>
> #include <sstream>
> int main ()
> {
>     std::istringstream a ("1");
>     std::istream_iterator<int> i (a);
>     std::istringstream b ("2");
>     std::istream_iterator<int> j (b);
>     assert (!(i == j));
> } 

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message