mirror of
https://github.com/Fennix-Project/Kernel.git
synced 2025-07-23 21:21:43 +00:00
.github
.vscode
Architecture
Core
Execute
FileSystem
Files
GUI
Library
Network
Profiling
Recovery
SystemCalls
Tasking
Tests
include
boot
filesystem
net
abi.h
assert.h
atomic.hpp
bitmap.hpp
cargs.h
convert.h
cpu.hpp
crc32.h
cstring
cwalk.h
debug.h
disk.hpp
display.hpp
driver.hpp
dumper.hpp
elf.h
exec.hpp
filesystem.hpp
gui.hpp
hashmap.hpp
interrupts.hpp
io.h
ipc.hpp
kconfig.hpp
limits.h
lock.hpp
md5.h
memory.hpp
msexec.h
pci.hpp
power.hpp
printf.h
rand.hpp
recovery.hpp
smartptr.hpp
smp.hpp
std.hpp
stddef.h
stdint.h
string.hpp
symbols.hpp
sys.h
syscalls.hpp
task.hpp
time.hpp
types.h
uart.hpp
vector.hpp
.gitignore
DAPI.hpp
Doxyfile
Fex.hpp
KConfig.cpp
KThread.cpp
Kernel.cpp
LICENSE
Makefile
README.md
dump.sh
ipc.h
kernel.h
syscalls.h
105 lines
2.3 KiB
C++
105 lines
2.3 KiB
C++
#pragma once
|
|
|
|
#define HASHMAP_ERROR -0x8A50
|
|
|
|
template <typename K, typename V>
|
|
class HashNode
|
|
{
|
|
public:
|
|
V Value;
|
|
K Key;
|
|
|
|
HashNode(K Key, V Value)
|
|
{
|
|
this->Value = Value;
|
|
this->Key = Key;
|
|
}
|
|
};
|
|
|
|
template <typename K, typename V>
|
|
class HashMap
|
|
{
|
|
int HashMapSize;
|
|
int HashMapCapacity;
|
|
HashNode<K, V> **Nodes;
|
|
HashNode<K, V> *DummyNode;
|
|
|
|
public:
|
|
HashMap()
|
|
{
|
|
HashMapCapacity = 20;
|
|
HashMapSize = 0;
|
|
Nodes = new HashNode<K, V> *[HashMapCapacity];
|
|
for (int i = 0; i < HashMapCapacity; i++)
|
|
Nodes[i] = nullptr;
|
|
DummyNode = new HashNode<K, V>(-1, -1);
|
|
}
|
|
|
|
~HashMap()
|
|
{
|
|
for (int i = 0; i < HashMapCapacity; i++)
|
|
if (Nodes[i] != nullptr)
|
|
delete Nodes[i];
|
|
delete[] Nodes;
|
|
delete DummyNode;
|
|
}
|
|
|
|
int HashCode(K Key) { return Key % HashMapCapacity; }
|
|
|
|
void AddNode(K Key, V Value)
|
|
{
|
|
HashNode<K, V> *tmp = new HashNode<K, V>(Key, Value);
|
|
int Index = HashCode(Key);
|
|
|
|
while (Nodes[Index] != nullptr && Nodes[Index]->Key != Key && Nodes[Index]->Key != (K)-1)
|
|
{
|
|
Index++;
|
|
Index %= HashMapCapacity;
|
|
}
|
|
|
|
if (Nodes[Index] == nullptr || Nodes[Index]->Key == (K)-1)
|
|
HashMapSize++;
|
|
Nodes[Index] = tmp;
|
|
}
|
|
|
|
V DeleteNode(int Key)
|
|
{
|
|
int Index = HashCode(Key);
|
|
|
|
while (Nodes[Index] != nullptr)
|
|
{
|
|
if (Nodes[Index]->Key == Key)
|
|
{
|
|
HashNode<K, V> *tmp = Nodes[Index];
|
|
Nodes[Index] = DummyNode;
|
|
HashMapSize--;
|
|
return tmp->Value;
|
|
}
|
|
Index++;
|
|
Index %= HashMapCapacity;
|
|
}
|
|
return HASHMAP_ERROR;
|
|
}
|
|
|
|
V Get(int Key)
|
|
{
|
|
int Index = HashCode(Key);
|
|
int Iterate = 0;
|
|
|
|
while (Nodes[Index] != nullptr)
|
|
{
|
|
if (Iterate++ > HashMapCapacity)
|
|
return HASHMAP_ERROR;
|
|
|
|
if (Nodes[Index]->Key == (K)Key)
|
|
return Nodes[Index]->Value;
|
|
Index++;
|
|
Index %= HashMapCapacity;
|
|
}
|
|
return HASHMAP_ERROR;
|
|
}
|
|
|
|
int Size() { return HashMapSize; }
|
|
bool IsEmpty() { return HashMapSize == 0; }
|
|
};
|