diff --git a/src/bakatools/data_type/trie.h b/src/bakatools/data_type/trie.h new file mode 100644 index 0000000..7bc55fc --- /dev/null +++ b/src/bakatools/data_type/trie.h @@ -0,0 +1,56 @@ +#pragma once + +#include +namespace Bk::DataType { + template + struct Trie + { + Trie() = default; + ~Trie() + { + for (auto node : nodes) + delete node.second; + } + + void add_nodes(const K* path, unsigned int length, V val) + { + if (length) + { + if (nodes.find(*path) == nodes.end()) + nodes.insert({ *path, new Trie() }); + nodes[*path]->add_nodes(++path, --length, val); + } + else if (!nodes.size()) + { + value = val; + terminal = true; + } + else + { + value = val; + terminal = false; + } + } + + Trie* get_node(const K* path, unsigned int length) + { + if (length > 1) + { + if (nodes.find(*path) == nodes.end()) + return nullptr; + return nodes[*path]->get_node(++path, --length); + } + else if (length > 0) + { + if (nodes.find(*path) == nodes.end()) + return nullptr; + return nodes[*path]; + } + else return this; + } + + std::unordered_map nodes; + V value; + bool terminal; + }; +} \ No newline at end of file