Compare commits

...

9 Commits

14 changed files with 147 additions and 77 deletions

1
.gitignore vendored
View File

@@ -7,6 +7,7 @@
.stfolder .stfolder
.stignore .stignore
scripts/__pycache__ scripts/__pycache__
pyenv
CMakeLists.txt.user CMakeLists.txt.user
ROM.oxfs ROM.oxfs
Session.vim Session.vim

View File

@@ -100,27 +100,52 @@ typedef uint32_t uintptr_t;
#error intptr_t, and uintptr_t undefined #error intptr_t, and uintptr_t undefined
#endif #endif
#endif
using size_t = decltype(alignof(int)); using size_t = decltype(alignof(int));
#if __has_include(<utility>)
#include <utility>
#endif #endif
namespace cityhash::detail { namespace cityhash::detail {
template<typename T>
struct remove_reference {
using type = T;
};
template<typename T>
struct remove_reference<T&> {
using type = T;
};
template<typename T>
struct remove_reference<T&&> {
using type = T;
};
template<typename T>
using remove_reference_t = typename remove_reference<T>::type;
template<typename T>
constexpr remove_reference_t<T> &&move(T &&t) noexcept {
return static_cast<remove_reference_t<T>&&>(t);
}
template<typename T>
using remove_reference_t = typename remove_reference<T>::type;
template<typename T1, typename T2> template<typename T1, typename T2>
struct pair { struct pair {
T1 first{}; T1 first{};
T2 second{}; T2 second{};
constexpr pair() noexcept = default; 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<typename T>
constexpr void swap(T &a, T &b) noexcept {
auto temp = detail::move(a);
a = detail::move(b);
b = detail::move(temp);
}
} }
namespace cityhash { namespace cityhash {
@@ -129,13 +154,6 @@ using uint128 = cityhash::detail::pair<uint64_t, uint64_t>;
namespace detail { namespace detail {
template<typename T>
constexpr void swap(T &a, T &b) noexcept {
auto temp = std::move(a);
a = std::move(b);
b = std::move(temp);
}
template<typename T> template<typename T>
[[nodiscard]] [[nodiscard]]
constexpr T byteSwap(T i) noexcept { 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 b = 0;
uint32_t c = 9; uint32_t c = 9;
for (size_t i = 0; i < len; i++) { for (size_t i = 0; i < len; i++) {
signed char v = static_cast<signed char>(s[i]); auto const v = static_cast<signed char>(s[i]);
b = b * detail::c1 + static_cast<uint32_t>(v); b = b * detail::c1 + static_cast<uint32_t>(v);
c ^= b; c ^= b;
} }

View File

@@ -10,17 +10,17 @@
#include "ignore.hpp" #include "ignore.hpp"
#include "memops.hpp" #include "memops.hpp"
#include "ox/std/error.hpp"
#include "stringview.hpp" #include "stringview.hpp"
#include "strops.hpp"
#include "typetraits.hpp" #include "typetraits.hpp"
namespace ox { namespace ox {
// Inline String // Inline String
template<std::size_t buffLen> template<std::size_t StrCap>
class IString { class IString {
private: private:
char m_buff[buffLen + 1]; char m_buff[StrCap + 1];
size_t m_size{}; size_t m_size{};
public: public:
@@ -87,6 +87,8 @@ class IString {
[[nodiscard]] [[nodiscard]]
constexpr std::size_t bytes() const noexcept; constexpr std::size_t bytes() const noexcept;
constexpr ox::Error resize(size_t sz) noexcept;
/** /**
* Returns the capacity of bytes for this string. * Returns the capacity of bytes for this string.
*/ */
@@ -192,38 +194,38 @@ constexpr IString<size> IString<size>::operator+(Integer_c auto i) const noexcep
return this->operator+(str); return this->operator+(str);
} }
template<std::size_t buffLen> template<std::size_t StrCap>
constexpr bool IString<buffLen>::operator==(const char *other) const noexcept { constexpr bool IString<StrCap>::operator==(const char *other) const noexcept {
return ox::StringView(*this) == other; return ox::StringView(*this) == other;
} }
template<std::size_t buffLen> template<std::size_t StrCap>
constexpr bool IString<buffLen>::operator==(const OxString_c auto &other) const noexcept { constexpr bool IString<StrCap>::operator==(const OxString_c auto &other) const noexcept {
return ox::StringView(*this) == ox::StringView(other); return ox::StringView(*this) == ox::StringView(other);
} }
template<std::size_t buffLen> template<std::size_t StrCap>
constexpr bool IString<buffLen>::operator!=(const char *other) const noexcept { constexpr bool IString<StrCap>::operator!=(const char *other) const noexcept {
return !operator==(other); return !operator==(other);
} }
template<std::size_t buffLen> template<std::size_t StrCap>
constexpr bool IString<buffLen>::operator!=(const OxString_c auto &other) noexcept { constexpr bool IString<StrCap>::operator!=(const OxString_c auto &other) noexcept {
return !operator==(other); return !operator==(other);
} }
template<std::size_t buffLen> template<std::size_t StrCap>
constexpr char IString<buffLen>::operator[](std::size_t i) const noexcept { constexpr char IString<StrCap>::operator[](std::size_t i) const noexcept {
return m_buff[i]; return m_buff[i];
} }
template<std::size_t buffLen> template<std::size_t StrCap>
constexpr char &IString<buffLen>::operator[](std::size_t i) noexcept { constexpr char &IString<StrCap>::operator[](std::size_t i) noexcept {
return m_buff[i]; return m_buff[i];
} }
template<std::size_t buffLen> template<std::size_t StrCap>
constexpr Error IString<buffLen>::append(const char *str, std::size_t strLen) noexcept { constexpr Error IString<StrCap>::append(const char *str, std::size_t strLen) noexcept {
Error err; Error err;
auto currentLen = len(); auto currentLen = len();
if (cap() < currentLen + strLen + 1) { if (cap() < currentLen + strLen + 1) {
@@ -236,26 +238,26 @@ constexpr Error IString<buffLen>::append(const char *str, std::size_t strLen) no
return err; return err;
} }
template<std::size_t buffLen> template<std::size_t StrCap>
constexpr const char *IString<buffLen>::data() const noexcept { constexpr const char *IString<StrCap>::data() const noexcept {
return static_cast<const char*>(m_buff); return static_cast<const char*>(m_buff);
} }
template<std::size_t buffLen> template<std::size_t StrCap>
constexpr char *IString<buffLen>::data() noexcept { constexpr char *IString<StrCap>::data() noexcept {
return static_cast<char*>(m_buff); return static_cast<char*>(m_buff);
} }
template<std::size_t buffLen> template<std::size_t StrCap>
constexpr const char *IString<buffLen>::c_str() const noexcept { constexpr const char *IString<StrCap>::c_str() const noexcept {
return static_cast<const char*>(m_buff); return static_cast<const char*>(m_buff);
} }
template<std::size_t buffLen> template<std::size_t StrCap>
constexpr std::size_t IString<buffLen>::len() const noexcept { constexpr std::size_t IString<StrCap>::len() const noexcept {
std::size_t length = 0; std::size_t length = 0;
for (std::size_t i = 0; i < buffLen; i++) { for (std::size_t i = 0; i < StrCap; i++) {
uint8_t b = static_cast<uint8_t>(m_buff[i]); uint8_t b = static_cast<uint8_t>(m_buff[i]);
if (b) { if (b) {
const auto asciiChar = (b & 128) == 0; const auto asciiChar = (b & 128) == 0;
@@ -270,16 +272,25 @@ constexpr std::size_t IString<buffLen>::len() const noexcept {
return length; return length;
} }
template<std::size_t buffLen> template<std::size_t StrCap>
constexpr std::size_t IString<buffLen>::bytes() const noexcept { constexpr std::size_t IString<StrCap>::bytes() const noexcept {
std::size_t i = 0; 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 return i + 1; // add one for null terminator
} }
template<std::size_t buffLen> template<std::size_t StrCap>
constexpr std::size_t IString<buffLen>::cap() const noexcept { constexpr ox::Error IString<StrCap>::resize(size_t sz) noexcept {
return buffLen; if (sz > StrCap) {
return OxError(1, "Trying to extend IString beyond its cap");
}
m_size = sz;
return {};
}
template<std::size_t StrCap>
constexpr std::size_t IString<StrCap>::cap() const noexcept {
return StrCap;
} }
template<size_t sz> template<size_t sz>

View File

@@ -14,26 +14,23 @@
#include "stringview.hpp" #include "stringview.hpp"
#include "types.hpp" #include "types.hpp"
#include "vector.hpp" #include "vector.hpp"
#include "writer.hpp"
namespace ox { namespace ox {
template<OxString_c Str>
[[nodiscard]] [[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) { if (str.len() >= pos) {
return Str(str.data() + pos, str.len() - pos); return {str.data() + pos, str.len() - pos};
} }
return Str(); return {};
} }
template<OxString_c Str>
[[nodiscard]] [[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) { if (str.len() >= start && end >= start) {
return Str(str.data() + start, end - start); return {str.data() + start, end - start};
} }
return Str(); return {};
} }
template<typename Integer> template<typename Integer>

View File

@@ -8,12 +8,12 @@
#pragma once #pragma once
#include "array.hpp"
#include "istring.hpp" #include "istring.hpp"
#include "buffer.hpp" #include "buffer.hpp"
#include "random.hpp" #include "random.hpp"
#include "ranges.hpp" #include "ranges.hpp"
#include "stringview.hpp" #include "stringview.hpp"
#include "strops.hpp"
namespace ox { namespace ox {
@@ -80,7 +80,8 @@ constexpr ox::IString<2> toHex(uint8_t v) noexcept {
'e', 'e',
'f', 'f',
}; };
ox::Array<char, 3> out; ox::IString<2> out;
std::ignore = out.resize(2);
out[0] = valMap[static_cast<unsigned>((v & 0xf0) / 16)]; out[0] = valMap[static_cast<unsigned>((v & 0xf0) / 16)];
out[1] = valMap[static_cast<unsigned>(v & 0x0f)]; out[1] = valMap[static_cast<unsigned>(v & 0x0f)];
out[2] = 0; out[2] = 0;

View File

@@ -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
}

View File

@@ -27,7 +27,7 @@ struct TileSheetV1 {
int rows = 1; int rows = 1;
int columns = 1; int columns = 1;
ox::FileAddress defaultPalette; ox::FileAddress defaultPalette;
Palette pal; PaletteV1 pal;
ox::Vector<uint8_t> pixels = {}; ox::Vector<uint8_t> pixels = {};
}; };

View File

@@ -29,7 +29,7 @@ static ox::Error pathToInode(
return {}; return {};
} }
if (beginsWith(path, "uuid://")) { if (beginsWith(path, "uuid://")) {
auto const uuid = substr<ox::StringView>(path, 7); auto const uuid = ox::substr(path, 7);
oxReturnError(keel::uuidToPath(ctx, uuid).moveTo(path)); oxReturnError(keel::uuidToPath(ctx, uuid).moveTo(path));
} }
oxRequire(s, dest.stat(path)); oxRequire(s, dest.stat(path));

View File

@@ -13,5 +13,6 @@
#include <studio/popup.hpp> #include <studio/popup.hpp>
#include <studio/project.hpp> #include <studio/project.hpp>
#include <studio/task.hpp> #include <studio/task.hpp>
#include <studio/undocommand.hpp>
#include <studio/undostack.hpp> #include <studio/undostack.hpp>
#include <studio/widget.hpp> #include <studio/widget.hpp>

View File

@@ -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;
};
}

View File

@@ -9,17 +9,9 @@
#include <ox/std/memory.hpp> #include <ox/std/memory.hpp>
#include <ox/std/vector.hpp> #include <ox/std/vector.hpp>
namespace studio { #include "undocommand.hpp"
class UndoCommand { namespace studio {
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;
};
class UndoStack { class UndoStack {
private: private:

View File

@@ -7,6 +7,7 @@ add_library(
popup.cpp popup.cpp
project.cpp project.cpp
task.cpp task.cpp
undocommand.cpp
undostack.cpp undostack.cpp
filedialog_nfd.cpp filedialog_nfd.cpp
) )

View File

@@ -0,0 +1,10 @@
#include <studio/undocommand.hpp>
namespace studio {
bool UndoCommand::mergeWith(UndoCommand const*) noexcept {
return false;
}
}

View File

@@ -6,10 +6,6 @@
namespace studio { namespace studio {
bool UndoCommand::mergeWith(UndoCommand const*) noexcept {
return false;
}
void UndoStack::push(ox::UPtr<UndoCommand> &&cmd) noexcept { void UndoStack::push(ox::UPtr<UndoCommand> &&cmd) noexcept {
for (auto const i = m_stackIdx; i < m_stack.size();) { for (auto const i = m_stackIdx; i < m_stack.size();) {
std::ignore = m_stack.erase(i); std::ignore = m_stack.erase(i);