2016-06-06 07:52:41 -04:00
|
|
|
#ifndef OSRM_GROUP_BY
|
|
|
|
#define OSRM_GROUP_BY
|
|
|
|
|
|
|
|
#include <algorithm>
|
|
|
|
#include <utility>
|
|
|
|
|
2022-12-11 04:10:26 -05:00
|
|
|
namespace osrm::util
|
2016-06-06 07:52:41 -04:00
|
|
|
{
|
|
|
|
|
|
|
|
// Runs fn on consecutive items in sub-ranges determined by pred.
|
|
|
|
//
|
|
|
|
// Example:
|
|
|
|
// vector<int> v{1,2,2,2,3,4,4};
|
|
|
|
// group_by(first, last, even, print);
|
|
|
|
// >>> 2,2,2
|
|
|
|
// >>> 4,4
|
|
|
|
//
|
|
|
|
// Note: this mimics Python's itertools.groupby
|
|
|
|
template <typename Iter, typename Pred, typename Fn>
|
|
|
|
Fn group_by(Iter first, Iter last, Pred pred, Fn fn)
|
|
|
|
{
|
|
|
|
while (first != last)
|
|
|
|
{
|
|
|
|
first = std::find_if(first, last, pred);
|
|
|
|
auto next = std::find_if_not(first, last, pred);
|
|
|
|
|
|
|
|
(void)fn(std::make_pair(first, next));
|
|
|
|
|
|
|
|
first = next;
|
|
|
|
}
|
|
|
|
|
|
|
|
return fn;
|
|
|
|
}
|
|
|
|
|
2020-11-26 10:21:39 -05:00
|
|
|
} // namespace osrm
|
2016-06-06 07:52:41 -04:00
|
|
|
|
|
|
|
#endif
|