32 upperBoundaries.clear();
33 upperBoundaries.reserve(k);
34 for (uint_fast64_t bound = (n - k); bound < n; ++bound) {
35 upperBoundaries.push_back(bound);
40 uint_fast64_t newItem = 0;
41 while (current.size() != k && newItem <= upperBoundaries[current.size()]) {
43 if (filter(current, newItem, data)) {
44 current.push_back(newItem);
50 return current.size() == k;
56 std::vector<uint_fast64_t> currentSelection(current);
57 currentSelection.pop_back();
58 uint_fast64_t pos = k - 1;
61 if (current[pos] == upperBoundaries[pos]) {
67 currentSelection.pop_back();
72 if (filter(currentSelection, current[pos], data)) {
74 currentSelection.push_back(current[pos]);
82 current[pos] = current[pos - 1];