31 upperBoundaries.
clear();
32 upperBoundaries.reserve(k);
33 for (uint_fast64_t bound = (n - k); bound < n; ++bound) {
34 upperBoundaries.push_back(bound);
39 uint_fast64_t newItem = 0;
40 while (current.size() != k && newItem <= upperBoundaries[current.size()]) {
42 if (filter(current, newItem, data)) {
43 current.push_back(newItem);
49 return current.size() == k;
55 std::vector<uint_fast64_t> currentSelection(current);
56 currentSelection.pop_back();
57 uint_fast64_t pos = k - 1;
60 if (current[pos] == upperBoundaries[pos]) {
66 currentSelection.pop_back();
71 if (filter(currentSelection, current[pos], data)) {
73 currentSelection.push_back(current[pos]);
81 current[pos] = current[pos - 1];