blob: 344ff8aa0caee0d824b2c3a60451da85ce45bfc5 [file]
#ifndef THIRD_PARTY_GBMCWEB_DEVPATH_PLUGIN_REDFISH_TO_UHM_TRIE_NODE_H_
#define THIRD_PARTY_GBMCWEB_DEVPATH_PLUGIN_REDFISH_TO_UHM_TRIE_NODE_H_
#include <memory>
#include <string>
#include <string_view>
#include <vector>
#include "absl/container/flat_hash_map.h"
#include "redfish_to_uhm_mapping_value.hpp"
#include "re2/re2.h"
namespace devpath_plugin {
class RedfishToUhmTrieNode {
public:
RedfishToUhmTrieNode() = default;
RedfishToUhmTrieNode(const RedfishToUhmTrieNode&) = delete;
RedfishToUhmTrieNode& operator=(const RedfishToUhmTrieNode&) = delete;
RedfishToUhmTrieNode(RedfishToUhmTrieNode&&) = default;
RedfishToUhmTrieNode& operator=(RedfishToUhmTrieNode&&) = default;
// Retrieve/create a child node for insertion. Handles regex vs exact matching
// internally.
RedfishToUhmTrieNode* GetOrCreateChild(std::string_view segment);
// Retrieve a matching child node for lookup. Falls back to satisfying regex
// matching.
const RedfishToUhmTrieNode* GetChild(std::string_view segment) const;
void SetValue(const std::shared_ptr<const RedfishToUhmMappingValue>& value) {
value_ = value;
}
std::shared_ptr<const RedfishToUhmMappingValue> GetValue() const {
return value_;
}
private:
struct RegexChild {
std::string pattern;
std::unique_ptr<RE2> regex;
std::unique_ptr<RedfishToUhmTrieNode> node;
};
// Internal helper methods for matching representation
RedfishToUhmTrieNode* GetOrCreateExactChild(std::string_view segment);
RedfishToUhmTrieNode* GetOrCreateRegexChild(std::string_view pattern);
const RedfishToUhmTrieNode* GetExactChild(std::string_view segment) const;
const RedfishToUhmTrieNode* GetRegexChild(std::string_view segment) const;
absl::flat_hash_map<std::string, std::unique_ptr<RedfishToUhmTrieNode>>
exact_children_;
std::vector<RegexChild> regex_children_;
std::shared_ptr<const RedfishToUhmMappingValue> value_;
};
} // namespace devpath_plugin
#endif // THIRD_PARTY_GBMCWEB_DEVPATH_PLUGIN_REDFISH_TO_UHM_TRIE_NODE_H_