diff --git a/deps/ox/src/ox/std/hashmap.hpp b/deps/ox/src/ox/std/hashmap.hpp index b72ec013..b0b0e6f9 100644 --- a/deps/ox/src/ox/std/hashmap.hpp +++ b/deps/ox/src/ox/std/hashmap.hpp @@ -24,8 +24,8 @@ class HashMap { K key = {}; T value = {}; }; - Vector m_keys; - Vector m_pairs; + mutable Vector m_keys; + mutable Vector m_pairs; public: explicit HashMap(std::size_t size = 100); @@ -38,6 +38,11 @@ class HashMap { HashMap &operator=(HashMap &other); + /** + * K is assumed to be a null terminated string. + */ + const T &operator[](K key) const; + /** * K is assumed to be a null terminated string. */ @@ -48,14 +53,14 @@ class HashMap { */ T &at(K key); - bool contains(K key); + bool contains(K key) const; std::size_t size() const noexcept; const Vector &keys() const noexcept; private: - void expand(); + void expand() const; /** * K is assumed to be a null terminated string. @@ -65,7 +70,7 @@ class HashMap { /** * K is assumed to be a null terminated string. */ - Pair *&access(Vector &pairs, K key); + Pair *&access(Vector &pairs, K key) const; }; @@ -107,6 +112,20 @@ HashMap &HashMap::operator=(HashMap &other) { return *this; } +template +const T &HashMap::operator[](K k) const { + auto &p = access(m_pairs, k); + if (p == nullptr) { + if (m_pairs.size() * 0.7 < m_keys.size()) { + expand(); + } + p = new Pair; + p->key = k; + m_keys.push_back(k); + } + return p->value; +} + template T &HashMap::operator[](K k) { auto &p = access(m_pairs, k); @@ -127,7 +146,7 @@ T &HashMap::at(K k) { } template -bool HashMap::contains(K k) { +bool HashMap::contains(K k) const { return access(m_pairs, k) != nullptr; } @@ -142,7 +161,7 @@ const Vector &HashMap::keys() const noexcept { } template -void HashMap::expand() { +void HashMap::expand() const { Vector r; for (std::size_t i = 0; i < m_keys.size(); i++) { auto k = m_keys[i]; @@ -161,7 +180,7 @@ uint64_t HashMap::hash(K k, int len) noexcept { } template -typename HashMap::Pair *&HashMap::access(Vector &pairs, K k) { +typename HashMap::Pair *&HashMap::access(Vector &pairs, K k) const { auto h = hash(k) % pairs.size(); auto hashStr = reinterpret_cast(&h); while (1) {