12 SlotSizer(
const std::vector<uint32_t>& offsets, uint32_t dataStart,
size_t romSize)
13 : mStray(offsets.size(),
false), mDataStart(dataStart), mRomSize(romSize) {
14 mBoundaries.reserve(offsets.size());
16 for (
size_t i = 0; i < offsets.size(); i++) {
17 if (offsets[i] < high) {
23 mBoundaries.push_back(offsets[i]);
25 std::sort(mBoundaries.begin(), mBoundaries.end());
26 mBoundaries.erase(std::unique(mBoundaries.begin(), mBoundaries.end()), mBoundaries.end());
27 mRegionEnd = mBoundaries.empty() ? 0 : mBoundaries.back();
30 uint32_t operator()(uint32_t off)
const {
31 if (off >= mRegionEnd) {
34 const auto next = std::upper_bound(mBoundaries.begin(), mBoundaries.end(), off);
35 const uint32_t end = std::min(next != mBoundaries.end() ? *next : mRegionEnd, mRegionEnd);
39 const uint64_t start =
static_cast<uint64_t
>(mDataStart) + off;
40 if (start >= mRomSize) {
43 return static_cast<uint32_t
>(std::min<uint64_t>(end - off, mRomSize - start));
46 bool IsStray(
size_t index)
const {
47 return index < mStray.size() && mStray[index];
50 size_t StrayCount()
const {
54 uint32_t RegionEnd()
const {
59 std::vector<uint32_t> mBoundaries;
60 std::vector<bool> mStray;
61 size_t mStrayCount = 0;
62 uint32_t mRegionEnd = 0;