Re: Using range-based for with alternative ranges
On Friday, May 18, 2012 12:20:41 PM UTC-5, Juha Nieminen wrote:
I was thinking: How hard would it be to use the range-based for syntax
for ranges other than the full begin-end range. For instance, what if
you wanted it to traverse the container backwards instead of forwards?
What I mean is that one could write something like this:
//------------------------------------------------------------------
int table[] = { 1, 3, 5, 7, 9 };
std::vector<int> v(table, std::end(table));
std::cout << "Forwards:\n";
for(int element: table) std::cout << " " << element;
for(int element: v) std::cout << " " << element;
std::cout << "\nBackwards:\n";
for(int element: reverseRange(table)) std::cout << " " << element;
for(int element: reverseRange(v)) std::cout << " " << element;
std::cout << "\n";
//------------------------------------------------------------------
In other words, we would have a reverseRange() function that returns a
wrapper object that has reverse iterators for its begin() and end()
functions.
Other applications would be to traverse only part of the range, such as:
for(int element: subrange(table, 0, 3)) std::cout << " " << element;
I haven't found any utility wrappers for this in the new standard, so
I suppose the only way is to write such wrappers oneself.
I'm not sure about reversing, but for ranges it
might make sense to use a range class that has
begin and end function members. The following
is from the C++ Middleware Writer.
void
bigtest::Marshal (::cmw::SendBufferCompressed& buf
, boost::sub_range<std::vector<int32_t> > const& az1
)
{
::cmw::Counter cntr(msg_length_max);
cntr.Add(sizeof(int));
cntr.MultiplyAndAdd(boost::distance(az1), sizeof(int32_t));
buf.Receive32(boost::distance(az1));
for (auto const& it35 : az1) {
buf.Receive(&it35, sizeof(int32_t));
}
buf.Compress();
}
Shalom,
Brian
Ebenezer Enterprises
http://webEbenezer.net