string_map.hpp 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #ifndef SOPHIAR2_STRING_MAP_HPP
  2. #define SOPHIAR2_STRING_MAP_HPP
  3. #include <cassert>
  4. #include <string>
  5. #include <string_view>
  6. #include <type_traits>
  7. #include <unordered_map>
  8. namespace sophiar {
  9. template<typename T>
  10. class string_map {
  11. public:
  12. template<typename ...Args>
  13. void insert(std::string_view str, Args... args) {
  14. insert(hash_sv(str), std::forward<Args>(args)...);
  15. }
  16. bool contains(std::string_view str) const {
  17. return m.contains(hash_sv(str));
  18. }
  19. T &query(std::string_view str) {
  20. assert(contains(str));
  21. return m.at(hash_sv(str));
  22. }
  23. const T &query(std::string_view str) const {
  24. assert(contains(str));
  25. return m.at(hash_sv(str));
  26. }
  27. void clear() {
  28. m.clear();
  29. }
  30. private:
  31. static constexpr auto hash_sv = std::hash<std::string_view>{};
  32. std::unordered_map<std::size_t, T> m;
  33. template<typename ...Args>
  34. void insert(size_t index, Args... args) {
  35. static_assert(std::is_constructible_v<T, Args...>);
  36. assert(!m.contains(index));
  37. m.emplace(std::piecewise_construct,
  38. std::forward_as_tuple(index),
  39. std::forward_as_tuple(std::forward<Args>(args)...));
  40. }
  41. };
  42. }
  43. #endif //SOPHIAR2_STRING_MAP_HPP