#ifndef SOPHIAR2_STRING_MAP_HPP #define SOPHIAR2_STRING_MAP_HPP #include #include #include #include #include namespace sophiar { template class string_map { public: template void insert(std::string_view str, Args... args) { insert(hash_sv(str), std::forward(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::unordered_map m; template void insert(size_t index, Args... args) { static_assert(std::is_constructible_v); assert(!m.contains(index)); m.emplace(std::piecewise_construct, std::forward_as_tuple(index), std::forward_as_tuple(std::forward(args)...)); } }; } #endif //SOPHIAR2_STRING_MAP_HPP