<p dir="ltr">Hi Alex,<br>
  it turns out that the itch is real, and this is actually going to be useful in carrying forward the HttpHeader restructuring I'm doing in lp:~kinkie/squid/coverity-fixes, to iterate over the list of header types for various purposes (compacting, etc).<br>
So I went ahead and just implemented it, starting from your observations.<br>
It's a bit more complex that your proposal, as I took the chance to implement bidirectional forward and reverse iterators.<br>
The attached patch is in changeset 14235 of lp:~kinkie/squid/coverity-fixes, but since the code is quite well self-contained I'd like to submit it for audit as a standalone unit; If it passed I'll merge it to trunk with the code that uses it.</p>
<p dir="ltr">Thanks!<br></p>
<div class="gmail_quot<blockquote class=" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 08/05/2015 07:58 PM, Kinkie wrote:<br>
<br>
> What I understand from the changes you propose is that:<br>
<br>
> 1. instead of having explicit begin/end markers passed as template<br>
> arguments you propose to have a convention on begin/end markers.<br>
<br>
There are several different things/layers mixed up here:<br>
<br>
* If we want to use range loops for enums [in a sane way], then our<br>
enums should have begin/end markers. Many already do, but we will have<br>
to standardize their names and fill the gaps.<br>
<br>
* The begin/end parameters should not be template parameters.<br>
<br>
* If we need to iterate sub-ranges, then we should add EnumRangeT<Enum><br>
class with begin/end as constructor parameters (see below).<br>
<br>
<br>
> 2. you skip the typedef fixing these parameters in favor of letting the<br>
> template parameters appear in the calls.<br>
<br>
There are two separate issues/layers here:<br>
<br>
* Naming an expression is a good idea, especially if that name is going<br>
to be used multiple times.<br>
<br>
* Fewer template parameters are generally better if they can accomplish<br>
the same thing as more template parameters.<br>
<br>
<br>
> 1. looks interesting, especially as an enum missing those markers will<br>
> fail to compile. Maybe both approaches can be combined by using default<br>
> template arguments, what do you think?<br>
> template <typename C, C first = C::enumBegin_, C last_plus_one =<br>
> C::enumEnd_><br>
<br>
I think we should not specify iteration range boundaries as template<br>
parameters.<br>
<br>
<br>
> 3. we could maybe combine the benefits of beautiful range-for and ugly<br>
> explicit-for also for shorter ranges by having (in the class-based<br>
> variant), on top of what you have already proposed (untested)<br>
<br>
Yes, if sub-range iteration using range loops is needed, then we should<br>
add EnumRangeT<Enum> class that does it. Sorry if I have not mentioned<br>
that explicitly.<br>
<br>
Your sketch for that class is fine, but it will be a EnumRangeT class,<br>
separate from simpler WholeEnum, and we would try to define a function<br>
that will create that EnumRangeT object so that we only have to type<br>
"Numbers" zero or two times as illustrated below:<br>
<br>
template <typename Enum><br>
inline<br>
EnumRangeT<Enum> EnumRange(const Enum from, const Enum to) {<br>
    return EnumRangeT<Enum>(from, to);<br>
}<br>
<br>
<br>
So that instead of:<br>
<br>
> for (auto i : WholeEnum<Numbers>(Numbers::one, Numbers::three)) {<br>
>  // do stuff<br>
> }<br>
<br>
we could do:<br>
<br>
  // iterating sub-range of a class enum:<br>
  for (auto i: EnumRange(Numbers::one, Numbers::three)) ...<br>
<br>
  // iterating sub-range of a global C enum:<br>
  for (auto i: EnumRange(one, three)) ...<br>
<br>
  // iterating a whole enum:<br>
  for (auto i: WholeEnum<Numbers>()) ...<br>
<br>
<br>
Again, the above range objects can be named (and the first two should be<br>
named if they are used more than once). For example:<br>
<br>
  WholeEnum<Numbers> AllNumbers() { return WholeEnum<Numbers>(); }<br>
<br>
  EnumRange<Numbers> FooBarNumbers() { return EnumRange(Numbers::foo,<br>
Numbers::bar); }<br>
<br>
<br>
<br>
> It looks to me that I have crossed an itch you feel as well,<br>
<br>
No, I am just trying to help you scratch your itch without scarring<br>
Squid code. I do not know whether your itch is real or imaginary.<br>
<br>
<br>
Cheers,<br>
<br>
Alex.<br>
<br>
</div>