Boost logo

Boost :

Subject: Re: [boost] [filesystem] C++11 range-based for statement and BOOST_FOREACH support
From: Nathan Ridge (zeratul976_at_[hidden])
Date: 2012-07-21 00:11:21


> >> > Hm.
> >> >
> >> > Why not follow this design:
> >> >
> >> > http://www.boost.org/doc/libs/1_50_0/libs/range/doc/html/range/reference/ranges/istream_range.html
> >>
> >> The implementation would be more elegant, but the user would have to write:
> >>
> >> BOOST_FOREACH(directory_entry& x, directory_range(directory_iterator(".")))
> >>
> >> instead of the simpler:
> >>
> >> BOOST_FOREACH(directory_entry& x, directory_iterator("."))
> >>
> >> I verified the above with an actual implementation and test.
> >
> > I don't see why that's the case. In the posted link, the function istream_range()
> > takes an argument of type istream&, which is the same argument type that the
> > constructor of istream_iterator takes. Notice that istream_range() does *not*
> > take an actual istream_iterator as its constructor argument.
> >
> > Similarly, I would expect directory_range() to take a path argument, and return
> > something like make_iterator_range(directory_iterator(p), directory_iterator()).
>
> The make_iterator_range template requires ForwardIterators, but
> directory_iterator only meets InputIterator requirements. Perhaps
> someone familiar with Boost.Range can come up with a workaround.

istream_iterator is not a forward iterator either, yet istream_range() returns an
iterator_range<istream_iterator>. The documentation for iterator_range says:

"If the template argument is not a model of Forward Traversal Iterator, one can
still use a subset of the interface.
          In particular, size()
          requires Random Access
Traversal Iterators whereas empty() only requires Single Pass Iterators."

So it seems this should be OK.

Regards,
Nate

                                               


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