sat-solver/dict.hpp
2025-03-07 09:45:39 -06:00

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