Added some foreachSubRange
This commit is contained in:
@@ -41,6 +41,23 @@ namespace Database
|
|||||||
operator bool() const { return size != 0; }
|
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>
|
template <typename T>
|
||||||
struct RangeResults
|
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)
|
TEST_F(DatabaseFixture, Common_IdType)
|
||||||
{
|
{
|
||||||
using namespace Database;
|
using namespace Database;
|
||||||
|
|||||||
Reference in New Issue
Block a user