refactor: backport to MinGW 11
This commit is contained in:
parent
1441a869c2
commit
961a6bdf6c
2 changed files with 16 additions and 4 deletions
|
@ -8,9 +8,11 @@
|
||||||
class SearchTreeNode {
|
class SearchTreeNode {
|
||||||
private:
|
private:
|
||||||
WordRefList words_;
|
WordRefList words_;
|
||||||
std::unordered_map<char, SearchTreeNode> children_;
|
std::unordered_map<char, SearchTreeNode *> children_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
~SearchTreeNode();
|
||||||
|
|
||||||
void insert(std::string_view partial_word, const std::string *original_word);
|
void insert(std::string_view partial_word, const std::string *original_word);
|
||||||
const SearchTreeNode *find(std::string_view search_term) const;
|
const SearchTreeNode *find(std::string_view search_term) const;
|
||||||
|
|
||||||
|
|
|
@ -2,12 +2,22 @@
|
||||||
|
|
||||||
using std::string, std::string_view;
|
using std::string, std::string_view;
|
||||||
|
|
||||||
|
SearchTreeNode::~SearchTreeNode() {
|
||||||
|
for (auto [_, child] : children_) {
|
||||||
|
delete child;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void SearchTreeNode::insert(string_view partial_word,
|
void SearchTreeNode::insert(string_view partial_word,
|
||||||
const string *original_word) {
|
const string *original_word) {
|
||||||
if (partial_word.empty()) {
|
if (partial_word.empty()) {
|
||||||
words_.push_back(original_word);
|
words_.push_back(original_word);
|
||||||
} else {
|
} 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()),
|
string_view(partial_word).substr(1, partial_word.length()),
|
||||||
original_word);
|
original_word);
|
||||||
}
|
}
|
||||||
|
@ -20,7 +30,7 @@ const SearchTreeNode *SearchTreeNode::find(string_view search_term) const {
|
||||||
|
|
||||||
auto child = children_.find(search_term.front());
|
auto child = children_.find(search_term.front());
|
||||||
if (child != children_.cend()) {
|
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;
|
return nullptr;
|
||||||
|
@ -29,7 +39,7 @@ const SearchTreeNode *SearchTreeNode::find(string_view search_term) const {
|
||||||
WordRefList SearchTreeNode::words() const {
|
WordRefList SearchTreeNode::words() const {
|
||||||
WordRefList results(words_);
|
WordRefList results(words_);
|
||||||
for (const auto &child : children_) {
|
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::move(child_words.begin(), child_words.end(),
|
||||||
std::back_inserter(results));
|
std::back_inserter(results));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue