2023-12-17 03:29:08 -08:00
|
|
|
/*
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "EHS.h"
|
|
|
|
|
|
|
|
#include <type_traits>
|
|
|
|
|
2023-12-17 15:56:13 -08:00
|
|
|
namespace ehs
|
2023-12-17 03:29:08 -08:00
|
|
|
{
|
|
|
|
template<typename V>
|
|
|
|
class HashNode
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
V value;
|
|
|
|
HashNode child;
|
|
|
|
|
|
|
|
public:
|
|
|
|
HashNode()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
HashNode(const V value)
|
|
|
|
: value(value)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
HashNode(const HashNode& node)
|
|
|
|
: value(node.value), child(node.child)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
HashNode& operator==(const HashNode& node)
|
|
|
|
{
|
|
|
|
value = node.value;
|
|
|
|
child = node.child;
|
|
|
|
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SetValue(const V value)
|
|
|
|
{
|
|
|
|
this->value = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
V GetValue() const
|
|
|
|
{
|
|
|
|
return value;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SetChild(const HashNode child)
|
|
|
|
{
|
|
|
|
this->child = child;
|
|
|
|
}
|
|
|
|
|
|
|
|
HashNode* GetChild()
|
|
|
|
{
|
|
|
|
return &child;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
/// 1000
|
|
|
|
template<typename V, typename N = USize>
|
|
|
|
class HashMap
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
HashNode<V>** data;
|
|
|
|
N size;
|
|
|
|
|
|
|
|
public:
|
|
|
|
~HashMap()
|
|
|
|
{
|
|
|
|
if (data)
|
|
|
|
{
|
|
|
|
delete[] data;
|
|
|
|
data = nullptr;
|
|
|
|
size = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
HashMap()
|
|
|
|
: data(nullptr), size(0)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
HashMap(const N size)
|
|
|
|
: data(new HashNode<V>(size)), size(size)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
HashMap(const HashMap& map)
|
|
|
|
: data(new HashNode<V>*(map.size)), size(map.size)
|
|
|
|
{
|
|
|
|
for (N i = 0; i < map.size; ++i)
|
|
|
|
data[i] = map.data[i];
|
|
|
|
}
|
|
|
|
|
|
|
|
HashMap& operator=(const HashMap& map)
|
|
|
|
{
|
|
|
|
if (this == &map)
|
|
|
|
return *this;
|
|
|
|
|
|
|
|
data = new HashNode<V>*(map.size);
|
|
|
|
size = map.size;
|
|
|
|
|
|
|
|
for (N i = 0; i < size; ++i)
|
|
|
|
data[i] = map.data[i];
|
|
|
|
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
template<typename K>
|
|
|
|
void Insert(const K key, const V value)
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
template<>
|
|
|
|
void Insert(const Str_8& key, const V value)
|
|
|
|
{
|
|
|
|
N hash = 0;
|
|
|
|
|
|
|
|
for (N i = 0; i < key.Size(); ++i)
|
|
|
|
hash += key[i];
|
|
|
|
|
|
|
|
hash %= size;
|
|
|
|
|
|
|
|
if (data[hash])
|
|
|
|
{
|
|
|
|
HashNode<V> child = data[hash]->GetChild();
|
|
|
|
if (child)
|
|
|
|
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
data[hash] = new HashNode<V>(value);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
SetChildRecursive()
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
*/
|