| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- #ifndef SOPHIAR2_STRING_MAP_HPP
- #define SOPHIAR2_STRING_MAP_HPP
- #include <cassert>
- #include <string>
- #include <string_view>
- #include <type_traits>
- #include <unordered_map>
- namespace sophiar {
- template<typename T>
- class string_map {
- public:
- template<typename ...Args>
- void insert(std::string_view str, Args... args) {
- insert(hash_sv(str), std::forward<Args>(args)...);
- }
- bool contains(std::string_view str) const {
- return m.contains(hash_sv(str));
- }
- T &query(std::string_view str) {
- assert(contains(str));
- return m.at(hash_sv(str));
- }
- const T &query(std::string_view str) const {
- assert(contains(str));
- return m.at(hash_sv(str));
- }
- void clear() {
- m.clear();
- }
- private:
- static constexpr auto hash_sv = std::hash<std::string_view>{};
- std::unordered_map<std::size_t, T> m;
- template<typename ...Args>
- void insert(size_t index, Args... args) {
- static_assert(std::is_constructible_v<T, Args...>);
- assert(!m.contains(index));
- m.emplace(std::piecewise_construct,
- std::forward_as_tuple(index),
- std::forward_as_tuple(std::forward<Args>(args)...));
- }
- };
- }
- #endif //SOPHIAR2_STRING_MAP_HPP
|