diff --git a/deps/nostalgia/.gitignore b/deps/nostalgia/.gitignore index a68aa18..35f0222 100644 --- a/deps/nostalgia/.gitignore +++ b/deps/nostalgia/.gitignore @@ -7,6 +7,7 @@ .stfolder .stignore scripts/__pycache__ +pyenv CMakeLists.txt.user ROM.oxfs Session.vim diff --git a/deps/nostalgia/deps/ox/deps/cityhash/include/cityhash/city.h b/deps/nostalgia/deps/ox/deps/cityhash/include/cityhash/city.h index d24101b..c99bc7c 100644 --- a/deps/nostalgia/deps/ox/deps/cityhash/include/cityhash/city.h +++ b/deps/nostalgia/deps/ox/deps/cityhash/include/cityhash/city.h @@ -100,27 +100,52 @@ typedef uint32_t uintptr_t; #error intptr_t, and uintptr_t undefined #endif -#endif - - using size_t = decltype(alignof(int)); - - -#if __has_include() -#include #endif - - namespace cityhash::detail { + +template +struct remove_reference { + using type = T; +}; + +template +struct remove_reference { + using type = T; +}; + +template +struct remove_reference { + using type = T; +}; + +template +using remove_reference_t = typename remove_reference::type; + +template +constexpr remove_reference_t &&move(T &&t) noexcept { + return static_cast&&>(t); +} + +template +using remove_reference_t = typename remove_reference::type; template struct pair { T1 first{}; T2 second{}; constexpr pair() noexcept = default; - constexpr pair(T1 a, T2 b) noexcept: first(std::move(a)), second(std::move(b)) {} + constexpr pair(T1 a, T2 b) noexcept: first(detail::move(a)), second(detail::move(b)) {} }; + +template +constexpr void swap(T &a, T &b) noexcept { + auto temp = detail::move(a); + a = detail::move(b); + b = detail::move(temp); +} + } namespace cityhash { @@ -129,13 +154,6 @@ using uint128 = cityhash::detail::pair; namespace detail { -template -constexpr void swap(T &a, T &b) noexcept { - auto temp = std::move(a); - a = std::move(b); - b = std::move(temp); -} - template [[nodiscard]] constexpr T byteSwap(T i) noexcept { @@ -290,7 +308,7 @@ constexpr uint32_t Hash32Len0to4(const char *s, size_t len) noexcept { uint32_t b = 0; uint32_t c = 9; for (size_t i = 0; i < len; i++) { - signed char v = static_cast(s[i]); + auto const v = static_cast(s[i]); b = b * detail::c1 + static_cast(v); c ^= b; } diff --git a/deps/nostalgia/deps/ox/src/ox/model/typenamecatcher.hpp b/deps/nostalgia/deps/ox/src/ox/model/typenamecatcher.hpp index 0c6234a..14cef23 100644 --- a/deps/nostalgia/deps/ox/src/ox/model/typenamecatcher.hpp +++ b/deps/nostalgia/deps/ox/src/ox/model/typenamecatcher.hpp @@ -147,13 +147,6 @@ constexpr auto ModelTypeName_v = getModelTypeName(); template constexpr auto ModelTypeVersion_v = requireModelTypeVersion(); -template -constexpr auto ModelTypeVersionStr_v = [] { - constexpr auto version = ModelTypeVersion_v; - constexpr auto versionStr = ox::sfmt("{}", version); - return ox::IString{versionStr}; -}; - template constexpr auto ModelTypeId_v = [] { constexpr auto name = ModelTypeName_v; diff --git a/deps/nostalgia/deps/ox/src/ox/std/CMakeLists.txt b/deps/nostalgia/deps/ox/src/ox/std/CMakeLists.txt index 6c88ca4..93dd0d7 100644 --- a/deps/nostalgia/deps/ox/src/ox/std/CMakeLists.txt +++ b/deps/nostalgia/deps/ox/src/ox/std/CMakeLists.txt @@ -124,6 +124,7 @@ install( stringliteral.hpp stringview.hpp strongint.hpp + strconv.hpp strops.hpp trace.hpp typeinfo.hpp diff --git a/deps/nostalgia/deps/ox/src/ox/std/cstrops.hpp b/deps/nostalgia/deps/ox/src/ox/std/cstrops.hpp index ceac63c..c86cacb 100644 --- a/deps/nostalgia/deps/ox/src/ox/std/cstrops.hpp +++ b/deps/nostalgia/deps/ox/src/ox/std/cstrops.hpp @@ -112,38 +112,4 @@ constexpr int lastIndexOf(const auto &str, int character, std::size_t maxLen = 0 return retval; } -template -constexpr T itoa(Integer v, T str) noexcept { - if (v) { - ox::ResizedInt_t mod = 1000000000000000000; - ox::ResizedInt_t val = v; - constexpr auto base = 10; - auto it = 0; - if (val < 0) { - str[static_cast(it)] = '-'; - it++; - } - while (mod) { - auto digit = val / mod; - val %= mod; - mod /= base; - if (it || digit) { - ox::ResizedInt_t start = '0'; - if (digit >= 10) { - start = 'a'; - digit -= 10; - } - str[static_cast(it)] = static_cast::type>(start + digit); - it++; - } - } - str[static_cast(it)] = 0; - } else { - // 0 is a special case - str[0] = '0'; - str[1] = 0; - } - return str; -} - } diff --git a/deps/nostalgia/deps/ox/src/ox/std/fmt.hpp b/deps/nostalgia/deps/ox/src/ox/std/fmt.hpp index 2149337..2cdab42 100644 --- a/deps/nostalgia/deps/ox/src/ox/std/fmt.hpp +++ b/deps/nostalgia/deps/ox/src/ox/std/fmt.hpp @@ -75,14 +75,17 @@ constexpr StringView toStringView(const auto&) noexcept requires(force) { class FmtArg { private: - char dataStr[10] = {}; + static constexpr auto DataSz = 23; + char dataStr[DataSz] = {}; template constexpr StringView sv(const T &v, char *dataStr) noexcept { if constexpr(is_bool_v) { return v ? "true" : "false"; } else if constexpr(is_integer_v) { - return ox::itoa(v, dataStr); + ox::CharBuffWriter w(dataStr, DataSz); + std::ignore = ox::writeItoa(v, w); + return dataStr; } else { return toStringView(v); } @@ -195,7 +198,7 @@ constexpr StringType sfmt(StringView fmt, Args&&... args) noexcept { std::ignore = out.append(firstSegment.str, firstSegment.length); const detail::FmtArg elements[sizeof...(args)] = {args...}; for (size_t i = 0; i < fmtSegments.size - 1; ++i) { - out += elements[i].out; + std::ignore = out.append(elements[i].out); const auto &s = fmtSegments.segments[i + 1]; std::ignore = out.append(s.str, s.length); } @@ -203,7 +206,7 @@ constexpr StringType sfmt(StringView fmt, Args&&... args) noexcept { } template -constexpr Result join(auto d, const auto &list) { +constexpr Result join(auto const&d, auto const&list) { if (!list.size()) { return T(""); } diff --git a/deps/nostalgia/deps/ox/src/ox/std/istring.hpp b/deps/nostalgia/deps/ox/src/ox/std/istring.hpp index b7eef79..30ee64f 100644 --- a/deps/nostalgia/deps/ox/src/ox/std/istring.hpp +++ b/deps/nostalgia/deps/ox/src/ox/std/istring.hpp @@ -8,20 +8,25 @@ #pragma once -#include "ignore.hpp" +#include "array.hpp" +#include "concepts.hpp" +#include "cstrops.hpp" #include "memops.hpp" +#include "error.hpp" +#include "buffer.hpp" +#include "ignore.hpp" #include "stringview.hpp" -#include "strops.hpp" #include "typetraits.hpp" +#include "strconv.hpp" namespace ox { // Inline String -template +template class IString { private: - char m_buff[buffLen + 1]; size_t m_size{}; + ox::Array m_buff; public: constexpr IString() noexcept; @@ -34,23 +39,8 @@ class IString { constexpr IString &operator=(const char *str) noexcept; - constexpr IString &operator=(char *str) noexcept; - constexpr IString &operator=(Integer_c auto i) noexcept; - constexpr IString &operator+=(const char *str) noexcept; - - constexpr IString &operator+=(char *str) noexcept; - - constexpr IString &operator+=(Integer_c auto i) noexcept; - - constexpr IString &operator+=(StringView s) noexcept; - - constexpr IString operator+(const char *str) const noexcept; - - constexpr IString operator+(char *str) const noexcept; - - constexpr IString operator+(Integer_c auto i) const noexcept; constexpr bool operator==(const char *other) const noexcept; @@ -66,6 +56,8 @@ class IString { constexpr Error append(const char *str, std::size_t strLen) noexcept; + constexpr Error append(ox::StringView str) noexcept; + [[nodiscard]] constexpr const char *data() const noexcept; @@ -87,6 +79,8 @@ class IString { [[nodiscard]] constexpr std::size_t bytes() const noexcept; + constexpr ox::Error resize(size_t sz) noexcept; + /** * Returns the capacity of bytes for this string. */ @@ -110,9 +104,11 @@ constexpr IString::IString(const char *str) noexcept: m_buff{{0}} { template constexpr IString &IString::operator=(Integer_c auto i) noexcept { - char str[65] = {}; - ox::itoa(i, str); - return this->operator=(str); + ox::Array s; + ox::CharBuffWriter w(s); + std::ignore = ox::writeItoa(i, w); + this->operator=({s.data(), w.tellp()}); + return *this; } template @@ -122,7 +118,7 @@ constexpr IString &IString::operator=(ox::CRStringView str) noexcept strLen = cap(); } m_size = strLen; - ox::listcpy(m_buff, str.data(), strLen); + ox::listcpy(m_buff.data(), str.data(), strLen); // make sure last element is a null terminator m_buff[strLen] = 0; return *this; @@ -135,128 +131,92 @@ constexpr IString &IString::operator=(const char *str) noexcept { strLen = cap(); } m_size = strLen; - ox::listcpy(m_buff, str, strLen); + ox::listcpy(m_buff.data(), str, strLen); // make sure last element is a null terminator m_buff[cap()] = 0; return *this; } -template -constexpr IString &IString::operator=(char *str) noexcept { - return *this = static_cast(str); -} - -template -constexpr IString &IString::operator+=(const char *str) noexcept { - std::size_t strLen = ox::strlen(str) + 1; - std::ignore = append(str, strLen); - return *this; -} - -template -constexpr IString &IString::operator+=(char *str) noexcept { - return *this += static_cast(str); -} - -template -constexpr IString &IString::operator+=(Integer_c auto i) noexcept { - char str[65] = {}; - ox::itoa(i, str); - return this->operator+=(str); -} - -template -constexpr IString &IString::operator+=(StringView s) noexcept { - std::size_t strLen = s.bytes(); - std::ignore = append(s.data(), strLen); - return *this; -} - -template -constexpr IString IString::operator+(const char *str) const noexcept { - auto out = *this; - std::size_t strLen = ox::strlen(str) + 1; - std::ignore = out.append(str, strLen); - return out; -} - -template -constexpr IString IString::operator+(char *str) const noexcept { - return *this + static_cast(str); -} - -template -constexpr IString IString::operator+(Integer_c auto i) const noexcept { - char str[65] = {}; - ox::itoa(i, str); - return this->operator+(str); -} - -template -constexpr bool IString::operator==(const char *other) const noexcept { +template +constexpr bool IString::operator==(const char *other) const noexcept { return ox::StringView(*this) == other; } -template -constexpr bool IString::operator==(const OxString_c auto &other) const noexcept { +template +constexpr bool IString::operator==(const OxString_c auto &other) const noexcept { return ox::StringView(*this) == ox::StringView(other); } -template -constexpr bool IString::operator!=(const char *other) const noexcept { +template +constexpr bool IString::operator!=(const char *other) const noexcept { return !operator==(other); } -template -constexpr bool IString::operator!=(const OxString_c auto &other) noexcept { +template +constexpr bool IString::operator!=(const OxString_c auto &other) noexcept { return !operator==(other); } -template -constexpr char IString::operator[](std::size_t i) const noexcept { +template +constexpr char IString::operator[](std::size_t i) const noexcept { return m_buff[i]; } -template -constexpr char &IString::operator[](std::size_t i) noexcept { +template +constexpr char &IString::operator[](std::size_t i) noexcept { return m_buff[i]; } -template -constexpr Error IString::append(const char *str, std::size_t strLen) noexcept { - Error err; +template +constexpr Error IString::append(const char *str, std::size_t strLen) noexcept { + Error err{}; auto currentLen = len(); if (cap() < currentLen + strLen + 1) { strLen = cap() - currentLen; err = OxError(1, "Insufficient space for full string"); } - ox::strncpy(m_buff + currentLen, str, strLen); + ox::strncpy(m_buff.data() + currentLen, str, strLen); // make sure last element is a null terminator m_buff[currentLen + strLen] = 0; return err; } -template -constexpr const char *IString::data() const noexcept { - return static_cast(m_buff); +template +constexpr Error IString::append(ox::StringView str) noexcept { + auto strLen = str.len(); + Error err{}; + auto currentLen = len(); + if (cap() < currentLen + strLen + 1) { + strLen = cap() - currentLen; + err = OxError(1, "Insufficient space for full string"); + } + ox::strncpy(m_buff.data() + currentLen, str, strLen); + // make sure last element is a null terminator + m_buff[currentLen + strLen] = 0; + return err; } -template -constexpr char *IString::data() noexcept { - return static_cast(m_buff); +template +constexpr const char *IString::data() const noexcept { + return static_cast(m_buff.data()); } -template -constexpr const char *IString::c_str() const noexcept { - return static_cast(m_buff); +template +constexpr char *IString::data() noexcept { + return static_cast(m_buff.data()); +} + +template +constexpr const char *IString::c_str() const noexcept { + return static_cast(m_buff.data()); } -template -constexpr std::size_t IString::len() const noexcept { +template +constexpr std::size_t IString::len() const noexcept { std::size_t length = 0; - for (std::size_t i = 0; i < buffLen; i++) { - uint8_t b = static_cast(m_buff[i]); + for (std::size_t i = 0; i < StrCap; i++) { + auto const b = static_cast(m_buff[i]); if (b) { const auto asciiChar = (b & 128) == 0; const auto utf8Char = (b & (256 << 6)) == (256 << 6); @@ -270,16 +230,28 @@ constexpr std::size_t IString::len() const noexcept { return length; } -template -constexpr std::size_t IString::bytes() const noexcept { +template +constexpr std::size_t IString::bytes() const noexcept { std::size_t i = 0; - for (i = 0; i < buffLen && m_buff[i]; i++); + for (i = 0; i < StrCap && m_buff[i]; i++); return i + 1; // add one for null terminator } -template -constexpr std::size_t IString::cap() const noexcept { - return buffLen; +template +constexpr ox::Error IString::resize(size_t sz) noexcept { + if (sz > StrCap) [[unlikely]] { + return OxError(1, "Trying to extend IString beyond its cap"); + } + for (auto i = m_size; i < sz; ++i) { + m_buff[i] = 0; + } + m_size = sz; + return {}; +} + +template +constexpr std::size_t IString::cap() const noexcept { + return StrCap; } template @@ -287,4 +259,30 @@ struct MaybeView> { using type = ox::StringView; }; + +template +[[nodiscard]] +constexpr auto itoa(Integer v) noexcept { + constexpr auto Cap = [] { + auto out = 0; + switch (sizeof(Integer)) { + case 1: + out = 3; + case 2: + out = 5; + case 4: + out = 10; + case 8: + out = 21; + } + return out + ox::is_signed_v; + }(); + ox::IString out; + std::ignore = out.resize(out.cap()); + ox::CharBuffWriter w(out.data(), out.cap()); + std::ignore = writeItoa(v, w); + std::ignore = out.resize(w.tellp()); + return out; +} + } diff --git a/deps/nostalgia/deps/ox/src/ox/std/math.hpp b/deps/nostalgia/deps/ox/src/ox/std/math.hpp index 4c532ca..18319a4 100644 --- a/deps/nostalgia/deps/ox/src/ox/std/math.hpp +++ b/deps/nostalgia/deps/ox/src/ox/std/math.hpp @@ -48,11 +48,11 @@ constexpr const T &clamp(const T &v, const T &lo, const T &hi) noexcept requires return min(ox::max(v, lo), hi); } -template +template [[nodiscard]] -constexpr I pow(I v, int e) noexcept { +constexpr I pow(I v, E e) noexcept { I out = 1; - for (I i = 0; i < e; i++) { + for (E i = 0; i < e; ++i) { out *= v; } return out; diff --git a/deps/nostalgia/deps/ox/src/ox/std/maybeview.hpp b/deps/nostalgia/deps/ox/src/ox/std/maybeview.hpp index 149cd97..9860e4d 100644 --- a/deps/nostalgia/deps/ox/src/ox/std/maybeview.hpp +++ b/deps/nostalgia/deps/ox/src/ox/std/maybeview.hpp @@ -8,7 +8,10 @@ #pragma once -#include "typetraits.hpp" +#if __has_include() +#include +#include +#endif namespace ox { @@ -23,4 +26,11 @@ struct MaybeView { template using MaybeView_t = typename MaybeView::type; +#if __has_include() +template +struct MaybeView> { + using type = std::basic_string_view; +}; +#endif + } diff --git a/deps/nostalgia/deps/ox/src/ox/std/memory.hpp b/deps/nostalgia/deps/ox/src/ox/std/memory.hpp index a19c46b..9d08eb3 100644 --- a/deps/nostalgia/deps/ox/src/ox/std/memory.hpp +++ b/deps/nostalgia/deps/ox/src/ox/std/memory.hpp @@ -51,12 +51,12 @@ namespace ox { */ template -void safeDelete(T *val) requires(sizeof(T) >= 1) { +constexpr void safeDelete(T *val) requires(sizeof(T) >= 1) { delete val; } template -void safeDeleteArray(T *val) requires(sizeof(T) >= 1) { +constexpr void safeDeleteArray(T *val) requires(sizeof(T) >= 1) { delete[] val; } diff --git a/deps/nostalgia/deps/ox/src/ox/std/strconv.hpp b/deps/nostalgia/deps/ox/src/ox/std/strconv.hpp new file mode 100644 index 0000000..f976366 --- /dev/null +++ b/deps/nostalgia/deps/ox/src/ox/std/strconv.hpp @@ -0,0 +1,44 @@ + +#pragma once + +#include "error.hpp" +#include "types.hpp" +#include "writer.hpp" + +namespace ox { + +template +constexpr ox::Error writeItoa(Integer v, ox::Writer_c auto &writer) noexcept { + if (v) { + ox::ResizedInt_t mod = 1000000000000000000; + ox::ResizedInt_t val = v; + constexpr auto base = 10; + auto it = 0; + if (val < 0) { + oxReturnError(writer.put('-')); + ++it; + } + while (mod) { + auto digit = val / mod; + val %= mod; + mod /= base; + if (it || digit) { + ox::ResizedInt_t start = '0'; + if (digit >= 10) { + start = 'a'; + digit -= 10; + } + oxReturnError(writer.put(static_cast(start + digit))); + ++it; + } + } + } else { + // 0 is a special case + oxReturnError(writer.put('0')); + } + return {}; +} + +} + +#include "istring.hpp" diff --git a/deps/nostalgia/deps/ox/src/ox/std/string.hpp b/deps/nostalgia/deps/ox/src/ox/std/string.hpp index c390868..90a7134 100644 --- a/deps/nostalgia/deps/ox/src/ox/std/string.hpp +++ b/deps/nostalgia/deps/ox/src/ox/std/string.hpp @@ -16,6 +16,7 @@ #include "ignore.hpp" #include "memops.hpp" #include "serialize.hpp" +#include "strconv.hpp" #include "stringliteral.hpp" #include "stringview.hpp" #include "strops.hpp" @@ -23,6 +24,9 @@ namespace ox { +template +constexpr ox::IString<21> itoa(Integer v) noexcept; + template class BasicString { private: @@ -178,6 +182,10 @@ class BasicString { return OxError(0); } + constexpr Error append(ox::StringView sv) noexcept { + return append(sv.data(), sv.len()); + } + [[nodiscard]] constexpr BasicString substr(std::size_t pos) const noexcept; @@ -323,17 +331,13 @@ constexpr BasicString &BasicString::operat template constexpr BasicString &BasicString::operator=(int64_t i) noexcept { - ox::Array str{}; - ox::itoa(i, str.data()); - set(str.data()); + set(ox::itoa(i)); return *this; } template constexpr BasicString &BasicString::operator=(uint64_t i) noexcept { - ox::Array str{}; - ox::itoa(i, str.data()); - set(str.data()); + set(ox::itoa(i)); return *this; } @@ -379,9 +383,8 @@ constexpr BasicString &BasicString::operat template constexpr BasicString &BasicString::operator+=(Integer_c auto i) noexcept { - char str[65] = {}; - ox::itoa(i, str); - return this->operator+=(str); + auto const str = ox::itoa(i); + return this->operator+=(str.c_str()); } template @@ -423,8 +426,7 @@ constexpr BasicString BasicString::operato template constexpr BasicString BasicString::operator+(Integer_c auto i) const noexcept { - char str[65] = {}; - ox::itoa(i, str); + auto const str = ox::itoa(i); return *this + str; } diff --git a/deps/nostalgia/deps/ox/src/ox/std/stringliteral.hpp b/deps/nostalgia/deps/ox/src/ox/std/stringliteral.hpp index e6ddc4c..0eafc76 100644 --- a/deps/nostalgia/deps/ox/src/ox/std/stringliteral.hpp +++ b/deps/nostalgia/deps/ox/src/ox/std/stringliteral.hpp @@ -32,10 +32,9 @@ class StringLiteral: public detail::BaseStringView { constexpr explicit StringLiteral(const char *str, std::size_t len) noexcept: BaseStringView(str, len) {} - constexpr explicit StringLiteral(char const *str) noexcept: StringLiteral(str, ox::strlen(str)) { - } + constexpr explicit StringLiteral(char const *str) noexcept: StringLiteral(str, ox::strlen(str)) {} - constexpr auto &operator=(StringLiteral const&other) noexcept { + constexpr StringLiteral &operator=(StringLiteral const&other) noexcept { if (&other != this) { set(other.data(), other.len()); } diff --git a/deps/nostalgia/deps/ox/src/ox/std/strongint.hpp b/deps/nostalgia/deps/ox/src/ox/std/strongint.hpp index 6fc37dd..a624f7a 100644 --- a/deps/nostalgia/deps/ox/src/ox/std/strongint.hpp +++ b/deps/nostalgia/deps/ox/src/ox/std/strongint.hpp @@ -34,7 +34,7 @@ class Integer: public Base { constexpr Integer(const Integer &i) noexcept; - constexpr Integer operator=(Integer i) noexcept; + constexpr Integer &operator=(Integer i) noexcept; constexpr Integer operator==(Integer i) const noexcept; @@ -118,10 +118,9 @@ constexpr Integer::Integer(const Integer &i) noexcept: Base(i) } template -constexpr Integer Integer::operator=(Integer i) noexcept { +constexpr Integer &Integer::operator=(Integer i) noexcept { // needed in case T has nodiscard - constexpr auto ignore = [](Base) {}; - ignore(Base::operator=(i)); + Base::operator=(i); m_i = i.m_i; return *this; } diff --git a/deps/nostalgia/deps/ox/src/ox/std/strops.hpp b/deps/nostalgia/deps/ox/src/ox/std/strops.hpp index afb650f..ef0dfa2 100644 --- a/deps/nostalgia/deps/ox/src/ox/std/strops.hpp +++ b/deps/nostalgia/deps/ox/src/ox/std/strops.hpp @@ -14,56 +14,21 @@ #include "stringview.hpp" #include "types.hpp" #include "vector.hpp" -#include "writer.hpp" namespace ox { -template [[nodiscard]] -constexpr Str substr(Str const&str, std::size_t pos) noexcept { +constexpr ox::StringView substr(ox::StringView const&str, std::size_t pos) noexcept { if (str.len() >= pos) { - return Str(str.data() + pos, str.len() - pos); + return {str.data() + pos, str.len() - pos}; } - return Str(); + return {}; } -template [[nodiscard]] -constexpr ox::StringView substr(Str const&str, std::size_t start, std::size_t end) noexcept { +constexpr ox::StringView substr(ox::StringView const&str, std::size_t start, std::size_t end) noexcept { if (str.len() >= start && end >= start) { - return Str(str.data() + start, end - start); - } - return Str(); -} - -template -constexpr ox::Error writeItoa(Integer v, ox::Writer_c auto &writer) noexcept { - if (v) { - ox::ResizedInt_t mod = 1000000000000000000; - ox::ResizedInt_t val = v; - constexpr auto base = 10; - auto it = 0; - if (val < 0) { - oxReturnError(writer.put('-')); - ++it; - } - while (mod) { - auto digit = val / mod; - val %= mod; - mod /= base; - if (it || digit) { - ox::ResizedInt_t start = '0'; - if (digit >= 10) { - start = 'a'; - digit -= 10; - } - oxReturnError(writer.put(static_cast(start + digit))); - ++it; - } - } - } else { - // 0 is a special case - oxReturnError(writer.put('0')); + return {str.data() + start, end - start}; } return {}; } diff --git a/deps/nostalgia/deps/ox/src/ox/std/test/tests.cpp b/deps/nostalgia/deps/ox/src/ox/std/test/tests.cpp index 04a7363..1af6c8f 100644 --- a/deps/nostalgia/deps/ox/src/ox/std/test/tests.cpp +++ b/deps/nostalgia/deps/ox/src/ox/std/test/tests.cpp @@ -6,6 +6,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ +#include "ox/std/def.hpp" #undef NDEBUG #include @@ -69,10 +70,10 @@ static std::map tests = { "BString", []() { ox::IString<5> s; - s += "A"; - s += "B"; - s += 9; - s += "C"; + oxReturnError(s.append("A")); + oxReturnError(s.append("B")); + oxReturnError(s.append("9")); + oxReturnError(s.append("C")); oxAssert(s == "AB9C", "BString append broken"); s = "asdf"; oxAssert(s == "asdf", "String assign broken"); diff --git a/deps/nostalgia/deps/ox/src/ox/std/utility.hpp b/deps/nostalgia/deps/ox/src/ox/std/utility.hpp index 5a69405..70e60d9 100644 --- a/deps/nostalgia/deps/ox/src/ox/std/utility.hpp +++ b/deps/nostalgia/deps/ox/src/ox/std/utility.hpp @@ -16,8 +16,8 @@ namespace std { template -constexpr typename ox::remove_reference::type &&move(T &&t) noexcept { - return static_cast::type&&>(t); +constexpr ox::remove_reference_t &&move(T &&t) noexcept { + return static_cast&&>(t); } template diff --git a/deps/nostalgia/deps/ox/src/ox/std/uuid.hpp b/deps/nostalgia/deps/ox/src/ox/std/uuid.hpp index 1d448ba..19e535f 100644 --- a/deps/nostalgia/deps/ox/src/ox/std/uuid.hpp +++ b/deps/nostalgia/deps/ox/src/ox/std/uuid.hpp @@ -8,12 +8,13 @@ #pragma once -#include "array.hpp" +#include "ignore.hpp" #include "istring.hpp" #include "buffer.hpp" #include "random.hpp" #include "ranges.hpp" #include "stringview.hpp" +#include "strops.hpp" namespace ox { @@ -80,7 +81,8 @@ constexpr ox::IString<2> toHex(uint8_t v) noexcept { 'e', 'f', }; - ox::Array out; + ox::IString<2> out; + std::ignore = out.resize(2); out[0] = valMap[static_cast((v & 0xf0) / 16)]; out[1] = valMap[static_cast(v & 0x0f)]; out[2] = 0; diff --git a/deps/nostalgia/deps/ox/src/ox/std/vector.hpp b/deps/nostalgia/deps/ox/src/ox/std/vector.hpp index 7d649c9..2d8fee0 100644 --- a/deps/nostalgia/deps/ox/src/ox/std/vector.hpp +++ b/deps/nostalgia/deps/ox/src/ox/std/vector.hpp @@ -30,7 +30,6 @@ struct VectorAllocator { static_assert(alignof(AllocAlias) == alignof(T)); private: ox::Array, Size> m_data = {}; - Allocator m_allocator; protected: constexpr VectorAllocator() noexcept = default; constexpr VectorAllocator(const VectorAllocator&) noexcept = default; @@ -39,7 +38,7 @@ struct VectorAllocator { constexpr void allocate(T **items, std::size_t cap) noexcept { // small vector optimization cannot be done it constexpr, but it doesn't really matter in constexpr if (std::is_constant_evaluated() || cap > Size) { - *items = m_allocator.allocate(cap); + *items = Allocator{}.allocate(cap); } else { *items = reinterpret_cast(m_data.data()); } @@ -87,7 +86,7 @@ struct VectorAllocator { // small vector optimization cannot be done it constexpr, but it doesn't really matter in constexpr if (std::is_constant_evaluated()) { if (items && static_cast(items) != static_cast(m_data.data())) { - m_allocator.deallocate(items, cap); + Allocator{}.deallocate(items, cap); } } } @@ -96,15 +95,13 @@ struct VectorAllocator { template struct VectorAllocator { - private: - Allocator m_allocator; protected: constexpr VectorAllocator() noexcept = default; constexpr VectorAllocator(const VectorAllocator&) noexcept = default; constexpr VectorAllocator(VectorAllocator&&) noexcept = default; constexpr void allocate(T **items, std::size_t cap) noexcept { - *items = m_allocator.allocate(cap); + *items = Allocator{}.allocate(cap); } [[maybe_unused]] @@ -121,7 +118,7 @@ struct VectorAllocator { constexpr void deallocate(T *items, std::size_t cap) noexcept { if (items) { - m_allocator.deallocate(items, cap); + Allocator{}.deallocate(items, cap); } } diff --git a/deps/nostalgia/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.Palette;2 b/deps/nostalgia/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.Palette;2 new file mode 100644 index 0000000..eb0ad42 --- /dev/null +++ b/deps/nostalgia/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.Palette;2 @@ -0,0 +1,23 @@ +O1;net.drinkingtea.ox.TypeDescriptor;1;{ + "fieldList" : + [ + { + "fieldName" : "pages", + "subscriptLevels" : 2, + "subscriptStack" : + [ + { + "subscriptType" : 4 + }, + { + "subscriptType" : 4 + } + ], + "typeId" : "B.uint16;0" + } + ], + "preloadable" : true, + "primitiveType" : 5, + "typeName" : "net.drinkingtea.nostalgia.core.Palette", + "typeVersion" : 2 +} diff --git a/deps/nostalgia/src/nostalgia/modules/core/include/nostalgia/core/tilesheet.hpp b/deps/nostalgia/src/nostalgia/modules/core/include/nostalgia/core/tilesheet.hpp index 3de737d..7a673d8 100644 --- a/deps/nostalgia/src/nostalgia/modules/core/include/nostalgia/core/tilesheet.hpp +++ b/deps/nostalgia/src/nostalgia/modules/core/include/nostalgia/core/tilesheet.hpp @@ -27,7 +27,7 @@ struct TileSheetV1 { int rows = 1; int columns = 1; ox::FileAddress defaultPalette; - Palette pal; + PaletteV1 pal; ox::Vector pixels = {}; }; diff --git a/deps/nostalgia/src/nostalgia/modules/core/src/gba/panic.cpp b/deps/nostalgia/src/nostalgia/modules/core/src/gba/panic.cpp index 67eaa70..728e3b0 100644 --- a/deps/nostalgia/src/nostalgia/modules/core/src/gba/panic.cpp +++ b/deps/nostalgia/src/nostalgia/modules/core/src/gba/panic.cpp @@ -32,8 +32,7 @@ void panic(const char *file, int line, const char *panicMsg, ox::Error const&err std::ignore = initConsole(*ctx); setBgStatus(*ctx, 0, true); clearBg(*ctx, 0); - ox::IString<23> serr = "Error code: "; - serr += static_cast(err); + auto const serr = ox::sfmt>("Error code: {}", static_cast(err)); puts(*ctx, 32 + 1, 1, "SADNESS..."); puts(*ctx, 32 + 1, 4, "UNEXPECTED STATE:"); puts(*ctx, 32 + 2, 6, panicMsg); diff --git a/deps/nostalgia/src/nostalgia/modules/core/src/studio/paletteeditor/paletteeditor-imgui.cpp b/deps/nostalgia/src/nostalgia/modules/core/src/studio/paletteeditor/paletteeditor-imgui.cpp index 7666504..2abae5a 100644 --- a/deps/nostalgia/src/nostalgia/modules/core/src/studio/paletteeditor/paletteeditor-imgui.cpp +++ b/deps/nostalgia/src/nostalgia/modules/core/src/studio/paletteeditor/paletteeditor-imgui.cpp @@ -68,12 +68,6 @@ void PaletteEditorImGui::drawColumn(ox::CStringView txt) noexcept { ImGui::Text("%s", txt.c_str()); } -void PaletteEditorImGui::drawColumn(uint64_t i) noexcept { - ox::Array numStr; - ox::itoa(i, numStr.data()); - drawColumn(numStr.data()); -} - void PaletteEditorImGui::drawColorsEditor() noexcept { constexpr auto tableFlags = ImGuiTableFlags_RowBg; auto const colorsSz = ImGui::GetContentRegionAvail(); diff --git a/deps/nostalgia/src/nostalgia/modules/core/src/studio/paletteeditor/paletteeditor-imgui.hpp b/deps/nostalgia/src/nostalgia/modules/core/src/studio/paletteeditor/paletteeditor-imgui.hpp index d8d5982..1a828ef 100644 --- a/deps/nostalgia/src/nostalgia/modules/core/src/studio/paletteeditor/paletteeditor-imgui.hpp +++ b/deps/nostalgia/src/nostalgia/modules/core/src/studio/paletteeditor/paletteeditor-imgui.hpp @@ -33,7 +33,9 @@ class PaletteEditorImGui: public studio::Editor { private: static void drawColumn(ox::CStringView txt) noexcept; - static void drawColumn(uint64_t i) noexcept; + static void drawColumn(ox::Integer_c auto i) noexcept { + drawColumn(ox::itoa(i)); + } void drawColorsEditor() noexcept; diff --git a/deps/nostalgia/src/nostalgia/modules/core/src/studio/tilesheeteditor/tilesheeteditor-imgui.cpp b/deps/nostalgia/src/nostalgia/modules/core/src/studio/tilesheeteditor/tilesheeteditor-imgui.cpp index a2c91f0..1a8546f 100644 --- a/deps/nostalgia/src/nostalgia/modules/core/src/studio/tilesheeteditor/tilesheeteditor-imgui.cpp +++ b/deps/nostalgia/src/nostalgia/modules/core/src/studio/tilesheeteditor/tilesheeteditor-imgui.cpp @@ -410,14 +410,13 @@ void TileSheetEditorImGui::drawPaletteSelector() noexcept { auto const pages = m_model.pal().pages.size(); if (pages > 1) { ImGui::Indent(20); - ox::Array numStr; - ox::itoa(m_model.palettePage() + 1, numStr.data()); + auto numStr = ox::itoa(m_model.palettePage() + 1); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x - comboWidthSub); - if (ImGui::BeginCombo("Page", numStr.data(), 0)) { + if (ImGui::BeginCombo("Page", numStr.c_str(), 0)) { for (auto n = 0u; n < pages; ++n) { auto const selected = (m_model.palettePage() == n); - ox::itoa(n + 1, numStr.data()); - if (ImGui::Selectable(numStr.data(), selected) && m_model.palettePage() != n) { + numStr = ox::itoa(n + 1); + if (ImGui::Selectable(numStr.c_str(), selected) && m_model.palettePage() != n) { m_model.setPalettePage(n); } if (selected) { @@ -440,7 +439,7 @@ void TileSheetEditorImGui::drawPaletteSelector() noexcept { ImGui::PushID(static_cast(i)); // Column: color idx ImGui::TableNextColumn(); - auto const label = ox::IString<8>() + (i + 1); + auto const label = ox::itoa(i + 1); auto const rowSelected = i == m_view.palIdx(); if (ImGui::Selectable(label.c_str(), rowSelected, ImGuiSelectableFlags_SpanAllColumns)) { m_view.setPalIdx(i); diff --git a/deps/nostalgia/src/olympic/keel/src/pack.cpp b/deps/nostalgia/src/olympic/keel/src/pack.cpp index 2f27e31..b94e364 100644 --- a/deps/nostalgia/src/olympic/keel/src/pack.cpp +++ b/deps/nostalgia/src/olympic/keel/src/pack.cpp @@ -29,7 +29,7 @@ static ox::Error pathToInode( return {}; } if (beginsWith(path, "uuid://")) { - auto const uuid = substr(path, 7); + auto const uuid = ox::substr(path, 7); oxReturnError(keel::uuidToPath(ctx, uuid).moveTo(path)); } oxRequire(s, dest.stat(path)); diff --git a/deps/nostalgia/src/olympic/studio/modlib/include/studio/studio.hpp b/deps/nostalgia/src/olympic/studio/modlib/include/studio/studio.hpp index 13d2ab0..9e47156 100644 --- a/deps/nostalgia/src/olympic/studio/modlib/include/studio/studio.hpp +++ b/deps/nostalgia/src/olympic/studio/modlib/include/studio/studio.hpp @@ -13,5 +13,6 @@ #include #include #include +#include #include #include diff --git a/deps/nostalgia/src/olympic/studio/modlib/include/studio/undocommand.hpp b/deps/nostalgia/src/olympic/studio/modlib/include/studio/undocommand.hpp new file mode 100644 index 0000000..9f7bb84 --- /dev/null +++ b/deps/nostalgia/src/olympic/studio/modlib/include/studio/undocommand.hpp @@ -0,0 +1,19 @@ +/* + * Copyright 2016 - 2024 Gary Talent (gary@drinkingtea.net). All rights reserved. + */ + +#pragma once + +namespace studio { + +class UndoCommand { + public: + virtual ~UndoCommand() noexcept = default; + virtual void redo() noexcept = 0; + virtual void undo() noexcept = 0; + [[nodiscard]] + virtual int commandId() const noexcept = 0; + virtual bool mergeWith(UndoCommand const*cmd) noexcept; +}; + +} diff --git a/deps/nostalgia/src/olympic/studio/modlib/include/studio/undostack.hpp b/deps/nostalgia/src/olympic/studio/modlib/include/studio/undostack.hpp index 094f713..3ef654b 100644 --- a/deps/nostalgia/src/olympic/studio/modlib/include/studio/undostack.hpp +++ b/deps/nostalgia/src/olympic/studio/modlib/include/studio/undostack.hpp @@ -9,17 +9,9 @@ #include #include -namespace studio { +#include "undocommand.hpp" -class UndoCommand { - public: - virtual ~UndoCommand() noexcept = default; - virtual void redo() noexcept = 0; - virtual void undo() noexcept = 0; - [[nodiscard]] - virtual int commandId() const noexcept = 0; - virtual bool mergeWith(UndoCommand const*cmd) noexcept; -}; +namespace studio { class UndoStack { private: diff --git a/deps/nostalgia/src/olympic/studio/modlib/src/CMakeLists.txt b/deps/nostalgia/src/olympic/studio/modlib/src/CMakeLists.txt index f3622c7..9cb4ee9 100644 --- a/deps/nostalgia/src/olympic/studio/modlib/src/CMakeLists.txt +++ b/deps/nostalgia/src/olympic/studio/modlib/src/CMakeLists.txt @@ -7,6 +7,7 @@ add_library( popup.cpp project.cpp task.cpp + undocommand.cpp undostack.cpp filedialog_nfd.cpp ) diff --git a/deps/nostalgia/src/olympic/studio/modlib/src/undocommand.cpp b/deps/nostalgia/src/olympic/studio/modlib/src/undocommand.cpp new file mode 100644 index 0000000..72fee36 --- /dev/null +++ b/deps/nostalgia/src/olympic/studio/modlib/src/undocommand.cpp @@ -0,0 +1,10 @@ + +#include + +namespace studio { + +bool UndoCommand::mergeWith(UndoCommand const*) noexcept { + return false; +} + +} diff --git a/deps/nostalgia/src/olympic/studio/modlib/src/undostack.cpp b/deps/nostalgia/src/olympic/studio/modlib/src/undostack.cpp index ac5031b..3d34858 100644 --- a/deps/nostalgia/src/olympic/studio/modlib/src/undostack.cpp +++ b/deps/nostalgia/src/olympic/studio/modlib/src/undostack.cpp @@ -6,10 +6,6 @@ namespace studio { -bool UndoCommand::mergeWith(UndoCommand const*) noexcept { - return false; -} - void UndoStack::push(ox::UPtr &&cmd) noexcept { for (auto const i = m_stackIdx; i < m_stack.size();) { std::ignore = m_stack.erase(i);