On Fri, Dec 04, 2020 at 02:05:12PM -0500, Taylor Blau wrote: > > +static inline size_t oid_array_next_unique(struct oid_array *array, size_t cur) > > +{ > > + do { > > + cur++; > > + } while (cur < array->nr && > > + oideq(array->oid + cur, array->oid + cur - 1)); > > I don't love the pointer math here (would instead prefer > oideq(&array->oid[cur]) and so on), but I don't think that it matters > enough to make a difference. I think it is a matter of preference. I actually prefer the arithmetic (it's also what was in the code that we are replacing in oid_array_for_each_unique(), but that is probably because I wrote that one, too). > I additionally had to make sure that cur - 1 >= 0 so that the second > argument would always be valid, but it is, since we call cur++. Yeah. I originally wrote it as: cur++; while (cur < array->nr) { if (!oideq(...)) break; cur++; } which maybe makes it more obvious that cur always gets implemented at least once, but I found it harder to reason about the second increment. I think the do-while expresses it pretty clearly, but we're not that used to seeing them. > You could check that cur++ doesn't overflow, but I think that that's > mostly academic. It can't overflow, because it can't ever go past array->nr (unless you call it again after cur is already equal to array->nr, but that would be a bug just like calling i++ after hitting the loop end would be). -Peff