On Tue, Oct 30, 2012 at 4:50 PM, David Kimmel <davidwkimmel@gmail.com> wrote:
I tried it out, yes you can get make_iterator_range with next to work.  I like boost::next but for what I wanted it does not seem to work appropriately.  Your example of "make_iterator_range(boost::next(b.begin, wSize), v.end())" will only skip the first "wSize" elements.  What I want is a range that contains at most wSize elements (if possible) - taking them from after (and containing) a start index.  


boost::next absolutely shouldn't be checking against end(), that would not be obeying the zero-overhead principle. For your requirements surely you just alter the parameters to make_iterator_range?
 
Even my second attempt with this approach (commented out lines) does not work because next does not check to see if it is past end.  Perhaps if there is a "min" method I could pass the "boost::next(v.begin() + (start-1), window)" and "v.end()".


std::min from <algorithm> ?
 
typedef vector<int> Vector;
Vector v = { 1, 2, 3, 4, 5, 6, 7, 8 , 9, 10, 11 };

const int start = 10;
const int window = 4;

auto r = boost::make_iterator_range(boost::next(v.begin(), start-1), v.end());
auto r2 = boost::make_iterator_range(boost::prior(r.end(), window), r.end());

// auto r = boost::make_iterator_range(v.begin() + (start-1), boost::next(v.begin() + (start-1), window) );
// auto r2 = boost::make_iterator_range(boost::prior(r.end(), window), r.end());



// General solution for all iterator types - assume that source here is v from your example
auto r = boost::make_iterator_range(
    boost::next(boost::begin(source), start - 1),
    boost::next(boost::begin(source), std::min(start - 1 + window, static_cast<int>(boost::distance(source))))
);

I'm not seeing a problem. Am I misunderstanding your question?

Neil Groves