mirror of
https://github.com/hedge-dev/XenonRecomp.git
synced 2025-06-06 18:31:03 +00:00
64 lines
1.5 KiB
C++
64 lines
1.5 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 iter = std::multiset<Symbol, SymbolComparer>::find(address);
|
|
if (iter == end())
|
|
{
|
|
return iter;
|
|
}
|
|
|
|
size_t closest{ address - iter->address };
|
|
auto match = end();
|
|
for (; iter != end(); ++iter)
|
|
{
|
|
if (address < iter->address || address >= iter->address + iter->size)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
const size_t distance = address - iter->address;
|
|
if (distance <= closest)
|
|
{
|
|
match = iter;
|
|
closest = distance;
|
|
}
|
|
}
|
|
|
|
return match;
|
|
}
|
|
|
|
iterator find(size_t address)
|
|
{
|
|
auto iter = std::multiset<Symbol, SymbolComparer>::find(address);
|
|
if (iter == end())
|
|
{
|
|
return iter;
|
|
}
|
|
|
|
size_t closest{ address - iter->address };
|
|
auto match = end();
|
|
for (; iter != end(); ++iter)
|
|
{
|
|
if (address < iter->address || address >= iter->address + iter->size)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
const size_t distance = address - iter->address;
|
|
if (distance <= closest)
|
|
{
|
|
match = iter;
|
|
closest = distance;
|
|
}
|
|
}
|
|
|
|
return match;
|
|
}
|
|
};
|