Boost logo

Boost :

From: David Abrahams (dave_at_[hidden])
Date: 2004-04-22 10:02:19


Vladimir Prus <ghost_at_[hidden]> writes:

> David Abrahams wrote:
>
>> Vladimir Prus <ghost_at_[hidden]> writes:
>>
>>> And it seems to me, all single pass iterators have to store the value to
>>> allow for repeated operator*() calls.
>>
>> Let's talk about concepts in the standard, i.e. input iterator.
>
> Talking about input iterator, directory_iterator does not comply with *r++
> requirement.

Yes, I know.

>> We invented single pass iterator; it can mean anything we say, and
>> what we said doesn't imply that.
>
> But it's the intention that new-style readable single-pass iterator
> is also a model of old-style input iterator?

Yes.

> And the problem we're discussing is that directory_iterator is
> readable single-pass iterator but not input iterator?

Yes.

> I see that std::input_iterator requirements say that after ++r any
> copies of the previous value of r are no longer required to be
> dereferencable.

Right. That rules out your scenario of keeping old copies of the
iterator around and derferencing them later.

> New iterators requirents are silent on this. Is this intentional?

Probably not. However, if the standard doesn't explicitly guarantee
iterator stability, you can't count on it. That said, a note would
probably be good to add.

> If single pass iterator requirements
  ^^...
> - would add the same note about ++r making iterators dereferencable
                                      "non-"----------^
Probably a good idea.

> - retain the same requirements for operator++(int)

Really you mean requirements on the expression "*r++", I think.

    ...then what?

> The result of r++ is not required even to be dereferencable

Not required by which concept?

> and *r++ is not required even to be to work for single-pass
> iterator, while it works for input iterators.

Right, that needs to be fixed.

> The solutions I see are:
>
> 1) require that ++r does not makes any copies dereferencable, or

I think you mean "not require that any copies are dereferencable after
"++r"?

> 2) allow returning proxy from operator++(int)

That doesn't allow all readable single-pass iterators to be input
iterators. I'm against it.

What would the proxy do, anyway?

> 3) require that result of r++ is dereferencable and is equivivalent to the
> dereferencing of the previous value of 'r'.

I think we need want 1&3.

> The variant 2) would be most convenient for directory_iterator...

Yeah, but it would break interoperability with old algorithms.

-- 
Dave Abrahams
Boost Consulting
http://www.boost-consulting.com

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk