diff --git a/deps/ox/src/ox/clargs/clargs.cpp b/deps/ox/src/ox/clargs/clargs.cpp index 0f34d9456..eb18a7920 100644 --- a/deps/ox/src/ox/clargs/clargs.cpp +++ b/deps/ox/src/ox/clargs/clargs.cpp @@ -39,15 +39,17 @@ ClArgs::ClArgs(int argc, const char **args) { } bool ClArgs::getBool(const char *arg) const { - return m_bools[arg]; + auto out = m_ints.at(arg); + return out.value ? *out.value : false; } String ClArgs::getString(const char *argName, const char *defaultArg) const { - return m_strings.contains(argName) ? m_strings[argName].c_str() : defaultArg; + return m_strings.contains(argName) ? m_strings.at(argName).value->c_str() : defaultArg; } int ClArgs::getInt(const char *arg) const { - return m_ints[arg]; + auto out = m_ints.at(arg); + return out.value ? *out.value : 0; } } diff --git a/deps/ox/src/ox/fs/CMakeLists.txt b/deps/ox/src/ox/fs/CMakeLists.txt index a02c39615..792e8597c 100644 --- a/deps/ox/src/ox/fs/CMakeLists.txt +++ b/deps/ox/src/ox/fs/CMakeLists.txt @@ -29,21 +29,6 @@ target_link_libraries( OxMetalClaw ) -if(OX_BUILD_EXEC STREQUAL "ON") - #add_executable( - # oxfstool - # toollib.cpp - # oxfstool.cpp - #) - #set_target_properties(oxfstool PROPERTIES OUTPUT_NAME oxfs) - #target_link_libraries( - # oxfstool - # OxFS - # OxMetalClaw - # OxStd - #) -endif() - install( FILES filestore/filestoretemplate.hpp diff --git a/deps/ox/src/ox/std/hashmap.hpp b/deps/ox/src/ox/std/hashmap.hpp index b0b0e6f9f..359c22c7c 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 = {}; }; - mutable Vector m_keys; - mutable Vector m_pairs; + Vector m_keys; + Vector m_pairs; public: explicit HashMap(std::size_t size = 100); @@ -38,11 +38,6 @@ 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. */ @@ -53,6 +48,11 @@ class HashMap { */ T &at(K key); + /** + * K is assumed to be a null terminated string. + */ + Result at(K key) const; + bool contains(K key) const; std::size_t size() const noexcept; @@ -60,7 +60,7 @@ class HashMap { const Vector &keys() const noexcept; private: - void expand() const; + void expand(); /** * K is assumed to be a null terminated string. @@ -70,7 +70,12 @@ class HashMap { /** * K is assumed to be a null terminated string. */ - Pair *&access(Vector &pairs, K key) const; + Pair *const&access(const Vector &pairs, K key) const; + + /** + * K is assumed to be a null terminated string. + */ + Pair *&access(Vector &pairs, K key); }; @@ -112,20 +117,6 @@ 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); @@ -145,6 +136,15 @@ T &HashMap::at(K k) { return operator[](k); } +template +Result HashMap::at(K k) const { + auto p = access(m_pairs, k); + if (!p) { + return {nullptr, OxError(1)}; + } + return &p->value; +} + template bool HashMap::contains(K k) const { return access(m_pairs, k) != nullptr; @@ -161,7 +161,7 @@ const Vector &HashMap::keys() const noexcept { } template -void HashMap::expand() const { +void HashMap::expand() { Vector r; for (std::size_t i = 0; i < m_keys.size(); i++) { auto k = m_keys[i]; @@ -180,7 +180,21 @@ uint64_t HashMap::hash(K k, int len) noexcept { } template -typename HashMap::Pair *&HashMap::access(Vector &pairs, K k) const { +typename HashMap::Pair *const&HashMap::access(const Vector &pairs, K k) const { + auto h = hash(k) % pairs.size(); + auto hashStr = reinterpret_cast(&h); + while (1) { + const auto &p = pairs[h]; + if (p == nullptr || ox_strcmp(p->key, k) == 0) { + return p; + } else { + h = hash(hashStr, 8) % pairs.size(); + } + } +} + +template +typename HashMap::Pair *&HashMap::access(Vector &pairs, K k) { auto h = hash(k) % pairs.size(); auto hashStr = reinterpret_cast(&h); while (1) {