145 lines
2.5 KiB
C++
145 lines
2.5 KiB
C++
|
|
#ifndef CLASS_DICT
|
|
#define CLASS_DICT
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
#include "avl.hpp"
|
|
|
|
template <
|
|
typename K,
|
|
typename V> class dict
|
|
{
|
|
public:
|
|
struct keyvalue_pair
|
|
{
|
|
K key;
|
|
V value;
|
|
|
|
keyvalue_pair(K _key):
|
|
key(_key), value()
|
|
{
|
|
;
|
|
}
|
|
|
|
keyvalue_pair(K _key, V _value):
|
|
key(_key), value(_value)
|
|
{
|
|
;
|
|
}
|
|
|
|
auto operator <=> (const struct keyvalue_pair& other) const
|
|
{
|
|
return (key <=> other.key);
|
|
}
|
|
};
|
|
|
|
private:
|
|
avl_tree_t<keyvalue_pair> tree;
|
|
|
|
public:
|
|
avl_tree_t<keyvalue_pair>::iterable begin()
|
|
{
|
|
return tree.begin();
|
|
}
|
|
|
|
avl_tree_t<keyvalue_pair>::iterable end()
|
|
{
|
|
return tree.end();
|
|
}
|
|
|
|
avl_tree_t<keyvalue_pair>::iterable begin() const
|
|
{
|
|
return tree.begin();
|
|
}
|
|
|
|
avl_tree_t<keyvalue_pair>::iterable end() const
|
|
{
|
|
return tree.end();
|
|
}
|
|
|
|
public:
|
|
dict()
|
|
{
|
|
;
|
|
}
|
|
|
|
struct keyvalue_pair* add(K key, V value)
|
|
{
|
|
struct keyvalue_pair* retval = NULL;
|
|
|
|
struct keyvalue_pair pair(key, value);
|
|
|
|
auto node = tree.insert(pair);
|
|
|
|
if (node)
|
|
{
|
|
retval = &node->item;
|
|
}
|
|
else
|
|
{
|
|
abort();
|
|
}
|
|
|
|
return retval;
|
|
}
|
|
|
|
bool has(K key) const
|
|
{
|
|
// ENTER;
|
|
|
|
struct keyvalue_pair pair(key);
|
|
|
|
auto node = tree.search(pair);
|
|
|
|
bool retval = !!node;
|
|
|
|
// dpvb(retval);
|
|
|
|
// EXIT;
|
|
return retval;
|
|
}
|
|
|
|
V& operator[](K key) const
|
|
{
|
|
struct keyvalue_pair pair(key);
|
|
|
|
auto node = tree.search(pair);
|
|
|
|
if (!node)
|
|
{
|
|
puts("dict.hpp: key loop failed");
|
|
abort();
|
|
}
|
|
|
|
return node->item.value;
|
|
}
|
|
|
|
~dict()
|
|
{
|
|
;
|
|
}
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|