cleanup: implement index_of() and index_of_if() generics

Search the index of an item in a container. Compare by
equality or a lambda. The lack of these have annoyed me for a
long time. Return the index of the first found element or
-1 if no element found.

Currently, only supports random-access operators. Might be
trivially changed for forward iterators.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
Berthold Stoeger 2022-10-31 19:35:15 +01:00
parent df5bf728f9
commit 691d9e86de
3 changed files with 23 additions and 19 deletions

View file

@ -1008,29 +1008,19 @@ void DiveTripModelTree::addDivesToTrip(int trip, const QVector<dive *> &dives)
int DiveTripModelTree::findTripIdx(const dive_trip *trip) const
{
for (auto [i, item]: enumerated_range(items)) {
if (item.d_or_t.trip == trip)
return i;
}
return -1;
return index_of_if(items, [trip] (const Item &item)
{ return item.d_or_t.trip == trip; });
}
int DiveTripModelTree::findDiveIdx(const dive *d) const
{
for (auto [i, item]: enumerated_range(items)) {
if (item.isDive(d))
return i;
}
return -1;
return index_of_if(items, [d] (const Item &item)
{ return item.isDive(d); });
}
int DiveTripModelTree::findDiveInTrip(int tripIdx, const dive *d) const
{
const Item &item = items[tripIdx];
for (auto [i, dive]: enumerated_range(item.dives))
if (dive == d)
return i;
return -1;
return index_of(items[tripIdx].dives, d);
}
int DiveTripModelTree::findInsertionIndex(const dive_trip *trip) const