diff --git a/bench/set_partition/set_partition.cpp b/bench/set_partition/set_partition.cpp index 7a490e0e..657cf61d 100644 --- a/bench/set_partition/set_partition.cpp +++ b/bench/set_partition/set_partition.cpp @@ -3,10 +3,9 @@ #include #include -#define vec std::vector +template using vec = std::vector; -namespace { -vec range(int start, int stop) { +inline vec range(int start, int stop) { vec v(stop - start); uint j = 0; for (int i = start; i < stop; i++) @@ -14,19 +13,20 @@ vec range(int start, int stop) { return v; } -bool conforms(const vec> &candidate, int minsize, int forgive) { +inline bool conforms(const vec> &candidate, int minsize, int forgive) { int deficit = 0; for (const auto &p : candidate) { - int need = minsize - p.size(); + int need = minsize - static_cast(p.size()); if (need > 0) deficit += need; } return deficit <= forgive; } -void partition_filtered(const vec &collection, - std::function> &)> callback, - int minsize = 1, int forgive = 0) { +inline void +partition_filtered(const vec &collection, + std::function> &)> callback, + int minsize = 1, int forgive = 0) { if (collection.size() == 1) { callback({collection}); return; @@ -35,13 +35,17 @@ void partition_filtered(const vec &collection, auto first = collection[0]; auto loop = [&](const vec> &smaller) { int n = 0; - for (const auto &subset : smaller) { - vec> candidate; - candidate.reserve(smaller.size()); - for (int i = 0; i < n; i++) - candidate.push_back(smaller[i]); - vec rep; + vec> candidate; + candidate.reserve(smaller.size() + 1); + vec rep; + + for (const auto &subset : smaller) { + candidate.resize(n); + for (int i = 0; i < n; i++) + candidate[i] = smaller[i]; + + rep.clear(); rep.reserve(subset.size() + 1); rep.push_back(first); rep.insert(rep.end(), subset.begin(), subset.end()); @@ -55,8 +59,7 @@ void partition_filtered(const vec &collection, ++n; } - vec> candidate; - candidate.reserve(smaller.size() + 1); + candidate.clear(); candidate.push_back({first}); candidate.insert(candidate.end(), smaller.begin(), smaller.end()); @@ -67,7 +70,6 @@ void partition_filtered(const vec &collection, vec new_collection(collection.begin() + 1, collection.end()); partition_filtered(new_collection, loop, minsize, forgive + 1); } -} // namespace int main(int argc, char *argv[]) { using clock = std::chrono::high_resolution_clock;