Compare commits
16 Commits
release-d2
...
david/clar
Author | SHA1 | Date | |
---|---|---|---|
e009f68fbe | |||
671fa54f6f | |||
517432679b | |||
b31c01f724 | |||
f41213f13f | |||
28be7c4650 | |||
2f340b13b2 | |||
312c818866 | |||
0d69d0c4a2 | |||
81a0b8c820 | |||
172b5aee90 | |||
2b5338a9df | |||
8a430faf4c | |||
e59382dd60 | |||
3006e77ef3 | |||
59c112a69c |
23
Makefile
23
Makefile
@@ -14,7 +14,7 @@ endif
|
||||
PROJECT_PLAYER=./build/${BC_VAR_CURRENT_BUILD}/bin/${BC_VAR_PROJECT_NAME_CAP}
|
||||
|
||||
.PHONY: pkg-gba
|
||||
pkg-gba: build
|
||||
pkg-gba: build-pack build-gba-player
|
||||
${BC_CMD_ENVRUN} ${BC_PY3} ./util/scripts/pkg-gba.py sample_project ${BC_VAR_PROJECT_NAME_CAP}
|
||||
|
||||
.PHONY: pkg-mac
|
||||
@@ -26,25 +26,44 @@ generate-studio-rsrc:
|
||||
${BC_CMD_ENVRUN} ${BC_PY3} ./util/scripts/file-to-cpp.py --rsrc src/olympic/studio/applib/src/rsrc.json
|
||||
${BC_CMD_ENVRUN} ${BC_PY3} ./util/scripts/file-to-cpp.py --rsrc src/nostalgia/studio/rsrc.json
|
||||
|
||||
.PHONY: build-gba-player
|
||||
build-gba-player:
|
||||
cmake --build ./build/gba-*
|
||||
|
||||
.PHONY: build-player
|
||||
build-player:
|
||||
${BC_CMD_CMAKE_BUILD} ${BC_VAR_BUILD_PATH} ${BC_VAR_PROJECT_NAME_CAP}
|
||||
|
||||
.PHONY: build-pack
|
||||
build-pack:
|
||||
cmake --build ./build/${BC_VAR_CURRENT_BUILD} --target ${BC_VAR_PROJECT_NAME}-pack
|
||||
|
||||
|
||||
.PHONY: run
|
||||
run: build-player
|
||||
${PROJECT_PLAYER} sample_project
|
||||
|
||||
.PHONY: build-studio
|
||||
build-studio:
|
||||
cmake --build ./build/${BC_VAR_CURRENT_BUILD} --target ${BC_VAR_PROJECT_NAME_CAP}Studio
|
||||
|
||||
.PHONY: run-studio
|
||||
run-studio: build
|
||||
run-studio: build-studio
|
||||
${PROJECT_STUDIO}
|
||||
|
||||
.PHONY: gba-run
|
||||
gba-run: pkg-gba
|
||||
${MGBA} ${BC_VAR_PROJECT_NAME_CAP}.gba
|
||||
|
||||
.PHONY: debug
|
||||
debug: build
|
||||
${BC_CMD_HOST_DEBUGGER} ${PROJECT_PLAYER} sample_project
|
||||
|
||||
.PHONY: debug-studio
|
||||
debug-studio: build
|
||||
${BC_CMD_HOST_DEBUGGER} ${PROJECT_STUDIO}
|
||||
|
||||
|
||||
.PHONY: configure-gba
|
||||
configure-gba:
|
||||
${BC_CMD_SETUP_BUILD} --toolchain=deps/gbabuildcore/cmake/modules/GBA.cmake --target=gba --current_build=0 --build_type=release --build_root=${BC_VAR_BUILD_PATH}
|
||||
|
2
deps/ox/src/ox/clargs/clargs.cpp
vendored
2
deps/ox/src/ox/clargs/clargs.cpp
vendored
@@ -40,7 +40,7 @@ ClArgs::ClArgs(ox::SpanView<const char*> args) noexcept {
|
||||
}
|
||||
|
||||
bool ClArgs::getBool(ox::StringViewCR arg, bool defaultValue) const noexcept {
|
||||
auto const [value, err] = m_ints.at(arg);
|
||||
auto const [value, err] = m_bools.at(arg);
|
||||
return !err ? *value : defaultValue;
|
||||
}
|
||||
|
||||
|
4
deps/ox/src/ox/fs/filesystem/filesystem.hpp
vendored
4
deps/ox/src/ox/fs/filesystem/filesystem.hpp
vendored
@@ -87,7 +87,7 @@ class FileSystem {
|
||||
return writeFilePath(path, buffer, size, FileType::NormalFile);
|
||||
}
|
||||
|
||||
Error write(StringViewCR path, ox::Span<char> const&buff) noexcept {
|
||||
Error write(StringViewCR path, ox::SpanView<char> const&buff) noexcept {
|
||||
return write(path, buff.data(), buff.size(), FileType::NormalFile);
|
||||
}
|
||||
|
||||
@@ -95,7 +95,7 @@ class FileSystem {
|
||||
return write(inode, buffer, size, FileType::NormalFile);
|
||||
}
|
||||
|
||||
Error write(uint64_t inode, ox::Span<char> const&buff) noexcept {
|
||||
Error write(uint64_t inode, ox::SpanView<char> const&buff) noexcept {
|
||||
return write(inode, buff.data(), buff.size(), FileType::NormalFile);
|
||||
}
|
||||
|
||||
|
1
deps/ox/src/ox/mc/test/tests.cpp
vendored
1
deps/ox/src/ox/mc/test/tests.cpp
vendored
@@ -157,7 +157,6 @@ std::map<ox::StringView, ox::Error(*)()> tests = {
|
||||
oxAssert(testIn.Int8 == testOut.Int8, "Int8 value mismatch");
|
||||
oxAssert(testIn.Union.Int == testOut.Union.Int, "Union.Int value mismatch");
|
||||
oxAssert(testIn.String == testOut.String, "String value mismatch");
|
||||
oxDebugf("{}", testOut.IString.size());
|
||||
oxExpect(testIn.IString, testOut.IString);
|
||||
oxAssert(testIn.List[0] == testOut.List[0], "List[0] value mismatch");
|
||||
oxAssert(testIn.List[1] == testOut.List[1], "List[1] value mismatch");
|
||||
|
1
deps/ox/src/ox/oc/read.hpp
vendored
1
deps/ox/src/ox/oc/read.hpp
vendored
@@ -181,7 +181,6 @@ Error OrganicClawReader::field(const char *key, T *val) noexcept {
|
||||
}
|
||||
}
|
||||
} catch (Json::LogicError const&e) {
|
||||
oxDebugf("JSON error: {}", e.what());
|
||||
err = ox::Error(1, "error reading JSON data");
|
||||
}
|
||||
++m_fieldIt;
|
||||
|
2
deps/ox/src/ox/std/assert.cpp
vendored
2
deps/ox/src/ox/std/assert.cpp
vendored
@@ -33,7 +33,7 @@ void panic(StringViewCR file, int const line, StringViewCR panicMsg, Error const
|
||||
#endif
|
||||
}
|
||||
|
||||
#if __GNUC__
|
||||
#if __GNUC__ && !_WIN32
|
||||
__attribute__((weak))
|
||||
#endif
|
||||
void panic(const char *file, int const line, char const*panicMsg, Error const&err) noexcept {
|
||||
|
38
deps/ox/src/ox/std/new.hpp
vendored
38
deps/ox/src/ox/std/new.hpp
vendored
@@ -30,11 +30,49 @@ constexpr void *operator new(std::size_t, void *addr) noexcept {
|
||||
constexpr void *operator new[](std::size_t, void *addr) noexcept {
|
||||
return addr;
|
||||
}
|
||||
|
||||
namespace std {
|
||||
|
||||
template<typename T>
|
||||
[[nodiscard]]
|
||||
constexpr T* launder(T* __p) noexcept {
|
||||
return __builtin_launder(__p);
|
||||
}
|
||||
|
||||
template<typename T, typename... Args, bool noex>
|
||||
void launder(T(*)(Args...) noexcept(noex)) = delete;
|
||||
template<typename T, typename... Args, bool noex>
|
||||
void launder(T(*)(Args......) noexcept(noex)) = delete;
|
||||
void launder(void*) = delete;
|
||||
void launder(void const*) = delete;
|
||||
void launder(volatile void*) = delete;
|
||||
void launder(volatile void const*) = delete;
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
namespace ox {
|
||||
|
||||
/**
|
||||
* Aliases type T in size and alignment to allow allocating space for a T
|
||||
* without running the constructor.
|
||||
*/
|
||||
template<typename T, std::size_t sz = sizeof(T)>
|
||||
struct alignas(alignof(T)) AllocAlias {
|
||||
char buff[sz];
|
||||
constexpr AllocAlias() noexcept = default;
|
||||
[[nodiscard]]
|
||||
auto data() noexcept {
|
||||
return reinterpret_cast<T*>(this);
|
||||
}
|
||||
[[nodiscard]]
|
||||
auto data() const noexcept {
|
||||
return reinterpret_cast<T const*>(this);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
template<typename T, typename U = T, typename ...Args>
|
||||
[[nodiscard]]
|
||||
constexpr U *make(Args &&...args) noexcept {
|
||||
|
1
deps/ox/src/ox/std/test/tests.cpp
vendored
1
deps/ox/src/ox/std/test/tests.cpp
vendored
@@ -337,7 +337,6 @@ OX_CLANG_NOWARN_END
|
||||
oxExpect(si["asdf"], 0);
|
||||
oxAssert(si["aoeu"] == 100, "aoeu != 100");
|
||||
auto si2 = si;
|
||||
oxDebugf("{}", si2["asdf"]);
|
||||
oxExpect(si2["asdf"], 0);
|
||||
oxAssert(si2["aoeu"] == 100, "aoeu != 100");
|
||||
ox::HashMap<int, int> ii;
|
||||
|
4
deps/ox/src/ox/std/trace.hpp
vendored
4
deps/ox/src/ox/std/trace.hpp
vendored
@@ -268,7 +268,7 @@ 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");
|
||||
TraceStream trc(file, line, "ox.error");
|
||||
if (err.src.file_name() != nullptr) {
|
||||
trc << "Error: (" << err.src.file_name() << ":" << err.src.line() << "):";
|
||||
} else {
|
||||
@@ -280,7 +280,7 @@ inline void logError(const char *file, int line, const char *fmt, const Error &e
|
||||
|
||||
inline void logError(const char *file, int line, const Error &err) noexcept {
|
||||
if (err) {
|
||||
TraceStream trc(file, line, "ox::error");
|
||||
TraceStream trc(file, line, "ox.error");
|
||||
trc << "Error:" << err;
|
||||
if (err.src.file_name() != nullptr) {
|
||||
trc << "(" << err.src.file_name() << ":" << err.src.line() << ")";
|
||||
|
19
deps/ox/src/ox/std/types.hpp
vendored
19
deps/ox/src/ox/std/types.hpp
vendored
@@ -63,25 +63,6 @@ namespace ox {
|
||||
|
||||
using CString = char const*;
|
||||
|
||||
/**
|
||||
* Aliases type T in size and alignment to allow allocating space for a T
|
||||
* without running the constructor.
|
||||
*/
|
||||
template<typename T, std::size_t sz = sizeof(T)>
|
||||
struct alignas(alignof(T)) AllocAlias {
|
||||
char buff[sz];
|
||||
constexpr AllocAlias() noexcept = default;
|
||||
[[nodiscard]]
|
||||
auto data() noexcept {
|
||||
return reinterpret_cast<T*>(this);
|
||||
}
|
||||
[[nodiscard]]
|
||||
auto data() const noexcept {
|
||||
return reinterpret_cast<const T*>(this);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
template<std::size_t sz>
|
||||
struct SignedType {
|
||||
};
|
||||
|
65
deps/ox/src/ox/std/vector.hpp
vendored
65
deps/ox/src/ox/std/vector.hpp
vendored
@@ -34,10 +34,10 @@ struct VectorAllocator {
|
||||
ox::Array<AllocAlias<T>, Size> m_data = {};
|
||||
protected:
|
||||
constexpr VectorAllocator() noexcept = default;
|
||||
constexpr VectorAllocator(const VectorAllocator&) noexcept = default;
|
||||
constexpr VectorAllocator(VectorAllocator const&) noexcept = default;
|
||||
constexpr VectorAllocator(VectorAllocator&&) noexcept = default;
|
||||
|
||||
constexpr void allocate(T **items, std::size_t cap) noexcept {
|
||||
constexpr void allocate(T **items, std::size_t const 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 = Allocator{}.allocate(cap);
|
||||
@@ -49,42 +49,26 @@ struct VectorAllocator {
|
||||
constexpr void moveConstructItemsFrom(
|
||||
T **items,
|
||||
VectorAllocator *src,
|
||||
const std::size_t count,
|
||||
const std::size_t cap) noexcept {
|
||||
std::size_t const count,
|
||||
std::size_t const cap) noexcept {
|
||||
// this totally idiotic redundant check (&& count <= Size) is required to address a bug in devkitARM,
|
||||
// try removing it later
|
||||
if (!std::is_constant_evaluated()) {
|
||||
if (cap <= m_data.size() && count <= m_data.size()) {
|
||||
for (auto i = 0u; i < count; ++i) {
|
||||
const auto dstItem = reinterpret_cast<T *>(&m_data[i]);
|
||||
const auto srcItem = reinterpret_cast<T *>(&src->m_data[i]);
|
||||
std::construct_at<T>(dstItem, std::move(*srcItem));
|
||||
auto const srcItem = std::launder(reinterpret_cast<T*>(&src->m_data[i]));
|
||||
new (&m_data[i]) T(std::move(*srcItem));
|
||||
}
|
||||
if (count) {
|
||||
*items = std::launder(reinterpret_cast<T*>(m_data.data()));
|
||||
} else {
|
||||
*items = reinterpret_cast<T*>(m_data.data());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
constexpr void moveItemsFrom(
|
||||
T **items,
|
||||
VectorAllocator *src,
|
||||
const std::size_t count,
|
||||
const std::size_t cap) noexcept {
|
||||
// this totally idiotic redundant check (&& count <= Size) is required to address a bug in devkitARM,
|
||||
// try removing it later
|
||||
if (!std::is_constant_evaluated()) {
|
||||
if (cap <= m_data.size() && count <= m_data.size()) {
|
||||
for (std::size_t i = 0; i < count; ++i) {
|
||||
const auto dstItem = reinterpret_cast<T *>(&m_data[i]);
|
||||
const auto srcItem = reinterpret_cast<T *>(&src->m_data[i]);
|
||||
*dstItem = std::move(*srcItem);
|
||||
}
|
||||
*items = reinterpret_cast<T*>(m_data.data());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
constexpr void deallocate(T *items, std::size_t cap) noexcept {
|
||||
constexpr void deallocate(T *const items, std::size_t const cap) noexcept {
|
||||
// small vector optimization cannot be done it constexpr, but it doesn't really matter in constexpr
|
||||
if (std::is_constant_evaluated()) {
|
||||
if (items) {
|
||||
@@ -103,10 +87,10 @@ template<typename T, typename Allocator>
|
||||
struct VectorAllocator<T, Allocator, 0> {
|
||||
protected:
|
||||
constexpr VectorAllocator() noexcept = default;
|
||||
constexpr VectorAllocator(const VectorAllocator&) noexcept = default;
|
||||
constexpr VectorAllocator(VectorAllocator const&) noexcept = default;
|
||||
constexpr VectorAllocator(VectorAllocator&&) noexcept = default;
|
||||
|
||||
constexpr void allocate(T **items, std::size_t cap) noexcept {
|
||||
constexpr void allocate(T **items, std::size_t const cap) noexcept {
|
||||
*items = Allocator{}.allocate(cap);
|
||||
}
|
||||
|
||||
@@ -114,15 +98,15 @@ struct VectorAllocator<T, Allocator, 0> {
|
||||
constexpr void moveConstructItemsFrom(
|
||||
T**,
|
||||
VectorAllocator*,
|
||||
const std::size_t,
|
||||
const std::size_t) noexcept {
|
||||
std::size_t const,
|
||||
std::size_t const) noexcept {
|
||||
}
|
||||
|
||||
[[maybe_unused]]
|
||||
constexpr void moveItemsFrom(T**, VectorAllocator*, const std::size_t, const std::size_t) noexcept {
|
||||
constexpr void moveItemsFrom(T**, VectorAllocator*, std::size_t const, std::size_t const) noexcept {
|
||||
}
|
||||
|
||||
constexpr void deallocate(T *items, std::size_t cap) noexcept {
|
||||
constexpr void deallocate(T *const items, std::size_t const cap) noexcept {
|
||||
if (items) {
|
||||
Allocator{}.deallocate(items, cap);
|
||||
}
|
||||
@@ -287,7 +271,9 @@ class Vector: detail::VectorAllocator<T, Allocator, SmallVectorSize> {
|
||||
template<typename... Args>
|
||||
constexpr T &emplace_back(Args&&... args) noexcept(useNoexcept);
|
||||
|
||||
constexpr void push_back(T item) noexcept(useNoexcept);
|
||||
constexpr void push_back(T const &item) noexcept(useNoexcept);
|
||||
|
||||
constexpr void push_back(T &&item) noexcept(useNoexcept);
|
||||
|
||||
constexpr void pop_back() noexcept(useNoexcept);
|
||||
|
||||
@@ -421,7 +407,7 @@ constexpr Vector<T, SmallVectorSize, Allocator> &Vector<T, SmallVectorSize, Allo
|
||||
m_size = other.m_size;
|
||||
m_cap = other.m_cap;
|
||||
m_items = other.m_items;
|
||||
this->moveItemsFrom(&m_items, &other, m_size, m_cap);
|
||||
this->moveConstructItemsFrom(&m_items, &other, m_size, m_cap);
|
||||
other.m_size = 0;
|
||||
other.m_cap = 0;
|
||||
other.m_items = nullptr;
|
||||
@@ -617,7 +603,16 @@ constexpr T &Vector<T, SmallVectorSize, Allocator>::emplace_back(Args&&... args)
|
||||
}
|
||||
|
||||
template<typename T, std::size_t SmallVectorSize, typename Allocator>
|
||||
constexpr void Vector<T, SmallVectorSize, Allocator>::push_back(T item) noexcept(useNoexcept) {
|
||||
constexpr void Vector<T, SmallVectorSize, Allocator>::push_back(T const &item) noexcept(useNoexcept) {
|
||||
if (m_size == m_cap) {
|
||||
reserve(m_cap ? m_cap * 2 : initialCap);
|
||||
}
|
||||
std::construct_at(&m_items[m_size], item);
|
||||
++m_size;
|
||||
}
|
||||
|
||||
template<typename T, std::size_t SmallVectorSize, typename Allocator>
|
||||
constexpr void Vector<T, SmallVectorSize, Allocator>::push_back(T &&item) noexcept(useNoexcept) {
|
||||
if (m_size == m_cap) {
|
||||
reserve(m_cap ? m_cap * 2 : initialCap);
|
||||
}
|
||||
|
@@ -5,6 +5,13 @@
|
||||
#pragma once
|
||||
|
||||
#include <ox/std/error.hpp>
|
||||
#include <ox/std/span.hpp>
|
||||
#include <ox/std/stringview.hpp>
|
||||
|
||||
#include <studio/project.hpp>
|
||||
|
||||
#include <nostalgia/gfx/palette.hpp>
|
||||
#include <nostalgia/gfx/tilesheet.hpp>
|
||||
|
||||
namespace nostalgia::gfx {
|
||||
|
||||
|
@@ -3,7 +3,6 @@
|
||||
*/
|
||||
|
||||
#include <imgui.h>
|
||||
#include <lodepng.h>
|
||||
|
||||
#include <ox/std/point.hpp>
|
||||
#include <keel/media.hpp>
|
||||
|
@@ -57,7 +57,6 @@ class TileSheetEditorImGui: public studio::Editor {
|
||||
ox::Vec2 m_prevMouseDownPos;
|
||||
TileSheetTool m_tool = TileSheetTool::Draw;
|
||||
bool m_palPathFocused{};
|
||||
ox::Vector<ox::UPtr<studio::UndoCommand>, 1> m_deferredCmds;
|
||||
|
||||
public:
|
||||
TileSheetEditorImGui(studio::Context &sctx, ox::StringParam path);
|
||||
|
@@ -15,7 +15,7 @@ target_link_libraries(
|
||||
|
||||
target_compile_definitions(
|
||||
NostalgiaStudio PUBLIC
|
||||
OLYMPIC_APP_VERSION="d2025.07.0"
|
||||
OLYMPIC_APP_VERSION="dev build"
|
||||
)
|
||||
|
||||
install(
|
||||
|
@@ -18,7 +18,7 @@
|
||||
<string>APPL</string>
|
||||
|
||||
<key>CFBundleVersion</key>
|
||||
<string>d2025.07.0</string>
|
||||
<string>dev build</string>
|
||||
|
||||
<key>LSMinimumSystemVersion</key>
|
||||
<string>12.0.0</string>
|
||||
|
@@ -13,7 +13,7 @@ namespace keel {
|
||||
|
||||
constexpr auto K1HdrSz = 40;
|
||||
|
||||
ox::Result<ox::UUID> readUuidHeader(ox::BufferView buff) noexcept;
|
||||
ox::Result<ox::UUID> readUuidHeader(ox::BufferView const &buff) noexcept;
|
||||
|
||||
ox::Result<ox::UUID> regenerateUuidHeader(ox::Buffer &buff) noexcept;
|
||||
|
||||
@@ -35,15 +35,15 @@ ox::Result<T> readAsset(ox::BufferView buff) noexcept {
|
||||
return out;
|
||||
}
|
||||
|
||||
ox::Result<ox::ModelObject> readAsset(ox::TypeStore &ts, ox::BufferView buff) noexcept;
|
||||
ox::Result<ox::ModelObject> readAsset(ox::TypeStore &ts, ox::BufferView const &buff) noexcept;
|
||||
|
||||
struct AssetHdr {
|
||||
ox::UUID uuid;
|
||||
ox::ClawHeader clawHdr;
|
||||
};
|
||||
|
||||
ox::Result<ox::StringView> readAssetTypeId(ox::BufferView buff) noexcept;
|
||||
ox::Result<ox::StringView> readAssetTypeId(ox::BufferView const &buff) noexcept;
|
||||
|
||||
ox::Result<AssetHdr> readAssetHeader(ox::BufferView buff) noexcept;
|
||||
ox::Result<AssetHdr> readAssetHeader(ox::BufferView const &buff) noexcept;
|
||||
|
||||
}
|
||||
|
@@ -147,7 +147,7 @@ template<typename T>
|
||||
ox::Result<AssetRef<T>> readObj(
|
||||
Context &ctx,
|
||||
ox::StringViewCR assetId,
|
||||
[[maybe_unused]] bool forceLoad = false) noexcept {
|
||||
[[maybe_unused]] bool const forceLoad = false) noexcept {
|
||||
#ifndef OX_BARE_METAL
|
||||
return readObjFile<T>(ctx, assetId, forceLoad);
|
||||
#else
|
||||
@@ -159,7 +159,7 @@ template<typename T>
|
||||
ox::Result<AssetRef<T>> readObj(
|
||||
Context &ctx,
|
||||
ox::FileAddress const &file,
|
||||
[[maybe_unused]] bool forceLoad = false) noexcept {
|
||||
[[maybe_unused]] bool const forceLoad = false) noexcept {
|
||||
#ifndef OX_BARE_METAL
|
||||
OX_REQUIRE(assetId, file.getPath());
|
||||
return readObj<T>(ctx, ox::StringView(assetId), forceLoad);
|
||||
@@ -178,7 +178,7 @@ ox::Error writeObj(
|
||||
Context &ctx,
|
||||
ox::FileAddress const &file,
|
||||
T const &obj,
|
||||
ox::ClawFormat fmt = ox::ClawFormat::Metal) noexcept {
|
||||
ox::ClawFormat const fmt = ox::ClawFormat::Metal) noexcept {
|
||||
OX_REQUIRE(objBuff, ox::writeClaw(obj, fmt));
|
||||
return ctx.rom->write(file, objBuff.data(), objBuff.size());
|
||||
}
|
||||
|
@@ -214,7 +214,7 @@ class Converter {
|
||||
}
|
||||
[[nodiscard]]
|
||||
BaseConverter const &converter() const noexcept {
|
||||
return *m_buff.data();
|
||||
return *std::launder(m_buff.data());
|
||||
}
|
||||
};
|
||||
|
||||
|
@@ -16,7 +16,7 @@ class TypeStore: public ox::TypeStore {
|
||||
ox::String m_descPath;
|
||||
|
||||
public:
|
||||
explicit TypeStore(ox::FileSystem &fs, ox::StringView descPath) noexcept;
|
||||
explicit TypeStore(ox::FileSystem &fs, ox::StringViewCR descPath) noexcept;
|
||||
|
||||
protected:
|
||||
ox::Result<ox::UPtr<ox::DescriptorType>> loadDescriptor(ox::StringView typeId) noexcept override;
|
||||
|
@@ -6,7 +6,7 @@
|
||||
|
||||
namespace keel {
|
||||
|
||||
ox::Result<ox::UUID> readUuidHeader(ox::BufferView buff) noexcept {
|
||||
ox::Result<ox::UUID> readUuidHeader(ox::BufferView const &buff) noexcept {
|
||||
if (buff.size() < K1HdrSz) [[unlikely]] {
|
||||
return ox::Error{1, "Insufficient data to contain complete Keel header"};
|
||||
}
|
||||
@@ -27,16 +27,15 @@ ox::Result<ox::UUID> regenerateUuidHeader(ox::Buffer &buff) noexcept {
|
||||
return id;
|
||||
}
|
||||
|
||||
ox::Result<ox::ModelObject> readAsset(ox::TypeStore &ts, ox::BufferView buff) noexcept {
|
||||
ox::Result<ox::ModelObject> readAsset(ox::TypeStore &ts, ox::BufferView const &buff) noexcept {
|
||||
std::size_t offset = 0;
|
||||
if (!readUuidHeader(buff).error) {
|
||||
offset = K1HdrSz;
|
||||
}
|
||||
buff += offset;
|
||||
return ox::readClaw(ts, buff);
|
||||
return ox::readClaw(ts, buff + offset);
|
||||
}
|
||||
|
||||
ox::Result<ox::StringView> readAssetTypeId(ox::BufferView const buff) noexcept {
|
||||
ox::Result<ox::StringView> readAssetTypeId(ox::BufferView const &buff) noexcept {
|
||||
auto const err = readUuidHeader(buff).error;
|
||||
auto const offset = err ? 0u : K1HdrSz;
|
||||
if (offset >= buff.size()) [[unlikely]] {
|
||||
@@ -45,15 +44,14 @@ ox::Result<ox::StringView> readAssetTypeId(ox::BufferView const buff) noexcept {
|
||||
return ox::readClawTypeId(buff + offset);
|
||||
}
|
||||
|
||||
ox::Result<AssetHdr> readAssetHeader(ox::BufferView buff) noexcept {
|
||||
ox::Result<AssetHdr> readAssetHeader(ox::BufferView const &buff) noexcept {
|
||||
ox::Result<AssetHdr> out;
|
||||
auto const err = readUuidHeader(buff).moveTo(out.value.uuid);
|
||||
auto const offset = err ? 0u : K1HdrSz;
|
||||
if (offset >= buff.size()) [[unlikely]] {
|
||||
return ox::Error(1, "Buffer too small for expected data");
|
||||
}
|
||||
buff += offset;
|
||||
OX_RETURN_ERROR(ox::readClawHeader(buff).moveTo(out.value.clawHdr));
|
||||
OX_RETURN_ERROR(ox::readClawHeader(buff + offset).moveTo(out.value.clawHdr));
|
||||
return out;
|
||||
}
|
||||
|
||||
|
@@ -187,7 +187,7 @@ static ox::Error copy(
|
||||
OX_DEFER [&status] {
|
||||
oxOutf(" {}\n", status);
|
||||
};
|
||||
OX_REQUIRE_M(buff, src.read(currentFile));
|
||||
OX_REQUIRE(buff, src.read(currentFile));
|
||||
// write file to dest
|
||||
OX_RETURN_ERROR(dest.write(currentFile, buff));
|
||||
status = "OK";
|
||||
|
@@ -6,7 +6,7 @@
|
||||
|
||||
namespace keel {
|
||||
|
||||
TypeStore::TypeStore(ox::FileSystem &fs, ox::StringView descPath) noexcept:
|
||||
TypeStore::TypeStore(ox::FileSystem &fs, ox::StringViewCR descPath) noexcept:
|
||||
m_fs(fs),
|
||||
m_descPath(descPath) {
|
||||
}
|
||||
|
@@ -25,7 +25,7 @@ static std::map<ox::StringView, ox::Error(*)()> tests = {
|
||||
},
|
||||
};
|
||||
|
||||
int main(int argc, char const **argv) {
|
||||
int main(int const argc, char const **argv) {
|
||||
int retval = -1;
|
||||
if (argc > 0) {
|
||||
auto const args = ox::Span{argv, static_cast<size_t>(argc)};
|
||||
|
@@ -31,7 +31,7 @@ ox::Result<T> getDragDropPayload(ox::CStringViewCR name) noexcept {
|
||||
return ox::Error(1, "No drag/drop payload");
|
||||
}
|
||||
return ox::readClaw<T>({
|
||||
reinterpret_cast<char const*>(payload->Data),
|
||||
std::launder(reinterpret_cast<char const*>(payload->Data)),
|
||||
static_cast<size_t>(payload->DataSize)});
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user