From 0fdf30ef8fad0032ad088e6d366f7c31ee178ec3 Mon Sep 17 00:00:00 2001 From: anulax1225 Date: Thu, 21 Mar 2024 00:51:39 +0100 Subject: [PATCH] Created a generic RadixTree --- src/bakatools/data_type/trie.h | 56 ++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/bakatools/data_type/trie.h 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