Added some foreachSubRange

This commit is contained in:
emeric
2023-11-08 13:53:27 +01:00
parent 4bc5aee986
commit 6bb6dd6add
2 changed files with 349 additions and 294 deletions
@@ -41,6 +41,23 @@ namespace Database
operator bool() const { return size != 0; }
};
// Func must return true to continue iterating
template <typename Func>
void foreachSubRange(Range range, std::size_t subRangeSize, Func&& func)
{
assert(subRangeSize > 0);
Range subRange{ range.offset, std::min(range.size, subRangeSize) };
while (subRange.size > 0)
{
if (!func(subRange))
break;
subRange.offset += subRange.size;
subRange.size = std::min(subRangeSize, range.size - (subRange.offset - range.offset));
}
}
template <typename T>
struct RangeResults
{
@@ -124,6 +124,44 @@ TEST_F(DatabaseFixture, Common_subRangeEmpty)
}
}
TEST_F(DatabaseFixture, Common_subRangeForeach)
{
using namespace Database;
struct TestCase
{
Range range;
std::size_t subRangeSize;
std::vector<Range> expectedSubRanges;
};
TestCase testCases[]
{
{Range{0, 0}, 1, {}},
{Range{1, 0}, 1, {}},
{Range{1, 1}, 1, { Range{ 1,1 } }},
{Range{1, 3}, 1, { Range{ 1,1 }, Range {2,1}, Range{3,1} }},
{Range{0, 100}, 100, { Range{0,100} }},
{Range{0, 50}, 100, { Range{0,50} }},
{Range{100, 200}, 100, { Range{100,100}, Range{200,100} }},
{Range{100, 101}, 100, { Range{100,100}, Range{200,1}}},
{Range{1000, 10}, 100, { Range{1000,10} }},
{Range{1, 100}, 50, { Range{1,50}, Range{51, 50} }},
};
for (const TestCase& test : testCases)
{
std::vector<Range> subRanges;
foreachSubRange(test.range, test.subRangeSize, [&](Range subRange)
{
subRanges.push_back(subRange);
return true;
});
EXPECT_EQ(subRanges, test.expectedSubRanges) << ", test index = " << std::distance(std::cbegin(testCases), &test);
}
}
TEST_F(DatabaseFixture, Common_IdType)
{
using namespace Database;