mirror of
https://gitee.com/anod/open_agb_firm.git
synced 2025-05-06 22:04:10 +08:00
49 lines
942 B
C
49 lines
942 B
C
#pragma once
|
|
|
|
static rbtree_t sAddrMap;
|
|
|
|
struct addrMapNode
|
|
{
|
|
rbtree_node node;
|
|
MemChunk chunk;
|
|
};
|
|
|
|
#define getAddrMapNode(x) rbtree_item((x), addrMapNode, node)
|
|
|
|
static int addrMapNodeComparator(const rbtree_node_t* _lhs, const rbtree_node_t* _rhs)
|
|
{
|
|
auto lhs = getAddrMapNode(_lhs)->chunk.addr;
|
|
auto rhs = getAddrMapNode(_rhs)->chunk.addr;
|
|
if (lhs < rhs)
|
|
return -1;
|
|
if (lhs > rhs)
|
|
return 1;
|
|
return 0;
|
|
}
|
|
|
|
static void addrMapNodeDestructor(rbtree_node_t* a)
|
|
{
|
|
free(getAddrMapNode(a));
|
|
}
|
|
|
|
static addrMapNode* getNode(void* addr)
|
|
{
|
|
addrMapNode n;
|
|
n.chunk.addr = (u8*)addr;
|
|
auto p = rbtree_find(&sAddrMap, &n.node);
|
|
return p ? getAddrMapNode(p) : nullptr;
|
|
}
|
|
|
|
static addrMapNode* newNode(const MemChunk& chunk)
|
|
{
|
|
auto p = (addrMapNode*)malloc(sizeof(addrMapNode));
|
|
if (!p) return nullptr;
|
|
p->chunk = chunk;
|
|
return p;
|
|
}
|
|
|
|
static void delNode(addrMapNode* node)
|
|
{
|
|
rbtree_remove(&sAddrMap, &node->node, addrMapNodeDestructor);
|
|
}
|