Xplace_for_ICCAD/cpp_to_py/common/lib/EnumNameMap.h
2025-05-02 14:18:01 +08:00

62 lines
1.5 KiB
C++

#pragma once
#include <map>
#include <string>
#include <string_view>
namespace gt {
using std::initializer_list;
using std::map;
using std::pair;
using std::string;
using std::string_view;
template <class ENUM>
class EnumNameMap {
public:
EnumNameMap(initializer_list<pair<const ENUM, string>> enum_names);
const string find(ENUM key) const;
ENUM find(string name, ENUM unknown_key) const;
void find(string name, ENUM &key, bool &exists) const;
private:
map<ENUM, string> enum_map_;
map<string, ENUM> name_map_;
};
template <class ENUM>
EnumNameMap<ENUM>::EnumNameMap(initializer_list<pair<const ENUM, string>> enum_names) : enum_map_(enum_names) {
for (const auto &[key, name] : enum_map_) name_map_[name] = key;
}
template <class ENUM>
const string EnumNameMap<ENUM>::find(ENUM key) const {
auto find_iter = enum_map_.find(key);
if (find_iter != enum_map_.end())
return find_iter->second;
else
return nullptr;
}
template <class ENUM>
void EnumNameMap<ENUM>::find(string name, ENUM &key, bool &exists) const {
auto find_iter = name_map_.find(name);
if (find_iter != name_map_.end()) {
key = find_iter->second;
exists = true;
} else
exists = false;
}
template <class ENUM>
ENUM EnumNameMap<ENUM>::find(string name, ENUM unknown_key) const {
auto find_iter = name_map_.find(name);
if (find_iter != name_map_.end())
return find_iter->second;
else
return unknown_key;
}
} // namespace gt