Whoa fast responses!

I like make_iterator_range and sliced but they don't quite seem to do it.  Good point on the std::distance.  No need to add a new make_iterator_range - I may consider rethinking my approach or just leaving as is.  Thanks everyone!

On Mon, Oct 29, 2012 at 11:35 AM, Bill Buklis <boostusr@pbjzone.com> wrote:
On 10/28/2012 11:40 PM, David Kimmel wrote:
Is there a function in BOOST, given a starting point and a desired size, that
returns iterators for a (sub) range?

For example, given:
a boost::circular_buffer which contains: 1 2 3 4 5 6 7 8 9 10
a starting point which is an iterator pointing to 5
and finally a desired size which is an int s = 4

The result of which would be iterators producing: 5 6 7 8

A possible implementation might be this (but I was hoping there was a BOOST
version since I can't find an STD algorithm)

template <typename Itr>
std::pair<Itr, Itr> getWindowDown(Itr begin, Itr end, Itr start, const int
windowSize)
{
        // Down first, then up if need be
        const Itr bottom = (end - start > windowSize) ? (start + windowSize) :
(end);
        const Itr top = (bottom - begin > windowSize) ? (bottom - windowSize) :
(begin);
        return make_pair(top, bottom);
}


Thanks,


Would using next or advance work?

For example, something like:

range = std::make_pair(first, std::next(first, 4));

I can't remember offhand if next is only c++11. If so, there might be a boost::next available. Or alternatively use advance, but it'll require an extra variable to hold the end iterator.

Also, from a purely generic standpoint using std::distance is better than end - start.

--
Bill

_______________________________________________
Boost-users mailing list
Boost-users@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-users