diff --git a/deps/ox/src/ox/event/signal.hpp b/deps/ox/src/ox/event/signal.hpp index 51e18de..bb58e7b 100644 --- a/deps/ox/src/ox/event/signal.hpp +++ b/deps/ox/src/ox/event/signal.hpp @@ -215,7 +215,7 @@ Error Signal::emitCheckError(Args... args) const noexcept { } return ox::Error(0); } catch (const ox::Exception &ex) { - return ox::Error(ex.file, ex.line, ex.errCode, ex.msg); + return ox::Error(ex.errCode, ex.msg, ex.src); } } diff --git a/deps/ox/src/ox/logconn/def.hpp b/deps/ox/src/ox/logconn/def.hpp index 2e8627c..71b4e72 100644 --- a/deps/ox/src/ox/logconn/def.hpp +++ b/deps/ox/src/ox/logconn/def.hpp @@ -14,7 +14,7 @@ { \ const auto loggerErr = (loggerName).initConn(appName); \ if (loggerErr) { \ - oxErrf("Could not connect to logger: {} ({}:{})\n", toStr(loggerErr), loggerErr.file, loggerErr.line); \ + oxErrf("Could not connect to logger: {} ({}:{})\n", toStr(loggerErr), loggerErr.src.file_name(), loggerErr.src.line()); \ } else { \ ox::trace::setLogger(&(loggerName)); \ } \ diff --git a/deps/ox/src/ox/std/assert.cpp b/deps/ox/src/ox/std/assert.cpp index 0a8b7f7..94ad5f6 100644 --- a/deps/ox/src/ox/std/assert.cpp +++ b/deps/ox/src/ox/std/assert.cpp @@ -20,8 +20,8 @@ void panic(StringViewCR file, int line, StringViewCR panicMsg, const Error &err) oxErrf("\tError Message:\t{}\n", err.msg); } oxErrf("\tError Code:\t{}\n", static_cast(err)); - if (err.file != nullptr) { - oxErrf("\tError Location:\t{}:{}\n", err.file, err.line); + if (err.src.file_name() != nullptr) { + oxErrf("\tError Location:\t{}:{}\n", err.src.file_name(), err.src.line()); } #ifdef OX_USE_STDLIB printStackTrace(2); @@ -56,8 +56,8 @@ void assertFailFuncRuntime(StringViewCR file, int line, [[maybe_unused]] const E msg += sfmt("\tError Message:\t{}\n", err.msg); } msg += sfmt("\tError Code:\t{}\n", static_cast(err)); - if (err.file != nullptr) { - msg += sfmt("\tError Location:\t{}:{}\n", err.file, err.line); + if (err.src.file_name() != nullptr) { + msg += sfmt("\tError Location:\t{}:{}\n", err.src.file_name(), err.src.line()); } msg += genStackTrace(2); oxErr(msg); diff --git a/deps/ox/src/ox/std/error.hpp b/deps/ox/src/ox/std/error.hpp index af33e8b..2e8e65c 100644 --- a/deps/ox/src/ox/std/error.hpp +++ b/deps/ox/src/ox/std/error.hpp @@ -36,28 +36,16 @@ using ErrorCode = uint16_t; struct [[nodiscard]] Error { + std::source_location src; ox::CString msg = nullptr; - ox::CString file = nullptr; - uint16_t line = 0; ErrorCode errCode = 0; constexpr Error() noexcept = default; - explicit constexpr Error( - ox::CString file, - uint32_t const line, - ErrorCode const errCode, - ox::CString msg = nullptr) noexcept: - msg{msg}, - file{file}, - line{static_cast(line)}, - errCode{errCode} {} - explicit constexpr Error( ErrorCode const errCode, std::source_location const&src = std::source_location::current()) noexcept: - file{src.file_name()}, - line{static_cast(src.line())}, + src{src}, errCode{errCode} {} @@ -65,9 +53,8 @@ struct [[nodiscard]] Error { ErrorCode const errCode, ox::CString msg, std::source_location const&src = std::source_location::current()) noexcept: + src{src}, msg{msg}, - file{src.file_name()}, - line{static_cast(src.line())}, errCode{errCode} {} @@ -89,42 +76,31 @@ constexpr auto toStr(Error const&err) noexcept { } struct Exception: public std::exception { + std::source_location src; ox::CString msg = nullptr; - ox::CString file = nullptr; - uint16_t line = 0; ErrorCode errCode = 0; - explicit inline Exception(ox::CString file, uint32_t line, ErrorCode errCode, char const*msg = "") noexcept { - this->file = file; - this->line = static_cast(line); - this->msg = msg; - this->errCode = errCode; - } - explicit inline Exception( ErrorCode const errCode, std::source_location const&src = std::source_location::current()) noexcept: - file{src.file_name()}, - line{static_cast(src.line())}, + src{src}, errCode{errCode} {} explicit inline Exception( ErrorCode const errCode, ox::CString msg, std::source_location const&src = std::source_location::current()) noexcept: + src{src}, msg{msg}, - file{src.file_name()}, - line{static_cast(src.line())}, errCode{errCode} {} explicit inline Exception(Error const&err) noexcept: + src{err.src}, msg{err.msg ? err.msg : ""}, - file{err.file}, - line{err.line}, errCode{err.errCode} {} constexpr Error toError() const noexcept { - return Error(file, line, errCode, msg); + return Error(errCode, msg, src); } [[nodiscard]] diff --git a/deps/ox/src/ox/std/reader.hpp b/deps/ox/src/ox/std/reader.hpp index b633988..b8be88c 100644 --- a/deps/ox/src/ox/std/reader.hpp +++ b/deps/ox/src/ox/std/reader.hpp @@ -31,7 +31,6 @@ concept Reader_c = requires(T v) { class Reader_v { public: virtual constexpr ~Reader_v() noexcept = default; - [[nodiscard]] virtual constexpr ox::Result peek() const noexcept = 0; virtual constexpr ox::Result read(char*, std::size_t) noexcept = 0; virtual constexpr ox::Result tellg() noexcept = 0; diff --git a/deps/ox/src/ox/std/test/CMakeLists.txt b/deps/ox/src/ox/std/test/CMakeLists.txt index 9c395b9..1ecad4e 100644 --- a/deps/ox/src/ox/std/test/CMakeLists.txt +++ b/deps/ox/src/ox/std/test/CMakeLists.txt @@ -17,6 +17,7 @@ add_test("[ox/std] String" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/StdTest "String") add_test("[ox/std] SmallMap" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/StdTest "SmallMap") add_test("[ox/std] SmallMap2" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/StdTest "SmallMap2") add_test("[ox/std] Vector" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/StdTest "Vector") +add_test("[ox/std] Vector::shrink_to_fit" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/StdTest "Vector::shrink_to_fit") add_test("[ox/std] HashMap" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/StdTest "HashMap") add_test("[ox/std] HeapMgr" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/StdTest malloc) add_test("[ox/std] Serialize-Int" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/StdTest "Serialize-Int") diff --git a/deps/ox/src/ox/std/test/tests.cpp b/deps/ox/src/ox/std/test/tests.cpp index ede7e60..6325d15 100644 --- a/deps/ox/src/ox/std/test/tests.cpp +++ b/deps/ox/src/ox/std/test/tests.cpp @@ -237,6 +237,36 @@ OX_CLANG_NOWARN_END return ox::Error(0); } }, + { + "Vector::shrink_to_fit", + [] { + { + ox::Vector> v; + v.reserve(50); + v.emplace_back("asdf"); + v.emplace_back("aoeu"); + auto const origData = v.data(); + v.shrink_to_fit(); + oxExpect(v[0], "asdf"); + oxExpect(v[1], "aoeu"); + oxExpect(v.capacity(), 2u); + oxAssert(origData != v.data(), "shrink_to_fit did not create a new allocation"); + } + { + ox::Vector> v; + v.reserve(2); + v.emplace_back("asdf"); + v.emplace_back("aoeu"); + auto const origData = v.data(); + v.shrink_to_fit(); + oxExpect(v[0], "asdf"); + oxExpect(v[1], "aoeu"); + oxExpect(v.capacity(), 2u); + oxAssert(origData == v.data(), "shrink_to_fit inappropriately created a new allocation"); + } + return ox::Error{}; + } + }, { "SmallMap", [] { diff --git a/deps/ox/src/ox/std/trace.hpp b/deps/ox/src/ox/std/trace.hpp index d205021..ca201e9 100644 --- a/deps/ox/src/ox/std/trace.hpp +++ b/deps/ox/src/ox/std/trace.hpp @@ -269,8 +269,8 @@ using TraceStream = NullStream; inline void logError(const char *file, int line, const char *fmt, const Error &err) noexcept { if (err) { TraceStream trc(file, line, "ox::error"); - if (err.file != nullptr) { - trc << "Error: (" << err.file << ":" << err.line << "):"; + if (err.src.file_name() != nullptr) { + trc << "Error: (" << err.src.file_name() << ":" << err.src.line() << "):"; } else { trc << "Error:"; } @@ -282,8 +282,8 @@ inline void logError(const char *file, int line, const Error &err) noexcept { if (err) { TraceStream trc(file, line, "ox::error"); trc << "Error:" << err; - if (err.file != nullptr) { - trc << "(" << err.file << ":" << err.line << ")"; + if (err.src.file_name() != nullptr) { + trc << "(" << err.src.file_name() << ":" << err.src.line() << ")"; } } } diff --git a/deps/ox/src/ox/std/vector.hpp b/deps/ox/src/ox/std/vector.hpp index 7c8b5e3..2b0bf69 100644 --- a/deps/ox/src/ox/std/vector.hpp +++ b/deps/ox/src/ox/std/vector.hpp @@ -313,6 +313,8 @@ class Vector: detail::VectorAllocator { constexpr void reserve(std::size_t cap) noexcept(useNoexcept); + constexpr void shrink_to_fit() noexcept(useNoexcept); + private: constexpr void reserveInsert( std::size_t cap, std::size_t pos, std::size_t offset = 1) noexcept(useNoexcept); @@ -341,6 +343,7 @@ constexpr Vector::Vector(std::size_t size) noexce template constexpr Vector::Vector(std::initializer_list list) noexcept { + reserve(list.size()); for (auto &item : list) { emplace_back(std::move(item)); } @@ -675,6 +678,24 @@ constexpr void Vector::reserve(std::size_t cap) n } } +template +constexpr void Vector::shrink_to_fit() noexcept(useNoexcept) { + if (m_size == m_cap) { + return; + } + const auto oldItems = m_items; + const auto oldCap = m_cap; + m_cap = m_size; + this->allocate(&m_items, m_size); + if (oldItems) { // move over old items + for (std::size_t i = 0; i < m_size; ++i) { + std::construct_at(&m_items[i], std::move(oldItems[i])); + oldItems[i].~T(); + } + this->deallocate(oldItems, oldCap); + } +} + template constexpr void Vector::reserveInsert( std::size_t cap, diff --git a/src/nostalgia/modules/core/src/gba/panic.cpp b/src/nostalgia/modules/core/src/gba/panic.cpp index bc6169d..b878cf8 100644 --- a/src/nostalgia/modules/core/src/gba/panic.cpp +++ b/src/nostalgia/modules/core/src/gba/panic.cpp @@ -48,8 +48,8 @@ OX_ALLOW_UNSAFE_BUFFERS_END oxErrf("\tError Message:\t{}\n", err.msg); } oxErrf("\tError Code:\t{}\n", static_cast(err)); - if (err.file != nullptr) { - oxErrf("\tError Location:\t{}:{}\n", err.file, err.line); + if (err.src.file_name() != nullptr) { + oxErrf("\tError Location:\t{}:{}\n", err.src.file_name(), err.src.line()); } // disable all interrupt handling and IntrWait on no interrupts REG_IE = 0; diff --git a/src/olympic/studio/applib/src/studioapp.cpp b/src/olympic/studio/applib/src/studioapp.cpp index 466518e..6e55154 100644 --- a/src/olympic/studio/applib/src/studioapp.cpp +++ b/src/olympic/studio/applib/src/studioapp.cpp @@ -75,7 +75,7 @@ StudioUI::StudioUI(turbine::Context &ctx, ox::StringParam projectDataDir) noexce } else { oxErrf( "Could not open studio config file: {}: {} ({}:{})\n", - err.errCode, toStr(err), err.file, err.line); + err.errCode, toStr(err), err.src.file_name(), err.src.line()); } } } @@ -224,7 +224,7 @@ void StudioUI::drawTabs() noexcept { try { OX_THROW_ERROR(m_editors.erase(it).moveTo(it)); } catch (ox::Exception const&ex) { - oxErrf("Editor tab deletion failed: {} ({}:{})\n", ex.what(), ex.file, ex.line); + oxErrf("Editor tab deletion failed: {} ({}:{})\n", ex.what(), ex.src.file_name(), ex.src.line()); } catch (std::exception const&ex) { oxErrf("Editor tab deletion failed: {}\n", ex.what()); } @@ -376,7 +376,7 @@ ox::Error StudioUI::openFileActiveTab(ox::StringViewCR path, bool makeActiveTab) if constexpr(!ox::defines::Debug) { oxErrf("Could not open Editor: {}\n", toStr(err)); } else { - oxErrf("Could not open Editor: {} ({}:{})\n", err.errCode, err.file, err.line); + oxErrf("Could not open Editor: {} ({}:{})\n", err.errCode, err.src.file_name(), err.src.line()); } return err; } diff --git a/src/olympic/studio/modlib/include/studio/selectiontracker.hpp b/src/olympic/studio/modlib/include/studio/selectiontracker.hpp index 53f2d5f..1859f94 100644 --- a/src/olympic/studio/modlib/include/studio/selectiontracker.hpp +++ b/src/olympic/studio/modlib/include/studio/selectiontracker.hpp @@ -126,12 +126,12 @@ class SelectionTracker { constexpr Selection selection() const noexcept { return { { - ox::min(m_pointA.x, m_pointB.x), - ox::min(m_pointA.y, m_pointB.y), + ox::max(0, ox::min(m_pointA.x, m_pointB.x)), + ox::max(0, ox::min(m_pointA.y, m_pointB.y)), }, { - ox::max(m_pointA.x, m_pointB.x), - ox::max(m_pointA.y, m_pointB.y), + ox::max(0, ox::max(m_pointA.x, m_pointB.x)), + ox::max(0, ox::max(m_pointA.y, m_pointB.y)), }, }; } diff --git a/src/olympic/studio/modlib/include/studio/undocommand.hpp b/src/olympic/studio/modlib/include/studio/undocommand.hpp index ffd0009..6f41d0d 100644 --- a/src/olympic/studio/modlib/include/studio/undocommand.hpp +++ b/src/olympic/studio/modlib/include/studio/undocommand.hpp @@ -13,7 +13,7 @@ namespace studio { class NoChangesException: public ox::Exception { public: inline NoChangesException(std::source_location sloc = std::source_location::current()): - ox::Exception(sloc.file_name(), sloc.line(), 1, "Command makes no changes.") {} + ox::Exception(1, "Command makes no changes.", sloc) {} }; class UndoCommand { diff --git a/src/olympic/studio/modlib/src/editor.cpp b/src/olympic/studio/modlib/src/editor.cpp index 27f52df..de5e652 100644 --- a/src/olympic/studio/modlib/src/editor.cpp +++ b/src/olympic/studio/modlib/src/editor.cpp @@ -46,7 +46,7 @@ void BaseEditor::save() noexcept { setUnsavedChanges(false); } else { if constexpr(ox::defines::Debug) { - oxErrorf("Could not save file {}: {} ({}:{})", itemPath(), toStr(err), err.file, err.line); + oxErrorf("Could not save file {}: {} ({}:{})", itemPath(), toStr(err), err.src.file_name(), err.src.line()); } else { oxErrorf("Could not save file {}: {}", itemPath(), toStr(err)); }