From a94051644b4f6d0483e72d403aac8311bc17c8d9 Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Mon, 29 Nov 2021 03:33:13 -0600 Subject: [PATCH] [ox/std] Make Vector::erase return iterator item after removed item --- deps/ox/src/ox/std/error.hpp | 14 ++++++++++---- deps/ox/src/ox/std/hashmap.hpp | 2 +- deps/ox/src/ox/std/vector.hpp | 20 +++++++++++--------- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/deps/ox/src/ox/std/error.hpp b/deps/ox/src/ox/std/error.hpp index f5e009233..d758cd653 100644 --- a/deps/ox/src/ox/std/error.hpp +++ b/deps/ox/src/ox/std/error.hpp @@ -80,7 +80,7 @@ struct Exception: public std::exception { uint16_t line = 0; ErrorCode errCode = 0; - explicit inline Exception(const char *file, uint32_t line, ErrorCode errCode, const char *msg = nullptr) noexcept { + explicit inline Exception(const char *file, uint32_t line, ErrorCode errCode, const char *msg = "") noexcept { this->file = file; this->line = line; this->msg = msg; @@ -88,7 +88,11 @@ struct Exception: public std::exception { } inline explicit Exception(const Error &err) { - this->msg = err.msg; + if (err.msg) { + this->msg = err.msg; + } else { + this->msg = ""; + } this->file = err.file; this->line = err.line; this->errCode = err.errCode; @@ -121,7 +125,7 @@ struct [[nodiscard]] Result { constexpr Result(const type &value, const Error &error = OxError(0)) noexcept: value(const_cast(value)), error(error) { } - constexpr Result(type &&value, const Error &error = OxError(0)) noexcept: value(move(value)), error(error) { + constexpr Result(type &&value, const Error &error = OxError(0)) noexcept: value(std::move(value)), error(error) { } explicit constexpr operator const type&() const noexcept { @@ -148,7 +152,7 @@ struct [[nodiscard]] Result { } constexpr Error moveTo(type *val) noexcept { - *val = move(value); + *val = std::move(value); return error; } @@ -170,6 +174,8 @@ constexpr Error toError(const Result &ve) noexcept { } constexpr void oxIgnoreError(const ox::Error&) noexcept {} +template +constexpr void oxIgnoreError(const ox::Result&) noexcept {} #if __cplusplus >= 202002L #define oxReturnError(x) if (const auto _ox_error = ox::detail::toError(x)) [[unlikely]] return _ox_error #define oxThrowError(x) if (const auto _ox_error = ox::detail::toError(x)) [[unlikely]] throw ox::Exception(_ox_error) diff --git a/deps/ox/src/ox/std/hashmap.hpp b/deps/ox/src/ox/std/hashmap.hpp index 1aaeb56b9..e2a72f49d 100644 --- a/deps/ox/src/ox/std/hashmap.hpp +++ b/deps/ox/src/ox/std/hashmap.hpp @@ -182,7 +182,7 @@ void HashMap::erase(const K &k) { h = hash(hashStr, 8) % m_pairs.size(); } } - m_keys.erase(ox::find(m_keys.cbegin(), m_keys.cend(), k)); + m_keys.erase(ox::find(m_keys.begin(), m_keys.end(), k)); } template diff --git a/deps/ox/src/ox/std/vector.hpp b/deps/ox/src/ox/std/vector.hpp index cde3d93cf..6b2dd8400 100644 --- a/deps/ox/src/ox/std/vector.hpp +++ b/deps/ox/src/ox/std/vector.hpp @@ -8,6 +8,8 @@ #pragma once +#include + #include "bit.hpp" #include "initializerlist.hpp" #include "iterator.hpp" @@ -116,6 +118,8 @@ class Vector: detail::SmallVector { size_type m_max = 0; public: + constexpr iterator() noexcept = default; + constexpr iterator(PtrType t, size_type offset, size_type max) noexcept { m_t = t; m_offset = offset; @@ -316,15 +320,14 @@ class Vector: detail::SmallVector { * @param pos iterator at the point to remove * @return Error if index is out of bounds */ - template - constexpr Error erase(const iterator &pos); + constexpr Result> erase(const iterator<> &pos); /** * Removes an item from the Vector. * @param pos position of item to remove * @return Error if index is out of bounds */ - constexpr Error erase(std::size_t pos); + constexpr Result> erase(std::size_t pos); /** * Moves the last item in the Vector to position pos and decrements the @@ -570,21 +573,20 @@ constexpr void Vector::pop_back() { } template -template -constexpr Error Vector::erase(const iterator &pos) { +constexpr Result::template iterator<>> Vector::erase(const iterator<> &pos) { return erase(pos.offset()); } template -constexpr Error Vector::erase(std::size_t pos) { +constexpr Result::template iterator<>> Vector::erase(std::size_t pos) { if (pos >= m_size) { - return OxError(1); + return OxError(1, "Vector::erase failed: pos is greater than Vector size"); } --m_size; for (auto i = pos; i < m_size; ++i) { - m_items[i] = move(m_items[i + 1]); + m_items[i] = std::move(m_items[i + 1]); } - return OxError(0); + return begin() + pos; } template