blob: c5317490259640af985cf1f5ec4b0e2927d74968 [file]
#include "redfish_to_uhm_trie_node.hpp"
#include <memory>
#include <string>
#include <string_view>
#include <utility>
#include "re2/re2.h"
namespace devpath_plugin {
namespace {
bool IsRegexSegment(std::string_view segment) {
return segment.find_first_of("[]*+?|()^$\\") != std::string_view::npos;
}
} // namespace
RedfishToUhmTrieNode* RedfishToUhmTrieNode::GetOrCreateChild(
std::string_view segment) {
if (IsRegexSegment(segment)) {
return GetOrCreateRegexChild(segment);
}
return GetOrCreateExactChild(segment);
}
const RedfishToUhmTrieNode* RedfishToUhmTrieNode::GetChild(
std::string_view segment) const {
const RedfishToUhmTrieNode* next = GetExactChild(segment);
if (next != nullptr) {
return next;
}
return GetRegexChild(segment);
}
RedfishToUhmTrieNode* RedfishToUhmTrieNode::GetOrCreateExactChild(
std::string_view segment) {
std::unique_ptr<RedfishToUhmTrieNode>& child = exact_children_[segment];
if (!child) {
child = std::make_unique<RedfishToUhmTrieNode>();
}
return child.get();
}
RedfishToUhmTrieNode* RedfishToUhmTrieNode::GetOrCreateRegexChild(
std::string_view pattern) {
for (const auto& child : regex_children_) {
if (child.pattern == pattern) {
return child.node.get();
}
}
auto new_node = std::make_unique<RedfishToUhmTrieNode>();
RedfishToUhmTrieNode* raw_node = new_node.get();
regex_children_.push_back(RegexChild{
std::string(pattern),
std::make_unique<RE2>(pattern),
std::move(new_node),
});
return raw_node;
}
const RedfishToUhmTrieNode* RedfishToUhmTrieNode::GetExactChild(
std::string_view segment) const {
auto it = exact_children_.find(segment);
if (it == exact_children_.end()) {
return nullptr;
}
return it->second.get();
}
const RedfishToUhmTrieNode* RedfishToUhmTrieNode::GetRegexChild(
std::string_view segment) const {
for (const auto& child : regex_children_) {
if (child.regex && RE2::FullMatch(segment, *child.regex)) {
return child.node.get();
}
}
return nullptr;
}
} // namespace devpath_plugin