From 961a6bdf6c66bef66726c0bc0d1ec8fef1b42470 Mon Sep 17 00:00:00 2001 From: Michael Mandl Date: Sat, 23 Mar 2024 13:43:58 +0100 Subject: [PATCH] refactor: backport to MinGW 11 --- lib_vector_search/include/tree_finder.h | 4 +++- lib_vector_search/src/tree_finder.cpp | 16 +++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/lib_vector_search/include/tree_finder.h b/lib_vector_search/include/tree_finder.h index 6d74580..53f9769 100644 --- a/lib_vector_search/include/tree_finder.h +++ b/lib_vector_search/include/tree_finder.h @@ -8,9 +8,11 @@ class SearchTreeNode { private: WordRefList words_; - std::unordered_map children_; + std::unordered_map children_; public: + ~SearchTreeNode(); + void insert(std::string_view partial_word, const std::string *original_word); const SearchTreeNode *find(std::string_view search_term) const; diff --git a/lib_vector_search/src/tree_finder.cpp b/lib_vector_search/src/tree_finder.cpp index 660f1f7..75a023e 100644 --- a/lib_vector_search/src/tree_finder.cpp +++ b/lib_vector_search/src/tree_finder.cpp @@ -2,12 +2,22 @@ using std::string, std::string_view; +SearchTreeNode::~SearchTreeNode() { + for (auto [_, child] : children_) { + delete child; + } +} + void SearchTreeNode::insert(string_view partial_word, const string *original_word) { if (partial_word.empty()) { words_.push_back(original_word); } else { - children_[partial_word.front()].insert( + const auto &initial = partial_word.front(); + if (!children_.contains(initial)) { + children_.insert({initial, new SearchTreeNode}); + } + children_[partial_word.front()]->insert( string_view(partial_word).substr(1, partial_word.length()), original_word); } @@ -20,7 +30,7 @@ const SearchTreeNode *SearchTreeNode::find(string_view search_term) const { auto child = children_.find(search_term.front()); if (child != children_.cend()) { - return child->second.find(search_term.substr(1, search_term.length())); + return child->second->find(search_term.substr(1, search_term.length())); } return nullptr; @@ -29,7 +39,7 @@ const SearchTreeNode *SearchTreeNode::find(string_view search_term) const { WordRefList SearchTreeNode::words() const { WordRefList results(words_); for (const auto &child : children_) { - auto child_words = child.second.words(); + auto child_words = child.second->words(); std::move(child_words.begin(), child_words.end(), std::back_inserter(results)); }