mirror of
https://github.com/hedge-dev/XenonRecomp.git
synced 2025-04-23 01:01:26 +00:00
64 lines
1.4 KiB
C++
64 lines
1.4 KiB
C++
#pragma once
|
|
#include "symbol.h"
|
|
#include <set>
|
|
|
|
class SymbolTable : public std::multiset<Symbol, SymbolComparer>
|
|
{
|
|
public:
|
|
const_iterator find(size_t address) const
|
|
{
|
|
auto [beginIt, endIt] = equal_range(address);
|
|
if (beginIt == endIt)
|
|
{
|
|
return end();
|
|
}
|
|
|
|
size_t closest{ address - beginIt->address };
|
|
auto match = end();
|
|
for (auto it = beginIt; it != endIt; ++it)
|
|
{
|
|
if (address < it->address || address >= it->address + it->size)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
const size_t distance = address - it->address;
|
|
if (distance <= closest)
|
|
{
|
|
match = it;
|
|
closest = distance;
|
|
}
|
|
}
|
|
|
|
return match;
|
|
}
|
|
|
|
iterator find(size_t address)
|
|
{
|
|
auto [beginIt, endIt] = equal_range(address);
|
|
if (beginIt == endIt)
|
|
{
|
|
return end();
|
|
}
|
|
|
|
size_t closest{ address - beginIt->address };
|
|
auto match = end();
|
|
for (auto it = beginIt; it != endIt; ++it)
|
|
{
|
|
if (address < it->address || address >= it->address + it->size)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
const size_t distance = address - it->address;
|
|
if (distance <= closest)
|
|
{
|
|
match = it;
|
|
closest = distance;
|
|
}
|
|
}
|
|
|
|
return match;
|
|
}
|
|
};
|