diff --git a/deps/glutils/src/glutils.cpp b/deps/glutils/src/glutils.cpp index c02f9f7..b705e60 100644 --- a/deps/glutils/src/glutils.cpp +++ b/deps/glutils/src/glutils.cpp @@ -83,13 +83,13 @@ static ox::Result buildShader( ox::Vector errMsg(ox::units::KB); glGetShaderInfoLog(shader, static_cast(errMsg.size()), nullptr, errMsg.data()); oxErrorf("shader compile error in {}: {}", shaderName, errMsg.data()); - return OxError(1, "shader compile error"); + return ox::Error(1, "shader compile error"); } return shader; } ox::Result buildShaderProgram(ProgramSource const&src) noexcept { - oxRequireM(program, buildShaderProgram( + OX_REQUIRE_M(program, buildShaderProgram( src.vertShader, src.fragShader, src.geomShader)); @@ -127,13 +127,13 @@ ox::Result buildShaderProgram( ox::CStringView const&frag, ox::CStringView const&geo) noexcept { GLProgram prgm(glCreateProgram()); - oxRequire(vs, buildShader(GL_VERTEX_SHADER, vert.c_str(), "vshad")); + OX_REQUIRE(vs, buildShader(GL_VERTEX_SHADER, vert.c_str(), "vshad")); glAttachShader(prgm, vs); if (geo.c_str() && geo.bytes() != 0) { - oxRequire(gs, buildShader(GL_GEOMETRY_SHADER, geo.c_str(), "gshad")); + OX_REQUIRE(gs, buildShader(GL_GEOMETRY_SHADER, geo.c_str(), "gshad")); glAttachShader(prgm, gs); } - oxRequire(fs, buildShader(GL_FRAGMENT_SHADER, frag.c_str(), "fshad")); + OX_REQUIRE(fs, buildShader(GL_FRAGMENT_SHADER, frag.c_str(), "fshad")); glAttachShader(prgm, fs); glLinkProgram(prgm); return prgm; diff --git a/deps/nfde/CMakeLists.txt b/deps/nfde/CMakeLists.txt index bdaa8de..1c4bf69 100644 --- a/deps/nfde/CMakeLists.txt +++ b/deps/nfde/CMakeLists.txt @@ -10,7 +10,11 @@ if(NOT DEFINED BUILD_SHARED_LIBS) option(BUILD_SHARED_LIBS "Build a shared library instead of static" OFF) endif() option(NFD_BUILD_TESTS "Build tests for nfd" ${nfd_ROOT_PROJECT}) -option(NFD_INSTALL "Generate install target for nfd" ${nfd_ROOT_PROJECT}) +# DrinkingTea: begin +if(NOT DEFINED NFD_INSTALL) + option(NFD_INSTALL "Generate install target for nfd" ${nfd_ROOT_PROJECT}) +endif() +# DrinkingTea: end set(nfd_PLATFORM Undefined) if(WIN32) @@ -21,7 +25,9 @@ elseif(UNIX AND NOT APPLE) set(nfd_PLATFORM PLATFORM_UNIX) endif() -message("nfd Platform: ${nfd_PLATFORM}") +# DrinkingTea: begin +#message("nfd Platform: ${nfd_PLATFORM}") +# DrinkingTea: end set(nfd_COMPILER Undefined) if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC") @@ -33,7 +39,9 @@ elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "C set(nfd_COMPILER COMPILER_GNU) endif() -message("nfd Compiler: ${nfd_COMPILER}") +# DrinkingTea: begin +#message("nfd Compiler: ${nfd_COMPILER}") +# DrinkingTea: end # Use latest C++ by default (should be the best one), but let user override it if(NOT DEFINED CMAKE_CXX_STANDARD) diff --git a/deps/nfde/src/nfd_win.cpp b/deps/nfde/src/nfd_win.cpp index 772dfb2..a551f85 100644 --- a/deps/nfde/src/nfd_win.cpp +++ b/deps/nfde/src/nfd_win.cpp @@ -201,7 +201,7 @@ nfdresult_t SetDefaultExtension(::IFileDialog* fileOpenDialog, } if (*p_spec) { // multiple file extensions for this type (need to allocate memory) - size_t numChars = p_spec - filterList[0].spec; + size_t numChars = static_cast(p_spec - filterList[0].spec); // allocate one more char space for the '\0' nfdnchar_t* extnBuf = NFDi_Malloc(sizeof(nfdnchar_t) * (numChars + 1)); if (!extnBuf) { @@ -710,7 +710,7 @@ nfdresult_t CopyCharToWChar(const nfdu8char_t* inStr, nfdnchar_t*& outStr) { int charsNeeded = MultiByteToWideChar(CP_UTF8, 0, inStr, -1, nullptr, 0); assert(charsNeeded); - nfdnchar_t* tmp_outStr = NFDi_Malloc(sizeof(nfdnchar_t) * charsNeeded); + nfdnchar_t* tmp_outStr = NFDi_Malloc(sizeof(nfdnchar_t) * static_cast(charsNeeded)); if (!tmp_outStr) { return NFD_ERROR; } @@ -727,7 +727,7 @@ nfdresult_t CopyWCharToNFDChar(const nfdnchar_t* inStr, nfdu8char_t*& outStr) { int bytesNeeded = WideCharToMultiByte(CP_UTF8, 0, inStr, -1, nullptr, 0, nullptr, nullptr); assert(bytesNeeded); - nfdu8char_t* tmp_outStr = NFDi_Malloc(sizeof(nfdu8char_t) * bytesNeeded); + nfdu8char_t* tmp_outStr = NFDi_Malloc(sizeof(nfdu8char_t) * static_cast(bytesNeeded)); if (!tmp_outStr) { return NFD_ERROR; } diff --git a/deps/ox/deps/cityhash/CMakeLists.txt b/deps/ox/deps/cityhash/CMakeLists.txt index 0521c3e..1e6b8e4 100644 --- a/deps/ox/deps/cityhash/CMakeLists.txt +++ b/deps/ox/deps/cityhash/CMakeLists.txt @@ -9,9 +9,6 @@ set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_POSITION_INDEPENDENT_CODE ON) -set(NOSTALGIA_BUILD_PLAYER OFF) -set(NOSTALGIA_BUILD_STUDIO_APP OFF) - set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) @@ -28,3 +25,10 @@ endif() add_library(CityHash INTERFACE) target_include_directories(CityHash INTERFACE include) + +install( + DIRECTORY + include/cityhash + DESTINATION + include +) diff --git a/deps/ox/ox-docs.md b/deps/ox/ox-docs.md index 2cdbfa3..7a29d54 100644 --- a/deps/ox/ox-docs.md +++ b/deps/ox/ox-docs.md @@ -97,12 +97,12 @@ ox::Result caller8(int i) { ``` Lastly, there are a few macros available to help in passing ```ox::Error```s -back up the call stack, ```oxReturnError```, ```oxThrowError```, and -```oxRequire```. +back up the call stack, ```OX_RETURN_ERROR```, ```OX_THROW_ERROR```, and +```OX_REQUIRE```. -```oxReturnError``` is by far the more helpful of the two. -```oxReturnError``` will return an ```ox::Error``` if it is not 0 and -```oxThrowError``` will throw an ```ox::Error``` if it is not 0. +```OX_RETURN_ERROR``` is by far the more helpful of the two. +```OX_RETURN_ERROR``` will return an ```ox::Error``` if it is not 0 and +```OX_THROW_ERROR``` will throw an ```ox::Error``` if it is not 0. Since ```ox::Error``` is always nodiscard, you must do something with them. In rare cases, you may not have anything you can do with them or you may know @@ -113,13 +113,13 @@ This should be used sparingly. ```cpp void studioCode() { auto [val, err] = foo(1); - oxThrowError(err); + OX_THROW_ERROR(err); doStuff(val); } ox::Error engineCode() noexcept { auto [val, err] = foo(1); - oxReturnError(err); + OX_RETURN_ERROR(err); doStuff(val); return {}; } @@ -136,19 +136,19 @@ Both macros will also take the ```ox::Result``` directly: ```cpp void studioCode() { auto valerr = foo(1); - oxThrowError(valerr); + OX_THROW_ERROR(valerr); doStuff(valerr.value); } ox::Error engineCode() noexcept { auto valerr = foo(1); - oxReturnError(valerr); + OX_RETURN_ERROR(valerr); doStuff(valerr.value); return {}; } ``` -Ox also has the ```oxRequire``` macro, which will initialize a value if there is no error, and return if there is. +Ox also has the ```OX_REQUIRE``` macro, which will initialize a value if there is no error, and return if there is. It aims to somewhat emulate the ```?``` operator in Rust and Swift. Rust ```?``` operator: @@ -163,23 +163,23 @@ fn f2() -> Result { } ``` -```oxRequire```: +```OX_REQUIRE```: ```cpp ox::Result f() noexcept { // do stuff } ox::Result f2() noexcept { - oxRequire(i, f()); // const auto [out, oxConcat(oxRequire_err_, __LINE__)] = x; oxReturnError(oxConcat(oxRequire_err_, __LINE__)) + OX_REQUIRE(i, f()); // const auto [out, OX_CONCAT(oxRequire_err_, __LINE__)] = x; OX_RETURN_ERROR(OX_CONCAT(oxRequire_err_, __LINE__)) return i + 4; } ``` -```oxRequire``` is not quite as versatile, but it should still cleanup a lot of otherwise less ideal code. +```OX_REQUIRE``` is not quite as versatile, but it should still cleanup a lot of otherwise less ideal code. -```oxRequire``` by default creates a const, but there is also an ```oxRequireM``` (oxRequire Mutable) +```OX_REQUIRE``` by default creates a const, but there is also an ```OX_REQUIRE_M``` (OX_REQUIRE Mutable) variant for creating a non-const value. -* ```oxRequireM``` - oxRequire Mutable +* ```OX_REQUIRE_M``` - OX_REQUIRE Mutable ### Logging and Output @@ -268,19 +268,19 @@ constexpr ox::Error model(T *h, ox::CommonPtrWith auto *pal) n h->template setTypeInfo(); // it is also possible to provide the type name and type version as function arguments //h->setTypeInfo("net.drinkingtea.nostalgia.core.NostalgiaPalette", 1); - oxReturnError(h->field("colors", &pal->colors)); + OX_RETURN_ERROR(h->field("colors", &pal->colors)); return {}; } template constexpr ox::Error model(T *h, ox::CommonPtrWith auto *ng) noexcept { h->template setTypeInfo(); - oxReturnError(h->field("bpp", &ng->bpp)); - oxReturnError(h->field("rows", &ng->rows)); - oxReturnError(h->field("columns", &ng->columns)); - oxReturnError(h->field("defaultPalette", &ng->defaultPalette)); - oxReturnError(h->field("pal", &ng->pal)); - oxReturnError(h->field("pixels", &ng->pixels)); + OX_RETURN_ERROR(h->field("bpp", &ng->bpp)); + OX_RETURN_ERROR(h->field("rows", &ng->rows)); + OX_RETURN_ERROR(h->field("columns", &ng->columns)); + OX_RETURN_ERROR(h->field("defaultPalette", &ng->defaultPalette)); + OX_RETURN_ERROR(h->field("pal", &ng->pal)); + OX_RETURN_ERROR(h->field("pixels", &ng->pixels)); return {}; } ``` @@ -315,9 +315,9 @@ class FileAddress { template constexpr Error model(T *h, ox::CommonPtrWith auto *obj) noexcept { h->template setTypeInfo(); - oxReturnError(h->fieldCString("path", &obj->path)); - oxReturnError(h->fieldCString("constPath", &obj->path)); - oxReturnError(h->field("inode", &obj->inode)); + OX_RETURN_ERROR(h->fieldCString("path", &obj->path)); + OX_RETURN_ERROR(h->fieldCString("constPath", &obj->path)); + OX_RETURN_ERROR(h->field("inode", &obj->inode)); return {}; } @@ -327,13 +327,13 @@ constexpr Error model(T *io, ox::CommonPtrWith auto *fa) noexcept { // cannot read from object in Reflect operation if constexpr(ox_strcmp(T::opType(), OpType::Reflect) == 0) { int8_t type = 0; - oxReturnError(io->field("type", &type)); - oxReturnError(io->field("data", UnionView(&fa->m_data, 0))); + OX_RETURN_ERROR(io->field("type", &type)); + OX_RETURN_ERROR(io->field("data", UnionView(&fa->m_data, 0))); } else { auto type = static_cast(fa->m_type); - oxReturnError(io->field("type", &type)); + OX_RETURN_ERROR(io->field("type", &type)); fa->m_type = static_cast(type); - oxReturnError(io->field("data", UnionView(&fa->m_data, static_cast(fa->m_type)))); + OX_RETURN_ERROR(io->field("data", UnionView(&fa->m_data, static_cast(fa->m_type)))); } return {}; } @@ -343,13 +343,13 @@ constexpr Error model(T *io, ox::CommonPtrWith auto *fa) noexcept { There are also macros in `````` for simplifying the declaration of models: ```cpp -oxModelBegin(NostalgiaGraphic) - oxModelField(bpp) - oxModelField(rows) - oxModelField(columns) - oxModelField(defaultPalette) - oxModelField(pal) - oxModelField(pixels) +OX_MODEL_BEGIN(NostalgiaGraphic) + OX_MODEL_FIELD(bpp) + OX_MODEL_FIELD(rows) + OX_MODEL_FIELD(columns) + OX_MODEL_FIELD(defaultPalette) + OX_MODEL_FIELD(pal) + OX_MODEL_FIELD(pixels) oxModelEnd() ``` @@ -392,7 +392,7 @@ ox::Result loadPalette1(ox::BufferView const&buff) noexcept { ox::Result loadPalette2(ox::BufferView const&buff) noexcept { NostalgiaPalette pal; - oxReturnError(ox::readMC(buff, pal)); + OX_RETURN_ERROR(ox::readMC(buff, pal)); return pal; } ``` @@ -405,7 +405,7 @@ ox::Result loadPalette2(ox::BufferView const&buff) noexcept { ox::Result writeSpritePalette1(NostalgiaPalette const&pal) noexcept { ox::Buffer buffer(ox::units::MB); std::size_t sz = 0; - oxReturnError(ox::writeMC(buffer.data(), buffer.size(), pal, &sz)); + OX_RETURN_ERROR(ox::writeMC(buffer.data(), buffer.size(), pal, &sz)); buffer.resize(sz); return buffer; } @@ -428,7 +428,7 @@ ox::Result loadPalette1(ox::BufferView const&buff) noexcept { ox::Result loadPalette2(ox::BufferView const&buff) noexcept { NostalgiaPalette pal; - oxReturnError(ox::readOC(buff, &pal)); + OX_RETURN_ERROR(ox::readOC(buff, &pal)); return pal; } ``` @@ -440,7 +440,7 @@ ox::Result loadPalette2(ox::BufferView const&buff) noexcept { ox::Result writeSpritePalette1(NostalgiaPalette const&pal) noexcept { ox::Buffer buffer(ox::units::MB); - oxReturnError(ox::writeOC(buffer.data(), buffer.size(), pal)); + OX_RETURN_ERROR(ox::writeOC(buffer.data(), buffer.size(), pal)); return buffer; } @@ -462,7 +462,7 @@ ox::Result loadPalette1(ox::BufferView const&buff) noexcept { ox::Result loadPalette2(ox::BufferView const&buff) noexcept { NostalgiaPalette pal; - oxReturnError(ox::readClaw(buff, pal)); + OX_RETURN_ERROR(ox::readClaw(buff, pal)); return pal; } ``` diff --git a/deps/ox/src/ox/clargs/clargs.cpp b/deps/ox/src/ox/clargs/clargs.cpp index 941d25f..475ab2f 100644 --- a/deps/ox/src/ox/clargs/clargs.cpp +++ b/deps/ox/src/ox/clargs/clargs.cpp @@ -55,17 +55,17 @@ int ClArgs::getInt(ox::StringViewCR arg, int defaultValue) const noexcept { } Result ClArgs::getBool(ox::StringViewCR arg) const noexcept { - oxRequire(out, m_bools.at(arg)); + OX_REQUIRE(out, m_bools.at(arg)); return *out; } Result ClArgs::getString(ox::StringViewCR argName) const noexcept { - oxRequire(out, m_strings.at(argName)); + OX_REQUIRE(out, m_strings.at(argName)); return *out; } Result ClArgs::getInt(ox::StringViewCR arg) const noexcept { - oxRequire(out, m_ints.at(arg)); + OX_REQUIRE(out, m_ints.at(arg)); return *out; } diff --git a/deps/ox/src/ox/claw/read.cpp b/deps/ox/src/ox/claw/read.cpp index eb489be..1b0ef86 100644 --- a/deps/ox/src/ox/claw/read.cpp +++ b/deps/ox/src/ox/claw/read.cpp @@ -18,7 +18,7 @@ ox::Result readClawTypeId(ox::BufferView buff) noexcept { size_t outSz{}; const auto s1End = ox::strchr(buffRaw, ';', buffLen); if (!s1End) { - return OxError(1, "Could not read Claw header"); + return ox::Error(1, "Could not read Claw header"); } auto const fmtSz = static_cast(s1End - buffRaw) + 1; buffRaw += fmtSz; @@ -26,7 +26,7 @@ ox::Result readClawTypeId(ox::BufferView buff) noexcept { outSz += fmtSz; auto const s2End = ox::strchr(buffRaw, ';', buffLen); if (!s2End) { - return OxError(2, "Could not read Claw header"); + return ox::Error(2, "Could not read Claw header"); } auto const s2Size = static_cast(s2End - buffRaw) + 1; buffRaw += s2Size; @@ -34,7 +34,7 @@ ox::Result readClawTypeId(ox::BufferView buff) noexcept { outSz += s2Size; auto const s3End = ox::strchr(buffRaw, ';', buffLen) + 1; if (!s3End) { - return OxError(3, "Could not read Claw header"); + return ox::Error(3, "Could not read Claw header"); } auto const s3Size = static_cast(s3End - buffRaw); buffRaw += s3Size; @@ -48,7 +48,7 @@ Result readClawHeader(ox::BufferView buff) noexcept { auto buffLen = buff.size(); const auto s1End = ox::strchr(buffRaw, ';', buffLen); if (!s1End) { - return OxError(1, "Could not read Claw header"); + return ox::Error(1, "Could not read Claw header"); } auto const s1Size = static_cast(s1End - buffRaw); StringView const fmt(buffRaw, s1Size); @@ -57,7 +57,7 @@ Result readClawHeader(ox::BufferView buff) noexcept { auto const s2End = ox::strchr(buffRaw, ';', buffLen); if (!s2End) { - return OxError(2, "Could not read Claw header"); + return ox::Error(2, "Could not read Claw header"); } auto const s2Size = static_cast(s2End - buffRaw); StringView const typeName(buffRaw, s2Size); @@ -66,7 +66,7 @@ Result readClawHeader(ox::BufferView buff) noexcept { auto const s3End = ox::strchr(buffRaw, ';', buffLen); if (!s3End) { - return OxError(3, "Could not read Claw header"); + return ox::Error(3, "Could not read Claw header"); } auto const s3Size = static_cast(s3End - buffRaw); StringView const versionStr(buffRaw, s3Size); @@ -78,7 +78,7 @@ Result readClawHeader(ox::BufferView buff) noexcept { } else if (fmt == "O1") { hdr.fmt = ClawFormat::Organic; } else { - return OxError(4, "Claw format does not match any supported format/version combo"); + return ox::Error(4, "Claw format does not match any supported format/version combo"); } hdr.typeName = typeName; std::ignore = ox::atoi(versionStr).copyTo(hdr.typeVersion); @@ -88,26 +88,26 @@ Result readClawHeader(ox::BufferView buff) noexcept { } Result stripClawHeader(ox::BufferView buff) noexcept { - oxRequire(header, readClawHeader(buff)); + OX_REQUIRE(header, readClawHeader(buff)); return {{header.data, header.dataSize}}; } Result readClaw(TypeStore &ts, BufferView buff) noexcept { - oxRequire(header, readClawHeader(buff)); + OX_REQUIRE(header, readClawHeader(buff)); auto const [t, tdErr] = ts.getLoad( header.typeName, header.typeVersion, header.typeParams); if (tdErr) { - return OxError(3, "Could not load type descriptor"); + return ox::Error(3, "Could not load type descriptor"); } ModelObject obj; - oxReturnError(obj.setType(t)); + OX_RETURN_ERROR(obj.setType(t)); switch (header.fmt) { case ClawFormat::Metal: { ox::BufferReader br({header.data, header.dataSize}); MetalClawReader reader(br); ModelHandlerInterface handler(&reader); - oxReturnError(model(&handler, &obj)); + OX_RETURN_ERROR(model(&handler, &obj)); return obj; } case ClawFormat::Organic: @@ -115,16 +115,16 @@ Result readClaw(TypeStore &ts, BufferView buff) noexcept { #ifdef OX_USE_STDLIB OrganicClawReader reader({header.data, header.dataSize}); ModelHandlerInterface handler(&reader); - oxReturnError(model(&handler, &obj)); + OX_RETURN_ERROR(model(&handler, &obj)); return obj; #else break; #endif } case ClawFormat::None: - return OxError(1); + return ox::Error(1); } - return OxError(1); + return ox::Error(1); } } diff --git a/deps/ox/src/ox/claw/read.hpp b/deps/ox/src/ox/claw/read.hpp index c625ee2..bbffa43 100644 --- a/deps/ox/src/ox/claw/read.hpp +++ b/deps/ox/src/ox/claw/read.hpp @@ -40,12 +40,12 @@ Result stripClawHeader(ox::BufferView buff) noexcept; template Error readClaw(ox::BufferView buff, T &val) { - oxRequire(header, readClawHeader(buff)); + OX_REQUIRE(header, readClawHeader(buff)); if (header.typeName != getModelTypeName()) { - return OxError(Error_ClawTypeMismatch, "Claw Read: Type mismatch"); + return ox::Error(Error_ClawTypeMismatch, "Claw Read: Type mismatch"); } if (header.typeVersion != getModelTypeVersion()) { - return OxError(Error_ClawTypeVersionMismatch, "Claw Read: Type Version mismatch"); + return ox::Error(Error_ClawTypeVersionMismatch, "Claw Read: Type Version mismatch"); } switch (header.fmt) { case ClawFormat::Metal: @@ -65,15 +65,15 @@ Error readClaw(ox::BufferView buff, T &val) { #endif } case ClawFormat::None: - return OxError(1); + return ox::Error(1); } - return OxError(1); + return ox::Error(1); } template Result readClaw(ox::BufferView buff) { Result val; - oxReturnError(readClaw(buff, val.value)); + OX_RETURN_ERROR(readClaw(buff, val.value)); return val; } diff --git a/deps/ox/src/ox/claw/test/tests.cpp b/deps/ox/src/ox/claw/test/tests.cpp index 90c1bff..dfbacb4 100644 --- a/deps/ox/src/ox/claw/test/tests.cpp +++ b/deps/ox/src/ox/claw/test/tests.cpp @@ -62,45 +62,45 @@ struct TestStruct { template constexpr ox::Error model(T *io, ox::CommonPtrWith auto *obj) { - oxReturnError(io->template setTypeInfo()); - oxReturnError(io->field("Bool", &obj->Bool)); - oxReturnError(io->field("Int", &obj->Int)); - oxReturnError(io->fieldCString("String", &obj->String)); - return OxError(0); + OX_RETURN_ERROR(io->template setTypeInfo()); + OX_RETURN_ERROR(io->field("Bool", &obj->Bool)); + OX_RETURN_ERROR(io->field("Int", &obj->Int)); + OX_RETURN_ERROR(io->fieldCString("String", &obj->String)); + return ox::Error(0); } template constexpr ox::Error model(T *io, ox::CommonPtrWith auto *obj) { - oxReturnError(io->template setTypeInfo()); - oxReturnError(io->field("Bool", &obj->Bool)); - oxReturnError(io->field("Int", &obj->Int)); - oxReturnError(io->field("String", &obj->String)); - return OxError(0); + OX_RETURN_ERROR(io->template setTypeInfo()); + OX_RETURN_ERROR(io->field("Bool", &obj->Bool)); + OX_RETURN_ERROR(io->field("Int", &obj->Int)); + OX_RETURN_ERROR(io->field("String", &obj->String)); + return ox::Error(0); } template constexpr ox::Error model(T *io, ox::CommonPtrWith auto *obj) { - oxReturnError(io->template setTypeInfo()); - oxReturnError(io->field("Bool", &obj->Bool)); - oxReturnError(io->field("Int", &obj->Int)); - oxReturnError(io->field("Int1", &obj->Int1)); - oxReturnError(io->field("Int2", &obj->Int2)); - oxReturnError(io->field("Int3", &obj->Int3)); - oxReturnError(io->field("Int4", &obj->Int4)); - oxReturnError(io->field("Int5", &obj->Int5)); - oxReturnError(io->field("Int6", &obj->Int6)); - oxReturnError(io->field("Int7", &obj->Int7)); - oxReturnError(io->field("Int8", &obj->Int8)); + OX_RETURN_ERROR(io->template setTypeInfo()); + OX_RETURN_ERROR(io->field("Bool", &obj->Bool)); + OX_RETURN_ERROR(io->field("Int", &obj->Int)); + OX_RETURN_ERROR(io->field("Int1", &obj->Int1)); + OX_RETURN_ERROR(io->field("Int2", &obj->Int2)); + OX_RETURN_ERROR(io->field("Int3", &obj->Int3)); + OX_RETURN_ERROR(io->field("Int4", &obj->Int4)); + OX_RETURN_ERROR(io->field("Int5", &obj->Int5)); + OX_RETURN_ERROR(io->field("Int6", &obj->Int6)); + OX_RETURN_ERROR(io->field("Int7", &obj->Int7)); + OX_RETURN_ERROR(io->field("Int8", &obj->Int8)); int unionIdx = 0; if constexpr(T::opType() != ox::OpType::Reflect) { unionIdx = obj->unionIdx; } - oxReturnError(io->field("Union", ox::UnionView{&obj->Union, unionIdx})); - oxReturnError(io->field("String", &obj->String)); - oxReturnError(io->field("List", obj->List, 4)); - oxReturnError(io->field("EmptyStruct", &obj->EmptyStruct)); - oxReturnError(io->field("Struct", &obj->Struct)); - return OxError(0); + OX_RETURN_ERROR(io->field("Union", ox::UnionView{&obj->Union, unionIdx})); + OX_RETURN_ERROR(io->field("String", &obj->String)); + OX_RETURN_ERROR(io->field("List", obj->List, 4)); + OX_RETURN_ERROR(io->field("EmptyStruct", &obj->EmptyStruct)); + OX_RETURN_ERROR(io->field("Struct", &obj->Struct)); + return ox::Error(0); } static std::map tests = { @@ -114,7 +114,7 @@ static std::map tests = { oxAssert(ch.fmt == ox::ClawFormat::Organic, "Format wrong"); oxAssert(ch.typeName == "com.drinkingtea.ox.claw.test.Header", "Type name wrong"); oxAssert(ch.typeVersion == 2, "Type version wrong"); - return OxError(0); + return ox::Error(0); } }, { @@ -126,7 +126,7 @@ static std::map tests = { oxAssert(ch.fmt == ox::ClawFormat::Metal, "Format wrong"); oxAssert(ch.typeName == "com.drinkingtea.ox.claw.test.Header2", "Type name wrong"); oxAssert(ch.typeVersion == 3, "Type version wrong"); - return OxError(0); + return ox::Error(0); } }, { @@ -134,7 +134,7 @@ static std::map tests = { [] { constexpr auto hdr = ox::StringLiteral("M2;com.drinkingtea.ox.claw.test.Header2;3;awefawf"); constexpr auto expected = ox::StringLiteral("com.drinkingtea.ox.claw.test.Header2;3"); - oxRequire(actual, ox::readClawTypeId({hdr.data(), hdr.len() + 1})); + OX_REQUIRE(actual, ox::readClawTypeId({hdr.data(), hdr.len() + 1})); oxExpect(actual, expected); return ox::Error{}; } @@ -145,8 +145,8 @@ static std::map tests = { // This test doesn't confirm much, but it does show that the writer // doesn't segfault TestStruct ts; - oxReturnError(ox::writeClaw(ts, ox::ClawFormat::Metal)); - return OxError(0); + OX_RETURN_ERROR(ox::writeClaw(ts, ox::ClawFormat::Metal)); + return ox::Error(0); } }, { @@ -191,7 +191,7 @@ static std::map tests = { oxAssert(testIn.Struct.String == testOut.Struct.String, "Struct.String value mismatch"); oxAssert(testIn.Struct.Bool == testOut.Struct.Bool, "Struct.Bool value mismatch"); - return OxError(0); + return ox::Error(0); } }, } diff --git a/deps/ox/src/ox/claw/write.hpp b/deps/ox/src/ox/claw/write.hpp index ba0890e..0d7183a 100644 --- a/deps/ox/src/ox/claw/write.hpp +++ b/deps/ox/src/ox/claw/write.hpp @@ -39,7 +39,7 @@ struct TypeInfoCatcher { } constexpr Error field(...) noexcept { - return OxError(0); + return ox::Error(0); } static constexpr auto opType() { @@ -76,21 +76,21 @@ template ox::Error writeClawHeader(Writer_c auto &writer, const T *t, ClawFormat fmt) noexcept { switch (fmt) { case ClawFormat::Metal: - oxReturnError(write(writer, "M2;")); + OX_RETURN_ERROR(write(writer, "M2;")); break; case ClawFormat::Organic: - oxReturnError(write(writer, "O1;")); + OX_RETURN_ERROR(write(writer, "O1;")); break; default: - return OxError(1); + return ox::Error(1); } - oxReturnError(write(writer, detail::getTypeName(t))); - oxReturnError(writer.put(';')); + OX_RETURN_ERROR(write(writer, detail::getTypeName(t))); + OX_RETURN_ERROR(writer.put(';')); const auto tn = detail::getTypeVersion(t); if (tn > -1) { - oxReturnError(ox::writeItoa(tn, writer)); + OX_RETURN_ERROR(ox::writeItoa(tn, writer)); } - oxReturnError(writer.put(';')); + OX_RETURN_ERROR(writer.put(';')); return {}; } @@ -102,19 +102,19 @@ Result writeClaw( std::size_t buffReserveSz = 2 * units::KB) noexcept { Buffer out(buffReserveSz); BufferWriter bw(&out, 0); - oxReturnError(detail::writeClawHeader(bw, &t, fmt)); + OX_RETURN_ERROR(detail::writeClawHeader(bw, &t, fmt)); #ifdef OX_USE_STDLIB if (fmt == ClawFormat::Metal) { - oxReturnError(writeMC(bw, t)); + OX_RETURN_ERROR(writeMC(bw, t)); } else if (fmt == ClawFormat::Organic) { - oxRequire(data, writeOC(t)); - oxReturnError(bw.write(data.data(), data.size())); + OX_REQUIRE(data, writeOC(t)); + OX_RETURN_ERROR(bw.write(data.data(), data.size())); } #else if (fmt != ClawFormat::Metal) { - return OxError(1, "OC is not supported in this build"); + return ox::Error(1, "OC is not supported in this build"); } - oxReturnError(writeMC(bw, t)); + OX_RETURN_ERROR(writeMC(bw, t)); #endif out.resize(bw.tellp()); return out; diff --git a/deps/ox/src/ox/event/signal.hpp b/deps/ox/src/ox/event/signal.hpp index fe1c2ab..51e18de 100644 --- a/deps/ox/src/ox/event/signal.hpp +++ b/deps/ox/src/ox/event/signal.hpp @@ -57,7 +57,7 @@ class Signal { void call(Args... args) final { if constexpr(detail::isError::value) { - oxThrowError(f(args...)); + OX_THROW_ERROR(f(args...)); } else { f(args...); } @@ -76,7 +76,7 @@ class Signal { void call(Args... args) final { if constexpr(detail::isError*(m_methodPtr))(args...))>::value) { - oxThrowError((m_receiver->*(m_methodPtr))(args...)); + OX_THROW_ERROR((m_receiver->*(m_methodPtr))(args...)); } else { f(args...); } @@ -107,7 +107,7 @@ class Signal { void call(Args... args) final { if constexpr(detail::isError*(m_methodPtr))(args...))>::value) { - oxThrowError((m_receiver->*(m_methodPtr))(args...)); + OX_THROW_ERROR((m_receiver->*(m_methodPtr))(args...)); } else { (m_receiver->*(m_methodPtr))(args...); } @@ -193,11 +193,11 @@ Error Signal::disconnectObject(const void *receiver) const noexcept { for (auto i = 0u; i < m_slots.size(); ++i) { const auto &slot = m_slots[i]; if (slot->receiver() == receiver) { - oxReturnError(m_slots.erase(i)); + OX_RETURN_ERROR(m_slots.erase(i)); --i; } } - return OxError(1, "Signal::disconnectObject: Receiver was not found among this Signal's slots"); + return ox::Error(1, "Signal::disconnectObject: Receiver was not found among this Signal's slots"); } template @@ -213,7 +213,7 @@ Error Signal::emitCheckError(Args... args) const noexcept { for (auto &f : m_slots) { f->call(args...); } - return OxError(0); + return ox::Error(0); } catch (const ox::Exception &ex) { return ox::Error(ex.file, ex.line, ex.errCode, ex.msg); } @@ -381,11 +381,11 @@ Error Signal::disconnectObject(const void *receiver) const noexc for (auto i = 0u; i < m_slots.size(); ++i) { const auto &slot = m_slots[i]; if (slot->receiver() == receiver) { - oxReturnError(m_slots.erase(i)); + OX_RETURN_ERROR(m_slots.erase(i)); --i; } } - return OxError(1, "Signal::disconnectObject: Receiver was not found among this Signal's slots"); + return ox::Error(1, "Signal::disconnectObject: Receiver was not found among this Signal's slots"); } template @@ -398,9 +398,9 @@ void Signal::emit(Args... args) const noexcept { template Error Signal::emitCheckError(Args... args) const noexcept { for (auto &f : m_slots) { - oxReturnError(f->call(ox::forward(args)...)); + OX_RETURN_ERROR(f->call(ox::forward(args)...)); } - return OxError(0); + return ox::Error(0); } } diff --git a/deps/ox/src/ox/event/test/tests.cpp b/deps/ox/src/ox/event/test/tests.cpp index 1004587..e421c5e 100644 --- a/deps/ox/src/ox/event/test/tests.cpp +++ b/deps/ox/src/ox/event/test/tests.cpp @@ -17,7 +17,7 @@ struct TestStruct: public ox::SignalHandler { int value = 0; ox::Error method(int i) noexcept { value = i; - return OxError(0); + return ox::Error(0); } }; @@ -27,13 +27,13 @@ std::map> tests = { [] { ox::Signal signal; signal.connect([](int i) -> ox::Error { - return OxError(i != 5); + return ox::Error(i != 5); }); TestStruct ts; signal.connect(&ts, &TestStruct::method); - oxReturnError(signal.emitCheckError(5)); - oxReturnError(OxError(ts.value != 5)); - return OxError(0); + OX_RETURN_ERROR(signal.emitCheckError(5)); + OX_RETURN_ERROR(ox::Error(ts.value != 5)); + return ox::Error(0); } }, }; diff --git a/deps/ox/src/ox/fs/filestore/filestoretemplate.hpp b/deps/ox/src/ox/fs/filestore/filestoretemplate.hpp index 12367e4..a11da15 100644 --- a/deps/ox/src/ox/fs/filestore/filestoretemplate.hpp +++ b/deps/ox/src/ox/fs/filestore/filestoretemplate.hpp @@ -207,12 +207,12 @@ Error FileStoreTemplate::format(void *buffer, std::size_t bufferSize) { auto fsData = nb->malloc(sizeof(FileStoreData)).value; if (!fsData.valid()) { oxTrace("ox.fs.FileStoreTemplate.format.fail", "Could not read data section of FileStoreData"); - return OxError(1, "Could not read data section of FileStoreData"); + return ox::Error(1, "Could not read data section of FileStoreData"); } auto data = nb->template dataOf(fsData); if (!data.valid()) { oxTrace("ox.fs.FileStoreTemplate.format.fail", "Could not read data section of FileStoreData"); - return OxError(1, "Could not read data section of FileStoreData"); + return ox::Error(1, "Could not read data section of FileStoreData"); } new (data) FileStoreData; return {}; @@ -223,24 +223,24 @@ Error FileStoreTemplate::setSize(std::size_t size) { if (m_buffSize >= size) { return m_buffer->setSize(static_cast(size)); } - return OxError(1); + return ox::Error(1); } template Error FileStoreTemplate::incLinks(uint64_t id) { - oxRequireM(item, find(static_cast(id)).validate()); + OX_REQUIRE_M(item, find(static_cast(id)).validate()); ++item->links; - return OxError(0); + return ox::Error(0); } template Error FileStoreTemplate::decLinks(uint64_t id) { - oxRequireM(item, find(static_cast(id)).validate()); + OX_REQUIRE_M(item, find(static_cast(id)).validate()); --item->links; if (item->links == 0) { - oxReturnError(remove(item)); + OX_RETURN_ERROR(remove(item)); } - return OxError(0); + return ox::Error(0); } template @@ -249,7 +249,7 @@ Error FileStoreTemplate::write(uint64_t id64, const void *data, FsSize_t oxTracef("ox.fs.FileStoreTemplate.write", "Attempting to write to inode {}", id); auto existing = find(id); if (!canWrite(existing, dataSize)) { - oxReturnError(compact()); + OX_RETURN_ERROR(compact()); existing = find(id); } @@ -269,7 +269,7 @@ Error FileStoreTemplate::write(uint64_t id64, const void *data, FsSize_t // if first malloc failed, compact and try again if (!dest.valid()) { oxTrace("ox.fs.FileStoreTemplate.write", "Allocation failed, compacting"); - oxReturnError(compact()); + OX_RETURN_ERROR(compact()); dest = m_buffer->malloc(dataSize).value; } if (dest.valid()) { @@ -298,16 +298,16 @@ Error FileStoreTemplate::write(uint64_t id64, const void *data, FsSize_t dest->id.get(), dest.offset(), destData.size()); fsData->rootNode = dest.offset(); oxTracef("ox.fs.FileStoreTemplate.write", "Root inode: {}", dest->id.get()); - return OxError(0); + return ox::Error(0); } } else { oxTrace("ox.fs.FileStoreTemplate.write.fail", "Could not place item due to absence of FileStore header."); } } } - oxReturnError(m_buffer->free(dest)); + OX_RETURN_ERROR(m_buffer->free(dest)); } - return OxError(1); + return ox::Error(1); } template @@ -322,7 +322,7 @@ Error FileStoreTemplate::read(uint64_t id, void *out, FsSize_t outSize, // error check if (!src.valid()) { oxTracef("ox.fs.FileStoreTemplate.read.fail", "Could not find requested item: {}", id); - return OxError(1, "Could not find requested item"); + return ox::Error(1, "Could not find requested item"); } auto srcData = m_buffer->template dataOf(src); @@ -335,7 +335,7 @@ Error FileStoreTemplate::read(uint64_t id, void *out, FsSize_t outSize, oxTracef("ox.fs.FileStoreTemplate.read.fail", "Could not read data section of item: {}", id); oxTracef("ox.fs.FileStoreTemplate.read.fail", "Item data section size: {}, Expected size: {}", srcData.size(), outSize); - return OxError(1, "Invalid inode"); + return ox::Error(1, "Invalid inode"); } ox::memcpy(out, srcData, srcData.size()); @@ -353,7 +353,7 @@ Error FileStoreTemplate::read(uint64_t id, FsSize_t readStart, FsSize_t // error check if (!src.valid()) { oxTracef("ox.fs.FileStoreTemplate.read.fail", "Could not find requested item: {}", id); - return OxError(1); + return ox::Error(1); } auto srcData = m_buffer->template dataOf(src); @@ -366,7 +366,7 @@ Error FileStoreTemplate::read(uint64_t id, FsSize_t readStart, FsSize_t oxTracef("ox.fs.FileStoreTemplate.read.fail", "Could not read data section of item: {}", id); oxTracef("ox.fs.FileStoreTemplate.read.fail", "Item data section size: {}, Expected size: {}", srcData.size(), readSize); - return OxError(1); + return ox::Error(1); } ox::memcpy(out, srcData.get() + readStart, readSize); @@ -386,7 +386,7 @@ Error FileStoreTemplate::read(uint64_t id, FsSize_t readStart, // error check if (!src.valid()) { oxTracef("ox.fs.FileStoreTemplate.read.fail", "Could not find requested item: {}", id); - return OxError(1); + return ox::Error(1); } auto srcData = m_buffer->template dataOf(src); @@ -399,7 +399,7 @@ Error FileStoreTemplate::read(uint64_t id, FsSize_t readStart, oxTracef("ox.fs.FileStoreTemplate.read.fail", "Could not read data section of item: {}", id); oxTracef("ox.fs.FileStoreTemplate.read.fail", "Item data section size: {}, Expected size: {}", srcData.size(), readSize); - return OxError(1); + return ox::Error(1); } ox::memcpy(out, srcData.get() + readStart, readSize); @@ -422,30 +422,30 @@ ptrarith::Ptr FileStoreTemplate::read(uint64_t id) template Error FileStoreTemplate::resize() { - oxReturnError(compact()); + OX_RETURN_ERROR(compact()); const auto newSize = static_cast(size() - available()); oxTracef("ox.fs.FileStoreTemplate.resize", "resize to: {}", newSize); - oxReturnError(m_buffer->setSize(newSize)); + OX_RETURN_ERROR(m_buffer->setSize(newSize)); oxTracef("ox.fs.FileStoreTemplate.resize", "resized to: {}", m_buffer->size()); - return OxError(0); + return ox::Error(0); } template Error FileStoreTemplate::resize(std::size_t size, void *newBuff) { if (m_buffer->size() > size) { - return OxError(1); + return ox::Error(1); } m_buffSize = static_cast(size); if (newBuff) { m_buffer = reinterpret_cast(newBuff); - oxReturnError(m_buffer->setSize(static_cast(size))); + OX_RETURN_ERROR(m_buffer->setSize(static_cast(size))); } - return OxError(0); + return ox::Error(0); } template Result FileStoreTemplate::stat(uint64_t id) const { - oxRequire(inode, find(static_cast(id)).validate()); + OX_REQUIRE(inode, find(static_cast(id)).validate()); return StatInfo { id, inode->links, @@ -477,16 +477,16 @@ char *FileStoreTemplate::buff() { template Error FileStoreTemplate::walk(Error(*cb)(uint8_t, uint64_t, uint64_t)) { for (auto i = m_buffer->iterator(); i.valid(); i.next()) { - oxReturnError(cb(i->fileType, i.ptr().offset(), i.ptr().end())); + OX_RETURN_ERROR(cb(i->fileType, i.ptr().offset(), i.ptr().end())); } - return OxError(0); + return ox::Error(0); } template Result::InodeId_t> FileStoreTemplate::generateInodeId() { auto fsData = fileStoreData(); if (!fsData) { - return OxError(1); + return ox::Error(1); } for (auto i = 0; i < 100; i++) { auto inode = static_cast::InodeId_t>(fsData->random.gen() % MaxValue); @@ -494,7 +494,7 @@ Result::InodeId_t> FileStoreTemplate: return inode; } } - return OxError(2); + return ox::Error(2); } template @@ -503,10 +503,10 @@ Error FileStoreTemplate::compact() { return m_buffer->compact([this, &isFirstItem](uint64_t oldAddr, ItemPtr item) -> Error { if (isFirstItem) { isFirstItem = false; - return OxError(0); + return ox::Error(0); } if (!item.valid()) { - return OxError(1); + return ox::Error(1); } oxTracef("ox.fs.FileStoreTemplate.compact.moveItem", "Moving Item: {} from {} to {}", item->id.get(), oldAddr, item.offset()); // update rootInode if this is it @@ -524,7 +524,7 @@ Error FileStoreTemplate::compact() { parent->right = item; } } - return OxError(0); + return ox::Error(0); }); } @@ -544,15 +544,15 @@ template Error FileStoreTemplate::placeItem(ItemPtr item) { auto fsData = fileStoreData(); if (!fsData) { - return OxError(1); + return ox::Error(1); } - oxRequireM(root, m_buffer->ptr(fsData->rootNode).validate()); + OX_REQUIRE_M(root, m_buffer->ptr(fsData->rootNode).validate()); if (root->id == item->id) { fsData->rootNode = item; item->left = root->left; item->right = root->right; oxTracef("ox.fs.FileStoreTemplate.placeItem", "Overwrote Root Item: {}", item->id.get()); - return OxError(0); + return ox::Error(0); } else { return placeItem(root, item); } @@ -562,7 +562,7 @@ template Error FileStoreTemplate::placeItem(ItemPtr root, ItemPtr item, int depth) { if (depth > 5000) { oxTrace("ox.fs.FileStoreTemplate.placeItem.fail", "Excessive recursion depth, stopping before stack overflow."); - return OxError(2); + return ox::Error(2); } if (item->id > root->id) { auto right = m_buffer->ptr(root->right); @@ -573,7 +573,7 @@ Error FileStoreTemplate::placeItem(ItemPtr root, ItemPtr item, int depth item->right = right->right; } oxTracef("ox.fs.FileStoreTemplate.placeItem", "Placed Item: {}", item->id.get()); - return OxError(0); + return ox::Error(0); } else { return placeItem(right, item, depth + 1); } @@ -586,13 +586,13 @@ Error FileStoreTemplate::placeItem(ItemPtr root, ItemPtr item, int depth item->right = left->right; } oxTracef("ox.fs.FileStoreTemplate.placeItem", "Placed Item: {}", item->id.get()); - return OxError(0); + return ox::Error(0); } else { return placeItem(left, item, depth + 1); } } else { oxTrace("ox.fs.FileStoreTemplate.placeItem.fail", "Cannot insert an item on itself."); - return OxError(1, "Cannot insert an item on itself."); + return ox::Error(1, "Cannot insert an item on itself."); } } @@ -600,9 +600,9 @@ template Error FileStoreTemplate::unplaceItem(ItemPtr item) { auto fsData = fileStoreData(); if (!fsData) { - return OxError(1); + return ox::Error(1); } - oxRequireM(root, m_buffer->ptr(fsData->rootNode).validate()); + OX_REQUIRE_M(root, m_buffer->ptr(fsData->rootNode).validate()); if (root->id == item->id) { item->left = root->left; item->right = root->right; @@ -624,7 +624,7 @@ Error FileStoreTemplate::unplaceItem(ItemPtr item) { } else { fsData->rootNode = 0; } - return OxError(0); + return ox::Error(0); } else { return unplaceItem(root, item); } @@ -634,7 +634,7 @@ template Error FileStoreTemplate::unplaceItem(ItemPtr root, ItemPtr item, int depth) { if (depth >= 5000) { oxTrace("ox.fs.FileStoreTemplate.unplaceItem.fail", "Excessive recursion depth, stopping before stack overflow."); - return OxError(1, "Excessive recursion depth, stopping before stack overflow."); + return ox::Error(1, "Excessive recursion depth, stopping before stack overflow."); } if (item->id > root->id) { auto right = m_buffer->ptr(root->right); @@ -653,25 +653,25 @@ Error FileStoreTemplate::unplaceItem(ItemPtr root, ItemPtr item, int dep return unplaceItem(left, item, depth + 1); } } else { - return OxError(1); + return ox::Error(1); } if (item->right) { - oxReturnError(placeItem(m_buffer->ptr(item->right))); + OX_RETURN_ERROR(placeItem(m_buffer->ptr(item->right))); } if (item->left) { - oxReturnError(placeItem(m_buffer->ptr(item->left))); + OX_RETURN_ERROR(placeItem(m_buffer->ptr(item->left))); } - return OxError(0); + return ox::Error(0); } template Error FileStoreTemplate::remove(ItemPtr item) { if (item.valid()) { - oxReturnError(unplaceItem(item)); - oxReturnError(m_buffer->free(item)); - return OxError(0); + OX_RETURN_ERROR(unplaceItem(item)); + OX_RETURN_ERROR(m_buffer->free(item)); + return ox::Error(0); } - return OxError(1); + return ox::Error(1); } template diff --git a/deps/ox/src/ox/fs/filesystem/directory.hpp b/deps/ox/src/ox/fs/filesystem/directory.hpp index 2dde560..616116a 100644 --- a/deps/ox/src/ox/fs/filesystem/directory.hpp +++ b/deps/ox/src/ox/fs/filesystem/directory.hpp @@ -55,7 +55,7 @@ struct OX_PACKED DirectoryEntry { ox::strncpy(d->name, name.data(), ox::min(maxStrSz, name.len())); return {}; } - return OxError(1); + return ox::Error(1); } ptrarith::Ptr data() noexcept { @@ -141,11 +141,11 @@ template Error Directory::init() noexcept { constexpr auto Size = sizeof(Buffer); oxTracef("ox.fs.Directory.init", "Initializing Directory with Inode ID: {}", m_inodeId); - oxReturnError(m_fs.write(m_inodeId, nullptr, Size, static_cast(FileType::Directory))); + OX_RETURN_ERROR(m_fs.write(m_inodeId, nullptr, Size, static_cast(FileType::Directory))); auto buff = m_fs.read(m_inodeId).template to(); if (!buff.valid()) { m_size = 0; - return OxError(1); + return ox::Error(1); } new (buff) Buffer(Size); m_size = Size; @@ -158,21 +158,21 @@ Error Directory::mkdir(PathIterator path, bool parents) { oxTrace("ox.fs.Directory.mkdir", path.fullPath()); // determine if already exists ox::StringView name; - oxReturnError(path.get(name)); + OX_RETURN_ERROR(path.get(name)); auto childInode = find(PathIterator(name)); if (!childInode.ok()) { // if this is not the last item in the path and parents is disabled, // return an error if (!parents && path.hasNext()) { - return OxError(1); + return ox::Error(1); } childInode = m_fs.generateInodeId(); oxTracef("ox.fs.Directory.mkdir", "Generated Inode ID: {}", childInode.value); oxLogError(childInode.error); - oxReturnError(childInode.error); + OX_RETURN_ERROR(childInode.error); // initialize the directory Directory child(m_fs, childInode.value); - oxReturnError(child.init()); + OX_RETURN_ERROR(child.init()); auto err = write(PathIterator(name), childInode.value); if (err) { oxLogError(err); @@ -183,7 +183,7 @@ Error Directory::mkdir(PathIterator path, bool parents) { } Directory child(m_fs, childInode.value); if (path.hasNext()) { - oxReturnError(child.mkdir(path.next(), parents)); + OX_RETURN_ERROR(child.mkdir(path.next(), parents)); } } return {}; @@ -196,28 +196,28 @@ Error Directory::write(PathIterator path, uint64_t inode64 if (path.next().hasNext()) { // not yet at target directory, recurse to next one oxTracef("ox.fs.Directory.write", "Attempting to write to next sub-Directory: {} of {}", name, path.fullPath()); - oxReturnError(path.get(name)); - oxRequire(nextChild, findEntry(name)); + OX_RETURN_ERROR(path.get(name)); + OX_REQUIRE(nextChild, findEntry(name)); oxTracef("ox.fs.Directory.write", "{}: {}", name, nextChild); if (nextChild) { return Directory(m_fs, nextChild).write(path.next(), inode); } else { oxTracef("ox.fs.Directory.write", "{} not found and not allowed to create it.", name); - return OxError(1, "File not found and not allowed to create it."); + return ox::Error(1, "File not found and not allowed to create it."); } } else { oxTrace("ox.fs.Directory.write", path.fullPath()); - oxReturnError(path.next(name)); + OX_RETURN_ERROR(path.next(name)); // insert the new entry on this directory // get the name // find existing version of directory oxTracef("ox.fs.Directory.write", "Searching for directory inode {}", m_inodeId); - oxRequire(oldStat, m_fs.stat(m_inodeId)); + OX_REQUIRE(oldStat, m_fs.stat(m_inodeId)); oxTracef("ox.fs.Directory.write", "Found existing directory of size {}", oldStat.size); auto old = m_fs.read(m_inodeId).template to(); if (!old.valid()) { oxTrace("ox.fs.Directory.write.fail", "Could not read existing version of Directory"); - return OxError(1, "Could not read existing version of Directory"); + return ox::Error(1, "Could not read existing version of Directory"); } const auto pathSize = name.len() + 1; const auto entryDataSize = DirectoryEntry::DirectoryEntryData::spaceNeeded(pathSize); @@ -225,16 +225,16 @@ Error Directory::write(PathIterator path, uint64_t inode64 auto cpy = ox_malloca(newSize, Buffer, *old, oldStat.size); if (cpy == nullptr) { oxTrace("ox.fs.Directory.write.fail", "Could not allocate memory for copy of Directory"); - return OxError(1, "Could not allocate memory for copy of Directory"); + return ox::Error(1, "Could not allocate memory for copy of Directory"); } - oxReturnError(cpy->setSize(newSize)); + OX_RETURN_ERROR(cpy->setSize(newSize)); auto val = cpy->malloc(entryDataSize).value; if (!val.valid()) { oxTrace("ox.fs.Directory.write.fail", "Could not allocate memory for new directory entry"); - return OxError(1, "Could not allocate memory for new directory entry"); + return ox::Error(1, "Could not allocate memory for new directory entry"); } oxTracef("ox.fs.Directory.write", "Attempting to write Directory entry: {}", name); - oxReturnError(val->init(inode, name, val.size())); + OX_RETURN_ERROR(val->init(inode, name, val.size())); return m_fs.write(m_inodeId, cpy.get(), cpy->size(), static_cast(FileType::Directory)); } } @@ -242,7 +242,7 @@ Error Directory::write(PathIterator path, uint64_t inode64 template Error Directory::remove(PathIterator path) noexcept { ox::StringView name; - oxReturnError(path.get(name)); + OX_RETURN_ERROR(path.get(name)); oxTrace("ox.fs.Directory.remove", name); auto buff = m_fs.read(m_inodeId).template to(); if (buff.valid()) { @@ -251,7 +251,7 @@ Error Directory::remove(PathIterator path) noexcept { auto data = i->data(); if (data.valid()) { if (name == data->name) { - oxReturnError(buff->free(i)); + OX_RETURN_ERROR(buff->free(i)); } } else { oxTrace("ox.fs.Directory.remove", "INVALID DIRECTORY ENTRY"); @@ -259,7 +259,7 @@ Error Directory::remove(PathIterator path) noexcept { } } else { oxTrace("ox.fs.Directory.remove.fail", "Could not find directory buffer"); - return OxError(1, "Could not find directory buffer"); + return ox::Error(1, "Could not find directory buffer"); } return {}; } @@ -271,13 +271,13 @@ Error Directory::ls(F cb) noexcept { auto buff = m_fs.read(m_inodeId).template to(); if (!buff.valid()) { oxTrace("ox.fs.Directory.ls.fail", "Could not directory buffer"); - return OxError(1, "Could not directory buffer"); + return ox::Error(1, "Could not directory buffer"); } oxTrace("ox.fs.Directory.ls", "Found directory buffer."); for (auto i = buff->iterator(); i.valid(); i.next()) { auto data = i->data(); if (data.valid()) { - oxReturnError(cb(data->name, data->inode)); + OX_RETURN_ERROR(cb(data->name, data->inode)); } else { oxTrace("ox.fs.Directory.ls", "INVALID DIRECTORY ENTRY"); } @@ -291,7 +291,7 @@ Result Directory::findEntry auto buff = m_fs.read(m_inodeId).template to(); if (!buff.valid()) { oxTrace("ox.fs.Directory.findEntry.fail", "Could not findEntry directory buffer"); - return OxError(2, "Could not findEntry directory buffer"); + return ox::Error(2, "Could not findEntry directory buffer"); } oxTracef("ox.fs.Directory.findEntry", "Found directory buffer, size: {}", buff.size()); for (auto i = buff->iterator(); i.valid(); i.next()) { @@ -307,15 +307,15 @@ Result Directory::findEntry } } oxTrace("ox.fs.Directory.findEntry.fail", "Entry not present"); - return OxError(1, "Entry not present"); + return ox::Error(1, "Entry not present"); } template Result Directory::find(PathIterator path) const noexcept { // determine if already exists ox::StringView name; - oxReturnError(path.get(name)); - oxRequire(v, findEntry(name)); + OX_RETURN_ERROR(path.get(name)); + OX_REQUIRE(v, findEntry(name)); // recurse if not at end of path if (auto p = path.next(); p.valid()) { Directory dir(m_fs, v); diff --git a/deps/ox/src/ox/fs/filesystem/filelocation.hpp b/deps/ox/src/ox/fs/filesystem/filelocation.hpp index 99944ad..e106a1e 100644 --- a/deps/ox/src/ox/fs/filesystem/filelocation.hpp +++ b/deps/ox/src/ox/fs/filesystem/filelocation.hpp @@ -89,7 +89,7 @@ class FileAddress { case FileAddressType::Inode: return m_data.inode; default: - return OxError(1); + return ox::Error(1); } } @@ -100,7 +100,7 @@ class FileAddress { case FileAddressType::ConstPath: return ox::CStringView(m_data.constPath); default: - return OxError(1); + return ox::Error(1); } } @@ -154,29 +154,29 @@ constexpr const char *getModelTypeName() noexcept { template constexpr Error model(T *h, CommonPtrWith auto *obj) noexcept { - oxReturnError(h->template setTypeInfo()); - oxReturnError(h->fieldCString("path", &obj->path)); - oxReturnError(h->fieldCString("constPath", &obj->path)); - oxReturnError(h->field("inode", &obj->inode)); + OX_RETURN_ERROR(h->template setTypeInfo()); + OX_RETURN_ERROR(h->fieldCString("path", &obj->path)); + OX_RETURN_ERROR(h->fieldCString("constPath", &obj->path)); + OX_RETURN_ERROR(h->field("inode", &obj->inode)); return {}; } template constexpr Error model(T *h, CommonPtrWith auto *fa) noexcept { - oxReturnError(h->template setTypeInfo()); + OX_RETURN_ERROR(h->template setTypeInfo()); if constexpr(T::opType() == OpType::Reflect) { int8_t type = -1; - oxReturnError(h->field("type", &type)); - oxReturnError(h->field("data", UnionView(&fa->m_data, type))); + OX_RETURN_ERROR(h->field("type", &type)); + OX_RETURN_ERROR(h->field("data", UnionView(&fa->m_data, type))); } else if constexpr(T::opType() == OpType::Read) { auto type = static_cast(fa->m_type); - oxReturnError(h->field("type", &type)); + OX_RETURN_ERROR(h->field("type", &type)); fa->m_type = static_cast(type); - oxReturnError(h->field("data", UnionView(&fa->m_data, static_cast(fa->m_type)))); + OX_RETURN_ERROR(h->field("data", UnionView(&fa->m_data, static_cast(fa->m_type)))); } else if constexpr(T::opType() == OpType::Write) { auto const type = static_cast(fa->m_type); - oxReturnError(h->field("type", &type)); - oxReturnError(h->field("data", UnionView(&fa->m_data, static_cast(fa->m_type)))); + OX_RETURN_ERROR(h->field("type", &type)); + OX_RETURN_ERROR(h->field("data", UnionView(&fa->m_data, static_cast(fa->m_type)))); } return {}; } diff --git a/deps/ox/src/ox/fs/filesystem/filesystem.cpp b/deps/ox/src/ox/fs/filesystem/filesystem.cpp index 5b9b771..9e097d3 100644 --- a/deps/ox/src/ox/fs/filesystem/filesystem.cpp +++ b/deps/ox/src/ox/fs/filesystem/filesystem.cpp @@ -21,7 +21,7 @@ Result MemFS::directAccess(const FileAddress &addr) const noexcept case FileAddressType::Path: return directAccess(StringView(addr.getPath().value)); default: - return OxError(1); + return ox::Error(1); } } @@ -33,21 +33,21 @@ Error FileSystem::read(const FileAddress &addr, void *buffer, std::size_t size) case FileAddressType::Path: return readFilePath(StringView(addr.getPath().value), buffer, size); default: - return OxError(1); + return ox::Error(1); } } Result FileSystem::read(const FileAddress &addr) noexcept { - oxRequire(s, stat(addr)); + OX_REQUIRE(s, stat(addr)); Buffer buff(static_cast(s.size)); - oxReturnError(read(addr, buff.data(), buff.size())); + OX_RETURN_ERROR(read(addr, buff.data(), buff.size())); return buff; } Result FileSystem::read(StringViewCR path) noexcept { - oxRequire(s, statPath(path)); + OX_REQUIRE(s, statPath(path)); Buffer buff(static_cast(s.size)); - oxReturnError(readFilePath(path, buff.data(), buff.size())); + OX_RETURN_ERROR(readFilePath(path, buff.data(), buff.size())); return buff; } @@ -57,9 +57,9 @@ Error FileSystem::read(const FileAddress &addr, std::size_t readStart, std::size return read(addr.getInode().value, readStart, readSize, buffer, size); case FileAddressType::ConstPath: case FileAddressType::Path: - return OxError(2, "Unsupported for path lookups"); + return ox::Error(2, "Unsupported for path lookups"); default: - return OxError(1); + return ox::Error(1); } } @@ -71,7 +71,7 @@ Error FileSystem::remove(const FileAddress &addr, bool recursive) noexcept { case FileAddressType::Path: return remove(StringView(addr.getPath().value), recursive); default: - return OxError(1); + return ox::Error(1); } } @@ -83,7 +83,7 @@ Error FileSystem::write(const FileAddress &addr, const void *buffer, uint64_t si case FileAddressType::Path: return writeFilePath(StringView(addr.getPath().value), buffer, size, fileType); default: - return OxError(1); + return ox::Error(1); } } @@ -95,7 +95,7 @@ Result FileSystem::stat(const FileAddress &addr) const noexcept { case FileAddressType::Path: return statPath(StringView(addr.getPath().value)); default: - return OxError(1); + return ox::Error(1); } } diff --git a/deps/ox/src/ox/fs/filesystem/filesystem.hpp b/deps/ox/src/ox/fs/filesystem/filesystem.hpp index a8c6110..0028e54 100644 --- a/deps/ox/src/ox/fs/filesystem/filesystem.hpp +++ b/deps/ox/src/ox/fs/filesystem/filesystem.hpp @@ -284,69 +284,69 @@ FileSystemTemplate::~FileSystemTemplate() noexcept { template Error FileSystemTemplate::format(void *buff, uint64_t buffSize) noexcept { - oxReturnError(FileStore::format(buff, static_cast(buffSize))); + OX_RETURN_ERROR(FileStore::format(buff, static_cast(buffSize))); FileStore fs(buff, static_cast(buffSize)); constexpr auto rootDirInode = MaxValue / 2; Directory rootDir(fs, rootDirInode); - oxReturnError(rootDir.init()); + OX_RETURN_ERROR(rootDir.init()); FileSystemData fd; fd.rootDirInode = rootDirInode; oxTracef("ox.fs.FileSystemTemplate.format", "rootDirInode: {}", fd.rootDirInode.get()); - oxReturnError(fs.write(InodeFsData, &fd, sizeof(fd))); + OX_RETURN_ERROR(fs.write(InodeFsData, &fd, sizeof(fd))); if (!fs.read(fd.rootDirInode).valid()) { oxTrace("ox.fs.FileSystemTemplate.format.error", "FileSystemTemplate::format did not correctly create root directory"); - return OxError(1); + return ox::Error(1); } - return OxError(0); + return ox::Error(0); } template Error FileSystemTemplate::mkdir(StringViewCR path, bool recursive) noexcept { oxTracef("ox.fs.FileSystemTemplate.mkdir", "path: {}, recursive: {}", path, recursive); - oxRequireM(rootDir, this->rootDir()); + OX_REQUIRE_M(rootDir, this->rootDir()); return rootDir.mkdir(path, recursive); } template Error FileSystemTemplate::move(StringViewCR src, StringViewCR dest) noexcept { - oxRequire(fd, fileSystemData()); + OX_REQUIRE(fd, fileSystemData()); Directory rootDir(m_fs, fd.rootDirInode); - oxRequireM(inode, rootDir.find(src)); - oxReturnError(rootDir.write(dest, inode)); - oxReturnError(rootDir.remove(src)); - return OxError(0); + OX_REQUIRE_M(inode, rootDir.find(src)); + OX_RETURN_ERROR(rootDir.write(dest, inode)); + OX_RETURN_ERROR(rootDir.remove(src)); + return ox::Error(0); } template Error FileSystemTemplate::readFilePath(StringViewCR path, void *buffer, std::size_t buffSize) noexcept { oxTrace("ox.fs.FileSystemTemplate.readFilePath", path); - oxRequire(fd, fileSystemData()); + OX_REQUIRE(fd, fileSystemData()); Directory rootDir(m_fs, fd.rootDirInode); - oxRequire(s, stat(path)); + OX_REQUIRE(s, stat(path)); if (s.size > buffSize) { - return OxError(1, "Buffer to small to load file"); + return ox::Error(1, "Buffer to small to load file"); } return readFileInodeRange(s.inode, 0, static_cast(s.size), buffer, &buffSize); } template Result FileSystemTemplate::directAccessPath(StringViewCR path) const noexcept { - oxRequire(fd, fileSystemData()); + OX_REQUIRE(fd, fileSystemData()); Directory rootDir(m_fs, fd.rootDirInode); - oxRequire(inode, rootDir.find(path)); + OX_REQUIRE(inode, rootDir.find(path)); return directAccessInode(inode); } template Error FileSystemTemplate::readFileInode(uint64_t inode, void *buffer, std::size_t buffSize) noexcept { oxTracef("ox.fs.FileSystemTemplate.readFileInode", "{}", inode); - oxRequire(s, stat(inode)); + OX_REQUIRE(s, stat(inode)); if (s.size > buffSize) { - return OxError(1, "Buffer to small to load file"); + return ox::Error(1, "Buffer to small to load file"); } return readFileInodeRange(inode, 0, static_cast(s.size), buffer, &buffSize); } @@ -360,7 +360,7 @@ template Result FileSystemTemplate::directAccessInode(uint64_t inode) const noexcept { auto data = m_fs.read(inode); if (!data.valid()) { - return OxError(1, "Data not valid"); + return ox::Error(1, "Data not valid"); } return reinterpret_cast(data.get()); } @@ -368,9 +368,9 @@ Result FileSystemTemplate::directAccessInode( template Result> FileSystemTemplate::ls(StringViewCR path) const noexcept { Vector out; - oxReturnError(ls(path, [&out](StringViewCR name, typename FileStore::InodeId_t) { + OX_RETURN_ERROR(ls(path, [&out](StringViewCR name, typename FileStore::InodeId_t) { out.emplace_back(name); - return OxError(0); + return ox::Error(0); })); return out; } @@ -379,17 +379,17 @@ template template Error FileSystemTemplate::ls(StringViewCR path, F cb) const { oxTracef("ox.fs.FileSystemTemplate.ls", "path: {}", path); - oxRequire(s, stat(path)); + OX_REQUIRE(s, stat(path)); Directory dir(m_fs, s.inode); return dir.ls(cb); } template Error FileSystemTemplate::remove(StringViewCR path, bool recursive) noexcept { - oxRequire(fd, fileSystemData()); + OX_REQUIRE(fd, fileSystemData()); Directory rootDir(m_fs, fd.rootDirInode); - oxRequire(inode, rootDir.find(path)); - oxRequire(st, statInode(inode)); + OX_REQUIRE(inode, rootDir.find(path)); + OX_REQUIRE(st, statInode(inode)); if (st.fileType == FileType::NormalFile || recursive) { if (auto err = rootDir.remove(path)) { // removal failed, try putting the index back @@ -398,9 +398,9 @@ Error FileSystemTemplate::remove(StringViewCR path, bool r } } else { oxTrace("FileSystemTemplate.remove.fail", "Tried to remove directory without recursive setting."); - return OxError(1); + return ox::Error(1); } - return OxError(0); + return ox::Error(0); } template @@ -410,7 +410,7 @@ Error FileSystemTemplate::resize() noexcept { template Error FileSystemTemplate::resize(uint64_t size, void *buffer) noexcept { - oxReturnError(m_fs.resize(static_cast(size), buffer)); + OX_RETURN_ERROR(m_fs.resize(static_cast(size), buffer)); return {}; } @@ -423,11 +423,11 @@ Error FileSystemTemplate::writeFilePath( oxTrace("ox.fs.FileSystemTemplate.writeFilePath", path); auto [inode, err] = find(path); if (err) { - oxReturnError(m_fs.generateInodeId().moveTo(inode)); - oxRequireM(rootDir, this->rootDir()); - oxReturnError(rootDir.write(path, inode)); + OX_RETURN_ERROR(m_fs.generateInodeId().moveTo(inode)); + OX_REQUIRE_M(rootDir, this->rootDir()); + OX_RETURN_ERROR(rootDir.write(path, inode)); } - oxReturnError(writeFileInode(inode, buffer, size, fileType)); + OX_RETURN_ERROR(writeFileInode(inode, buffer, size, fileType)); return {}; } @@ -439,7 +439,7 @@ Error FileSystemTemplate::writeFileInode(uint64_t inode, c template Result FileSystemTemplate::statInode(uint64_t inode) const noexcept { - oxRequire(s, m_fs.stat(inode)); + OX_REQUIRE(s, m_fs.stat(inode)); FileStat out; out.inode = s.inode; out.links = s.links; @@ -450,7 +450,7 @@ Result FileSystemTemplate::statInode(uint64_t in template Result FileSystemTemplate::statPath(StringViewCR path) const noexcept { - oxRequire(inode, find(path)); + OX_REQUIRE(inode, find(path)); return stat(inode); } @@ -487,25 +487,25 @@ bool FileSystemTemplate::valid() const noexcept { template Result::FileSystemData> FileSystemTemplate::fileSystemData() const noexcept { FileSystemData fd; - oxReturnError(m_fs.read(InodeFsData, &fd, sizeof(fd))); + OX_RETURN_ERROR(m_fs.read(InodeFsData, &fd, sizeof(fd))); return fd; } template Result FileSystemTemplate::find(StringViewCR path) const noexcept { - oxRequire(fd, fileSystemData()); + OX_REQUIRE(fd, fileSystemData()); // return root as a special case if (path == "/") { return static_cast(fd.rootDirInode); } Directory rootDir(m_fs, fd.rootDirInode); - oxRequire(out, rootDir.find(path)); + OX_REQUIRE(out, rootDir.find(path)); return static_cast(out); } template Result FileSystemTemplate::rootDir() const noexcept { - oxRequire(fd, fileSystemData()); + OX_REQUIRE(fd, fileSystemData()); return Directory(m_fs, fd.rootDirInode); } diff --git a/deps/ox/src/ox/fs/filesystem/passthroughfs.cpp b/deps/ox/src/ox/fs/filesystem/passthroughfs.cpp index 1fd7080..5217069 100644 --- a/deps/ox/src/ox/fs/filesystem/passthroughfs.cpp +++ b/deps/ox/src/ox/fs/filesystem/passthroughfs.cpp @@ -39,7 +39,7 @@ Error PassThroughFS::mkdir(StringViewCR path, bool recursive) noexcept { success = true; } else { success = std::filesystem::create_directories(p, ec); - oxReturnError(OxError(static_cast(ec.value()), "PassThroughFS: mkdir failed")); + OX_RETURN_ERROR(ox::Error(static_cast(ec.value()), "PassThroughFS: mkdir failed")); } } else { std::error_code ec; @@ -48,26 +48,26 @@ Error PassThroughFS::mkdir(StringViewCR path, bool recursive) noexcept { success = true; } else { success = std::filesystem::create_directory(p, ec); - oxReturnError(OxError(static_cast(ec.value()), "PassThroughFS: mkdir failed")); + OX_RETURN_ERROR(ox::Error(static_cast(ec.value()), "PassThroughFS: mkdir failed")); } } - return OxError(success ? 0 : 1); + return ox::Error(success ? 0 : 1); } Error PassThroughFS::move(StringViewCR src, StringViewCR dest) noexcept { std::error_code ec; std::filesystem::rename(m_path / stripSlash(src), m_path / stripSlash(dest), ec); if (ec.value()) { - return OxError(1); + return ox::Error(1); } - return OxError(0); + return ox::Error(0); } Result> PassThroughFS::ls(StringViewCR dir) const noexcept { Vector out; std::error_code ec; const auto di = std::filesystem::directory_iterator(m_path / stripSlash(dir), ec); - oxReturnError(OxError(static_cast(ec.value()), "PassThroughFS: ls failed")); + OX_RETURN_ERROR(ox::Error(static_cast(ec.value()), "PassThroughFS: ls failed")); for (const auto &p : di) { const auto u8p = p.path().filename().u8string(); out.emplace_back(reinterpret_cast(u8p.c_str())); @@ -77,20 +77,20 @@ Result> PassThroughFS::ls(StringViewCR dir) const noexcept { Error PassThroughFS::remove(StringViewCR path, bool recursive) noexcept { if (recursive) { - return OxError(std::filesystem::remove_all(m_path / stripSlash(path)) != 0); + return ox::Error(std::filesystem::remove_all(m_path / stripSlash(path)) != 0); } else { - return OxError(std::filesystem::remove(m_path / stripSlash(path)) != 0); + return ox::Error(std::filesystem::remove(m_path / stripSlash(path)) != 0); } } Error PassThroughFS::resize(uint64_t, void*) noexcept { // unsupported - return OxError(1, "resize is not supported by PassThroughFS"); + return ox::Error(1, "resize is not supported by PassThroughFS"); } Result PassThroughFS::statInode(uint64_t) const noexcept { // unsupported - return OxError(1, "statInode(uint64_t) is not supported by PassThroughFS"); + return ox::Error(1, "statInode(uint64_t) is not supported by PassThroughFS"); } Result PassThroughFS::statPath(StringViewCR path) const noexcept { @@ -101,7 +101,7 @@ Result PassThroughFS::statPath(StringViewCR path) const noexcept { oxTracef("ox.fs.PassThroughFS.statInode", "{} {}", ec.message(), path); const uint64_t size = type == FileType::Directory ? 0 : std::filesystem::file_size(p, ec); oxTracef("ox.fs.PassThroughFS.statInode.size", "{} {}", path, size); - oxReturnError(OxError(static_cast(ec.value()), "PassThroughFS: stat failed")); + OX_RETURN_ERROR(ox::Error(static_cast(ec.value()), "PassThroughFS: stat failed")); return FileStat{0, 0, size, type}; } @@ -112,14 +112,14 @@ uint64_t PassThroughFS::spaceNeeded(uint64_t size) const noexcept { Result PassThroughFS::available() const noexcept { std::error_code ec; const auto s = std::filesystem::space(m_path, ec); - oxReturnError(OxError(static_cast(ec.value()), "PassThroughFS: could not get FS size")); + OX_RETURN_ERROR(ox::Error(static_cast(ec.value()), "PassThroughFS: could not get FS size")); return s.available; } Result PassThroughFS::size() const noexcept { std::error_code ec; const auto s = std::filesystem::space(m_path, ec); - oxReturnError(OxError(static_cast(ec.value()), "PassThroughFS: could not get FS size")); + OX_RETURN_ERROR(ox::Error(static_cast(ec.value()), "PassThroughFS: could not get FS size")); return s.capacity; } @@ -128,7 +128,7 @@ char *PassThroughFS::buff() noexcept { } Error PassThroughFS::walk(Error(*)(uint8_t, uint64_t, uint64_t)) noexcept { - return OxError(1, "walk(Error(*)(uint8_t, uint64_t, uint64_t)) is not supported by PassThroughFS"); + return ox::Error(1, "walk(Error(*)(uint8_t, uint64_t, uint64_t)) is not supported by PassThroughFS"); } bool PassThroughFS::valid() const noexcept { @@ -147,24 +147,24 @@ Error PassThroughFS::readFilePath(StringViewCR path, void *buffer, std::size_t b file.seekg(0, std::ios::beg); if (size > buffSize) { oxTracef("ox.fs.PassThroughFS.read.error", "Read failed: Buffer too small: {}", path); - return OxError(1); + return ox::Error(1); } file.read(static_cast(buffer), static_cast(buffSize)); } catch (const std::fstream::failure &f) { oxTracef("ox.fs.PassThroughFS.read.error", "Read of {} failed: {}", path, f.what()); - return OxError(2); + return ox::Error(2); } - return OxError(0); + return ox::Error(0); } Error PassThroughFS::readFileInode(uint64_t, void*, std::size_t) noexcept { // unsupported - return OxError(1, "readFileInode(uint64_t, void*, std::size_t) is not supported by PassThroughFS"); + return ox::Error(1, "readFileInode(uint64_t, void*, std::size_t) is not supported by PassThroughFS"); } Error PassThroughFS::readFileInodeRange(uint64_t, std::size_t, std::size_t, void*, std::size_t*) noexcept { // unsupported - return OxError(1, "read(uint64_t, std::size_t, std::size_t, void*, std::size_t*) is not supported by PassThroughFS"); + return ox::Error(1, "read(uint64_t, std::size_t, std::size_t, void*, std::size_t*) is not supported by PassThroughFS"); } Error PassThroughFS::writeFilePath(StringViewCR path, const void *buffer, uint64_t size, FileType) noexcept { @@ -174,14 +174,14 @@ Error PassThroughFS::writeFilePath(StringViewCR path, const void *buffer, uint64 f.write(static_cast(buffer), static_cast(size)); } catch (const std::fstream::failure &f) { oxTracef("ox.fs.PassThroughFS.read.error", "Write of {} failed: {}", path, f.what()); - return OxError(1); + return ox::Error(1); } - return OxError(0); + return ox::Error(0); } Error PassThroughFS::writeFileInode(uint64_t, const void*, uint64_t, FileType) noexcept { // unsupported - return OxError(1, "writeFileInode(uint64_t, void*, uint64_t, uint8_t) is not supported by PassThroughFS"); + return ox::Error(1, "writeFileInode(uint64_t, void*, uint64_t, uint8_t) is not supported by PassThroughFS"); } std::string_view PassThroughFS::stripSlash(StringView path) noexcept { diff --git a/deps/ox/src/ox/fs/filesystem/passthroughfs.hpp b/deps/ox/src/ox/fs/filesystem/passthroughfs.hpp index abe6dae..19eeadb 100644 --- a/deps/ox/src/ox/fs/filesystem/passthroughfs.hpp +++ b/deps/ox/src/ox/fs/filesystem/passthroughfs.hpp @@ -92,11 +92,11 @@ template Error PassThroughFS::ls(StringViewCR dir, F cb) const noexcept { std::error_code ec; const auto di = std::filesystem::directory_iterator(m_path / stripSlash(dir), ec); - oxReturnError(OxError(static_cast(ec.value()), "PassThroughFS: ls failed")); + OX_RETURN_ERROR(ox::Error(static_cast(ec.value()), "PassThroughFS: ls failed")); for (auto &p : di) { - oxReturnError(cb(p.path().filename().c_str(), 0)); + OX_RETURN_ERROR(cb(p.path().filename().c_str(), 0)); } - return OxError(0); + return ox::Error(0); } } diff --git a/deps/ox/src/ox/fs/filesystem/pathiterator.cpp b/deps/ox/src/ox/fs/filesystem/pathiterator.cpp index 77d4050..cf6f237 100644 --- a/deps/ox/src/ox/fs/filesystem/pathiterator.cpp +++ b/deps/ox/src/ox/fs/filesystem/pathiterator.cpp @@ -36,9 +36,9 @@ Error PathIterator::dirPath(char *out, std::size_t outSize) { if (idx >= 0 && size < outSize) { ox::memcpy(out, m_path, size); out[size] = 0; - return OxError(0); + return ox::Error(0); } else { - return OxError(1); + return ox::Error(1); } } @@ -47,11 +47,11 @@ Error PathIterator::get(StringView &fileName) { std::size_t size = 0; if (m_iterator >= m_maxSize) { oxTracef("ox.fs.PathIterator.get", "m_iterator ({}) >= m_maxSize ({})", m_iterator, m_maxSize); - return OxError(1); + return ox::Error(1); } if (!ox::strlen(&m_path[m_iterator])) { oxTrace("ox.fs.PathIterator.get", "!ox::strlen(&m_path[m_iterator])"); - return OxError(1); + return ox::Error(1); } auto start = m_iterator; if (m_path[start] == '/') { @@ -67,7 +67,7 @@ Error PathIterator::get(StringView &fileName) { size = end - start; // cannot fit the output in the output parameter if (size >= MaxFileNameLength || size == 0) { - return OxError(1); + return ox::Error(1); } fileName = ox::substr(m_path, start, start + size); // truncate trailing / @@ -83,9 +83,9 @@ Error PathIterator::get(StringView &fileName) { */ Error PathIterator::next(StringView &fileName) { std::size_t size = 0; - auto retval = OxError(1); + auto retval = ox::Error(1); if (m_iterator < m_maxSize && ox::strlen(&m_path[m_iterator])) { - retval = OxError(0); + retval = ox::Error(0); if (m_path[m_iterator] == '/') { m_iterator++; } @@ -100,7 +100,7 @@ Error PathIterator::next(StringView &fileName) { size = end - start; // cannot fit the output in the output parameter if (size >= MaxFileNameLength) { - return OxError(1); + return ox::Error(1); } fileName = ox::substr(m_path, start, start + size); // truncate trailing / @@ -115,10 +115,10 @@ Error PathIterator::next(StringView &fileName) { Result PathIterator::nextSize() const { std::size_t size = 0; - auto retval = OxError(1); + auto retval = ox::Error(1); auto it = m_iterator; if (it < m_maxSize && ox::strlen(&m_path[it])) { - retval = OxError(0); + retval = ox::Error(0); if (m_path[it] == '/') { it++; } diff --git a/deps/ox/src/ox/fs/ptrarith/nodebuffer.hpp b/deps/ox/src/ox/fs/ptrarith/nodebuffer.hpp index 358a798..4f7b44e 100644 --- a/deps/ox/src/ox/fs/ptrarith/nodebuffer.hpp +++ b/deps/ox/src/ox/fs/ptrarith/nodebuffer.hpp @@ -284,14 +284,14 @@ Result::ItemPtr> NodeBuffer::mal addr = m_header.firstItem; } else { oxTrace("ox.ptrarith.NodeBuffer.malloc.fail", "NodeBuffer is in invalid state."); - return OxError(1, "NodeBuffer is in invalid state."); + return ox::Error(1, "NodeBuffer is in invalid state."); } } oxTracef("ox.ptrarith.NodeBuffer.malloc", "buffer size: {}; addr: {}; fullSize: {}", m_header.size.get(), addr, fullSize); auto out = ItemPtr(this, m_header.size, addr, fullSize); if (!out.valid()) { oxTrace("ox.ptrarith.NodeBuffer.malloc.fail", "Unknown"); - return OxError(1, "NodeBuffer::malloc: unknown failure"); + return ox::Error(1, "NodeBuffer::malloc: unknown failure"); } ox::memset(out, 0, fullSize); new (out) Item; @@ -304,7 +304,7 @@ Result::ItemPtr> NodeBuffer::mal first->prev = out.offset(); } else { oxTrace("ox.ptrarith.NodeBuffer.malloc.fail", "NodeBuffer malloc failed due to invalid first element pointer."); - return OxError(1, "NodeBuffer malloc failed due to invalid first element pointer."); + return ox::Error(1, "NodeBuffer malloc failed due to invalid first element pointer."); } if (oldLast.valid()) { @@ -314,7 +314,7 @@ Result::ItemPtr> NodeBuffer::mal if (out.offset() != first.offset()) { // if this is not the first allocation, there should be an oldLast oxTrace("ox.ptrarith.NodeBuffer.malloc.fail", "NodeBuffer malloc failed due to invalid last element pointer."); - return OxError(1, "NodeBuffer malloc failed due to invalid last element pointer."); + return ox::Error(1, "NodeBuffer malloc failed due to invalid last element pointer."); } out->prev = out.offset(); } @@ -323,7 +323,7 @@ Result::ItemPtr> NodeBuffer::mal return out; } oxTracef("ox.ptrarith.NodeBuffer.malloc.fail", "Insufficient space: {} needed, {} available", fullSize, available()); - return OxError(1); + return ox::Error(1); } template @@ -346,15 +346,15 @@ Error NodeBuffer::free(ItemPtr item) noexcept { } else { if (!prev.valid()) { oxTracef("ox.ptrarith.NodeBuffer.free.fail", "NodeBuffer free failed due to invalid prev element pointer: {}", prev.offset()); - return OxError(1); + return ox::Error(1); } if (!next.valid()) { oxTracef("ox.ptrarith.NodeBuffer.free.fail", "NodeBuffer free failed due to invalid next element pointer: {}", next.offset()); - return OxError(1); + return ox::Error(1); } } m_header.bytesUsed -= item.size(); - return OxError(0); + return ox::Error(0); } template @@ -365,12 +365,12 @@ Error NodeBuffer::setSize(std::size_t size) noexcept { oxTracef("ox.ptrarith.NodeBuffer.setSize", "end: {}", end); if (end > size) { // resizing to less than buffer size - return OxError(1); + return ox::Error(1); } else { m_header.size = static_cast(size); auto data = reinterpret_cast(this) + end; ox::memset(data, 0, size - end); - return OxError(0); + return ox::Error(0); } } @@ -401,14 +401,14 @@ Error NodeBuffer::compact(F cb) noexcept { auto dest = ptr(sizeof(*this)); while (dest.offset() <= src.offset()) { if (!src.valid()) { - return OxError(1); + return ox::Error(1); } if (!dest.valid()) { - return OxError(2); + return ox::Error(2); } // move node ox::memcpy(dest, src, src->fullSize()); - oxReturnError(cb(src, dest)); + OX_RETURN_ERROR(cb(src, dest)); // update surrounding nodes auto prev = ptr(dest->prev); if (prev.valid()) { @@ -422,7 +422,7 @@ Error NodeBuffer::compact(F cb) noexcept { src = ptr(dest->next); dest = uninitializedPtr(dest.offset() + dest->fullSize()); } - return OxError(0); + return ox::Error(0); } template diff --git a/deps/ox/src/ox/fs/ptrarith/ptr.hpp b/deps/ox/src/ox/fs/ptrarith/ptr.hpp index 5e0efac..c12bb50 100644 --- a/deps/ox/src/ox/fs/ptrarith/ptr.hpp +++ b/deps/ox/src/ox/fs/ptrarith/ptr.hpp @@ -254,7 +254,7 @@ constexpr Result> Ptr::validate( if (valid()) { return *this; } - return OxError(1); + return ox::Error(1); } } diff --git a/deps/ox/src/ox/fs/test/tests.cpp b/deps/ox/src/ox/fs/test/tests.cpp index f5b6db9..ec66ee3 100644 --- a/deps/ox/src/ox/fs/test/tests.cpp +++ b/deps/ox/src/ox/fs/test/tests.cpp @@ -52,7 +52,7 @@ const std::map> tests = oxAssert(buffer->free(a1), "Free failed."); oxAssert(buffer->free(a2), "Free failed."); oxAssert(buffer->setSize(buffer->size() - buffer->available()), "Resize failed."); - return OxError(0); + return ox::Error(0); } }, { @@ -64,7 +64,7 @@ const std::map> tests = oxAssert(it.next(buff) == 0 && buff == "usr", "PathIterator shows wrong next"); oxAssert(it.next(buff) == 0 && buff == "share", "PathIterator shows wrong next"); oxAssert(it.next(buff) == 0 && buff == "charset.gbag", "PathIterator shows wrong next"); - return OxError(0); + return ox::Error(0); } }, { @@ -77,7 +77,7 @@ const std::map> tests = oxExpect(buff, "usr"); oxAssert(it.next(buff), "PathIterator::next returned error"); oxExpect(buff, "share"); - return OxError(0); + return ox::Error(0); } }, { @@ -87,7 +87,7 @@ const std::map> tests = ox::PathIterator it(path.c_str(), path.len()); ox::StringView buff; oxAssert(it.next(buff) == 0 && buff == "\0", "PathIterator shows wrong next"); - return OxError(0); + return ox::Error(0); } }, { @@ -99,7 +99,7 @@ const std::map> tests = oxAssert(it.next(buff) == 0 && buff == "usr", "PathIterator shows wrong next"); oxAssert(it.next(buff) == 0 && buff == "share", "PathIterator shows wrong next"); oxAssert(it.next(buff) == 0 && buff == "charset.gbag", "PathIterator shows wrong next"); - return OxError(0); + return ox::Error(0); } }, { @@ -110,7 +110,7 @@ const std::map> tests = ox::StringView buff; oxAssert(it.next(buff) == 0 && buff == "usr", "PathIterator shows wrong next"); oxAssert(it.next(buff) == 0 && buff == "share", "PathIterator shows wrong next"); - return OxError(0); + return ox::Error(0); } }, { @@ -120,7 +120,7 @@ const std::map> tests = ox::PathIterator it(path.c_str(), path.len()); auto buff = static_cast(ox_alloca(path.len() + 1)); oxAssert(it.dirPath(buff, path.len()) == 0 && ox::strcmp(buff, "/usr/share/") == 0, "PathIterator shows incorrect dir path"); - return OxError(0); + return ox::Error(0); } }, { @@ -130,7 +130,7 @@ const std::map> tests = ox::PathIterator it(path, ox::strlen(path)); oxAssert(it.hasNext(), "PathIterator shows incorrect hasNext"); oxAssert(!it.next().hasNext(), "PathIterator shows incorrect hasNext"); - return OxError(0); + return ox::Error(0); } }, { @@ -142,7 +142,7 @@ const std::map> tests = auto subPtr = p.subPtr(50); oxAssert(subPtr.valid(), "Ptr::subPtr: Ptr subPtr is invalid."); - return OxError(0); + return ox::Error(0); } }, { @@ -155,7 +155,7 @@ const std::map> tests = auto first = list->firstItem(); oxAssert(first.valid(), "NodeBuffer::insert: Could not access first item"); oxAssert(first->size() == 50, "NodeBuffer::insert: First item size invalid"); - return OxError(0); + return ox::Error(0); } }, { @@ -176,7 +176,7 @@ const std::map> tests = size_t str1ReadSize = 0; oxAssert(fileStore.read(4, reinterpret_cast(str1Read), str1Len, &str1ReadSize), "FileStore::read 1 failed."); - return OxError(0); + return ox::Error(0); } }, { @@ -203,7 +203,7 @@ const std::map> tests = oxTrace("ox.fs.test.Directory") << "write 3"; oxAssert(dir.write("/file2", 2), "Directory write of file2 failed"); - return OxError(0); + return ox::Error(0); } }, { @@ -220,7 +220,7 @@ const std::map> tests = oxAssert(fs.stat("/l1d1/l2d1/l3d1").error, "mkdir failed"); oxAssert(fs.mkdir("/l1d1/l2d2", true), "mkdir failed"); oxAssert(fs.stat("/l1d1/l2d2").error, "mkdir failed"); - return OxError(0); + return ox::Error(0); } }, }, diff --git a/deps/ox/src/ox/fs/tool.cpp b/deps/ox/src/ox/fs/tool.cpp index c65819f..82e4b4c 100644 --- a/deps/ox/src/ox/fs/tool.cpp +++ b/deps/ox/src/ox/fs/tool.cpp @@ -20,7 +20,7 @@ static ox::Result loadFsBuff(const char *path) noexcept { std::ifstream file(path, std::ios::binary | std::ios::ate); if (!file.good()) { oxErrorf("Could not find OxFS file: {}", path); - return OxError(1, "Could not find OxFS file"); + return ox::Error(1, "Could not find OxFS file"); } try { const auto size = static_cast(file.tellg()); @@ -30,52 +30,52 @@ static ox::Result loadFsBuff(const char *path) noexcept { return Buff{buff, size}; } catch (const std::ios_base::failure &e) { oxErrorf("Could not read OxFS file: {}", e.what()); - return OxError(2, "Could not read OxFS file"); + return ox::Error(2, "Could not read OxFS file"); } } static ox::Result> loadFs(const char *path) noexcept { - oxRequire(buff, loadFsBuff(path)); + OX_REQUIRE(buff, loadFsBuff(path)); return {ox::make_unique(buff.data, buff.size)}; } static ox::Error runLs(ox::FileSystem *fs, ox::Span args) noexcept { if (args.size() < 2) { oxErr("Must provide a directory to ls\n"); - return OxError(1); + return ox::Error(1); } - oxRequire(files, fs->ls(args[1])); + OX_REQUIRE(files, fs->ls(args[1])); for (const auto &file : files) { oxOutf("{}\n", file); } - return OxError(0); + return ox::Error(0); } static ox::Error runRead(ox::FileSystem *fs, ox::Span args) noexcept { if (args.size() < 2) { oxErr("Must provide a path to a file to read\n"); - return OxError(1); + return ox::Error(1); } - oxRequire(buff, fs->read(ox::StringView(args[1]))); + OX_REQUIRE(buff, fs->read(ox::StringView(args[1]))); std::ignore = fwrite(buff.data(), sizeof(decltype(buff)::value_type), buff.size(), stdout); - return OxError(0); + return ox::Error(0); } static ox::Error run(int argc, const char **argv) noexcept { if (argc < 3) { oxErr("OxFS file and subcommand arguments are required\n"); - return OxError(1); + return ox::Error(1); } auto const args = ox::Span{argv, static_cast(argc)}; auto const fsPath = args[1]; ox::String subCmd(args[2]); - oxRequire(fs, loadFs(fsPath)); + OX_REQUIRE(fs, loadFs(fsPath)); if (subCmd == "ls") { return runLs(fs.get(), args + 2); } else if (subCmd == "read") { return runRead(fs.get(), args + 2); } - return OxError(1); + return ox::Error(1); } int main(int argc, const char **argv) { diff --git a/deps/ox/src/ox/logconn/circularbuff.hpp b/deps/ox/src/ox/logconn/circularbuff.hpp index 1100c10..802ab3a 100644 --- a/deps/ox/src/ox/logconn/circularbuff.hpp +++ b/deps/ox/src/ox/logconn/circularbuff.hpp @@ -34,7 +34,7 @@ class CirculerBuffer { constexpr ox::Error put(char v) noexcept { return write(&v, 1); if (1 > avail()) { - return OxError(1, "Insufficient space in buffer"); + return ox::Error(1, "Insufficient space in buffer"); } m_buff[m_writePt] = v; ++m_writePt; @@ -43,7 +43,7 @@ class CirculerBuffer { constexpr ox::Error write(const char *buff, std::size_t sz) noexcept { if (sz > avail()) { - return OxError(1, "Insufficient space in buffer"); + return ox::Error(1, "Insufficient space in buffer"); } OX_ALLOW_UNSAFE_BUFFERS_BEGIN // write seg 1 @@ -63,7 +63,7 @@ OX_ALLOW_UNSAFE_BUFFERS_END constexpr ox::Error seekp(std::size_t bytesFwd) noexcept { if (bytesFwd > avail()) { - return OxError(1, "Insufficient space in buffer to seek that far ahead"); + return ox::Error(1, "Insufficient space in buffer to seek that far ahead"); } m_writePt += bytesFwd; if (m_writePt > m_buff.size()) { @@ -73,7 +73,7 @@ OX_ALLOW_UNSAFE_BUFFERS_END } constexpr ox::Error seekp(int, ios_base::seekdir) noexcept { - return OxError(1, "Unimplemented"); + return ox::Error(1, "Unimplemented"); } [[nodiscard]] diff --git a/deps/ox/src/ox/logconn/logconn.cpp b/deps/ox/src/ox/logconn/logconn.cpp index dfe91a4..6bec299 100644 --- a/deps/ox/src/ox/logconn/logconn.cpp +++ b/deps/ox/src/ox/logconn/logconn.cpp @@ -64,7 +64,7 @@ ox::Error LoggerConn::initConn(ox::StringViewCR appName) noexcept { addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); addr.sin_port = htons(5590); m_socket = static_cast(socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)); - oxReturnError(OxError(static_cast(connect(static_cast(m_socket), reinterpret_cast(&addr), sizeof(addr))))); + OX_RETURN_ERROR(ox::Error(static_cast(connect(static_cast(m_socket), reinterpret_cast(&addr), sizeof(addr))))); return sendInit({.appName = ox::BasicString<128>(appName)}); } @@ -75,7 +75,7 @@ ox::Error LoggerConn::send(const char *buff, std::size_t len) const noexcept { const auto sent = ::send(static_cast(m_socket), buff, static_cast(len), 0); if (sent < 0) { std::ignore = std::fprintf(stderr, "Could not send msg\n"); - return OxError(1, "Could not send msg"); + return ox::Error(1, "Could not send msg"); } totalSent += static_cast(sent); } diff --git a/deps/ox/src/ox/logconn/logconn.hpp b/deps/ox/src/ox/logconn/logconn.hpp index 8a2b3ae..fc14369 100644 --- a/deps/ox/src/ox/logconn/logconn.hpp +++ b/deps/ox/src/ox/logconn/logconn.hpp @@ -45,13 +45,13 @@ class LoggerConn: public trace::Logger { ox::Error send(trace::MsgId msgId, const auto &msg) noexcept { ox::Array buff; std::size_t sz = 0; - oxReturnError(ox::writeMC(&buff[0], buff.size(), msg, &sz)); + OX_RETURN_ERROR(ox::writeMC(&buff[0], buff.size(), msg, &sz)); //std::printf("sz: %lu\n", sz); - oxRequire(szBuff, serialize(static_cast(sz))); + OX_REQUIRE(szBuff, serialize(static_cast(sz))); std::unique_lock buffLk(m_buffMut); - oxReturnError(m_buff.put(static_cast(msgId))); - oxReturnError(m_buff.write(szBuff.data(), szBuff.size())); - oxReturnError(m_buff.write(buff.data(), sz)); + OX_RETURN_ERROR(m_buff.put(static_cast(msgId))); + OX_RETURN_ERROR(m_buff.write(szBuff.data(), szBuff.size())); + OX_RETURN_ERROR(m_buff.write(buff.data(), sz)); buffLk.unlock(); m_waitCond.notify_one(); return {}; diff --git a/deps/ox/src/ox/mc/intops.hpp b/deps/ox/src/ox/mc/intops.hpp index 567af5c..6e8f685 100644 --- a/deps/ox/src/ox/mc/intops.hpp +++ b/deps/ox/src/ox/mc/intops.hpp @@ -135,19 +135,19 @@ static_assert(countBytes(0b1111'1111) == 9); template constexpr Result decodeInteger(Reader_c auto&rdr, std::size_t *bytesRead) noexcept { uint8_t firstByte = 0; - oxReturnError(rdr.read(&firstByte, 1)); - oxReturnError(rdr.seekg(-1, ox::ios_base::cur)); + OX_RETURN_ERROR(rdr.read(&firstByte, 1)); + OX_RETURN_ERROR(rdr.seekg(-1, ox::ios_base::cur)); const auto bytes = countBytes(firstByte); if (bytes == 9) { *bytesRead = bytes; I out = 0; - oxReturnError(rdr.seekg(1, ox::ios_base::cur)); - oxReturnError(rdr.read(&out, sizeof(I))); + OX_RETURN_ERROR(rdr.seekg(1, ox::ios_base::cur)); + OX_RETURN_ERROR(rdr.read(&out, sizeof(I))); return fromLittleEndian(out); } *bytesRead = bytes; uint64_t decoded = 0; - oxReturnError(rdr.read(&decoded, bytes)); + OX_RETURN_ERROR(rdr.read(&decoded, bytes)); decoded >>= bytes; // move sign bit if constexpr(is_signed_v) { diff --git a/deps/ox/src/ox/mc/presenceindicator.hpp b/deps/ox/src/ox/mc/presenceindicator.hpp index f9f02c9..6f68e5b 100644 --- a/deps/ox/src/ox/mc/presenceindicator.hpp +++ b/deps/ox/src/ox/mc/presenceindicator.hpp @@ -47,7 +47,7 @@ constexpr Result FieldBitmapReader::get(std::size_t idx) const noe constexpr auto blockBits = sizeof(m_mapBlock); auto const blockIdx = idx / blockBits; if (m_mapBlockIdx != blockIdx) [[unlikely]] { - oxReturnError(loadMapBlock(blockIdx)); + OX_RETURN_ERROR(loadMapBlock(blockIdx)); } idx %= blockBits; return (m_mapBlock >> idx) & 1; @@ -55,12 +55,12 @@ constexpr Result FieldBitmapReader::get(std::size_t idx) const noe template constexpr ox::Error FieldBitmapReader::loadMapBlock(std::size_t idx) const noexcept { - oxRequire(g, m_reader.tellg()); - oxReturnError(m_reader.seekg(static_cast(m_mapStart + idx), ox::ios_base::beg)); + OX_REQUIRE(g, m_reader.tellg()); + OX_RETURN_ERROR(m_reader.seekg(static_cast(m_mapStart + idx), ox::ios_base::beg)); ox::Array mapBlock{}; - oxReturnError(m_reader.read(mapBlock.data(), sizeof(m_mapBlock))); + OX_RETURN_ERROR(m_reader.read(mapBlock.data(), sizeof(m_mapBlock))); // Warning: narrow-conv - oxReturnError(m_reader.seekg(static_cast(g), ox::ios_base::beg)); + OX_RETURN_ERROR(m_reader.seekg(static_cast(g), ox::ios_base::beg)); m_mapBlock = 0; for (auto i = 0ull; auto b : mapBlock) { m_mapBlock |= static_cast(std::bit_cast(b)) << i; @@ -110,7 +110,7 @@ constexpr Result FieldBitmapWriterBase::get(std::size_t i) const noexce if (i / 8 < m_mapLen) { return (m_map[i / 8] >> (i % 8)) & 1; } else { - return OxError(McPresenceMapOverflow); + return ox::Error(McPresenceMapOverflow); } } @@ -156,7 +156,7 @@ OX_ALLOW_UNSAFE_BUFFERS_BEGIN OX_ALLOW_UNSAFE_BUFFERS_END return {}; } else { - return OxError(McPresenceMapOverflow); + return ox::Error(McPresenceMapOverflow); } } diff --git a/deps/ox/src/ox/mc/read.hpp b/deps/ox/src/ox/mc/read.hpp index e0534d0..abb6c39 100644 --- a/deps/ox/src/ox/mc/read.hpp +++ b/deps/ox/src/ox/mc/read.hpp @@ -194,10 +194,10 @@ constexpr Error MetalClawReaderTemplate::field(const char*, bool *val) n if (!m_unionIdx.has_value() || static_cast(*m_unionIdx) == m_field) { auto const result = m_fieldPresence.get(static_cast(m_field)); *val = result.value; - oxReturnError(result); + OX_RETURN_ERROR(result); } ++m_field; - return OxError(0); + return ox::Error(0); } // array handler @@ -207,20 +207,20 @@ constexpr Error MetalClawReaderTemplate::field(const char *name, auto *v if (m_fieldPresence.get(static_cast(m_field))) { // read the length std::size_t bytesRead = 0; - oxRequire(len, mc::decodeInteger(m_reader, &bytesRead)); + OX_REQUIRE(len, mc::decodeInteger(m_reader, &bytesRead)); // read the list if (valLen >= len) { auto reader = child({}); auto &handler = *reader.interface(); - oxReturnError(handler.setTypeInfo("List", 0, {}, static_cast(len))); + OX_RETURN_ERROR(handler.setTypeInfo("List", 0, {}, static_cast(len))); for (std::size_t i = 0; i < len; ++i) { OX_ALLOW_UNSAFE_BUFFERS_BEGIN - oxReturnError(handler.field({}, &val[i])); + OX_RETURN_ERROR(handler.field({}, &val[i])); OX_ALLOW_UNSAFE_BUFFERS_END } } else { oxTracef("ox.mc.read.field(T)", "{}, length: {}", name, valLen); - return OxError(McOutputBuffEnded); + return ox::Error(McOutputBuffEnded); } } } @@ -234,29 +234,29 @@ constexpr Error MetalClawReaderTemplate::field(const char*, HashMap(*m_unionIdx) == m_field) { if (m_fieldPresence.get(static_cast(m_field))) { // read the length - oxRequire(g, m_reader.tellg()); + OX_REQUIRE(g, m_reader.tellg()); std::size_t bytesRead = 0; - oxRequire(len, mc::decodeInteger(m_reader, &bytesRead)); - oxReturnError(m_reader.seekg(g)); + OX_REQUIRE(len, mc::decodeInteger(m_reader, &bytesRead)); + OX_RETURN_ERROR(m_reader.seekg(g)); // read the list auto reader = child(""); auto &handler = *reader.interface(); - oxReturnError(handler.setTypeInfo("List", 0, {}, static_cast(len))); + OX_RETURN_ERROR(handler.setTypeInfo("List", 0, {}, static_cast(len))); // this loop body needs to be in a lambda because of the potential alloca call constexpr auto loopBody = [](auto &handler, auto &val) { - oxRequire(keyLen, handler.stringLength(nullptr)); + OX_REQUIRE(keyLen, handler.stringLength(nullptr)); auto wkey = ox_malloca(keyLen + 1, char, 0); auto wkeyPtr = wkey.get(); - oxReturnError(handler.fieldCString("", &wkeyPtr, keyLen + 1)); + OX_RETURN_ERROR(handler.fieldCString("", &wkeyPtr, keyLen + 1)); return handler.field("", &val[wkeyPtr]); }; for (std::size_t i = 0; i < len; ++i) { - oxReturnError(loopBody(handler, *val)); + OX_RETURN_ERROR(loopBody(handler, *val)); } } } ++m_field; - return OxError(0); + return ox::Error(0); } template @@ -266,11 +266,11 @@ constexpr Error MetalClawReaderTemplate::field(const char *name, T *val) if (!m_unionIdx.has_value() || static_cast(*m_unionIdx) == m_field) { // set size of val if the field is present, don't worry about it if not if (m_fieldPresence.get(static_cast(m_field))) { - oxRequire(len, arrayLength(name, false)); - oxReturnError(ox::resizeVector(*val, len)); + OX_REQUIRE(len, arrayLength(name, false)); + OX_RETURN_ERROR(ox::resizeVector(*val, len)); return field(name, val->data(), val->size()); } - oxReturnError(ox::resizeVector(*val, 0)); + OX_RETURN_ERROR(ox::resizeVector(*val, 0)); } ++m_field; return {}; @@ -278,9 +278,9 @@ constexpr Error MetalClawReaderTemplate::field(const char *name, T *val) if (!m_unionIdx.has_value() || static_cast(*m_unionIdx) == m_field) { // set size of val if the field is present, don't worry about it if not if (m_fieldPresence.get(static_cast(m_field))) { - oxRequire(len, arrayLength(name, false)); + OX_REQUIRE(len, arrayLength(name, false)); if (len > val->size()) { - return OxError(1, "Input array is too long"); + return ox::Error(1, "Input array is too long"); } } return field(name, val->data(), val->size()); @@ -291,7 +291,7 @@ constexpr Error MetalClawReaderTemplate::field(const char *name, T *val) if ((!m_unionIdx.has_value() || static_cast(*m_unionIdx) == m_field) && val) { if (m_fieldPresence.get(static_cast(m_field))) { auto reader = child(""); - oxReturnError(model(reader.interface(), val)); + OX_RETURN_ERROR(model(reader.interface(), val)); } } ++m_field; @@ -305,7 +305,7 @@ constexpr Error MetalClawReaderTemplate::field(const char*, UnionView(*m_unionIdx) == m_field) && val.get()) { if (m_fieldPresence.get(static_cast(m_field))) { auto reader = child("", ox::Optional(ox::in_place, val.idx())); - oxReturnError(model(reader.interface(), val.get())); + OX_RETURN_ERROR(model(reader.interface(), val.get())); } } ++m_field; @@ -319,18 +319,18 @@ constexpr Error MetalClawReaderTemplate::field(const char*, BasicString< if (m_fieldPresence.get(static_cast(m_field))) { // read the length std::size_t bytesRead = 0; - oxRequire(size, mc::decodeInteger(m_reader, &bytesRead)); + OX_REQUIRE(size, mc::decodeInteger(m_reader, &bytesRead)); const auto cap = size; *val = BasicString(cap); auto data = val->data(); // read the string - oxReturnError(m_reader.read(data, size)); + OX_RETURN_ERROR(m_reader.read(data, size)); } else { *val = ""; } } ++m_field; - return OxError(0); + return ox::Error(0); } template @@ -340,12 +340,12 @@ constexpr Error MetalClawReaderTemplate::field(const char*, IString * if (m_fieldPresence.get(static_cast(m_field))) { // read the length std::size_t bytesRead = 0; - oxRequire(size, mc::decodeInteger(m_reader, &bytesRead)); + OX_REQUIRE(size, mc::decodeInteger(m_reader, &bytesRead)); *val = IString(); - oxReturnError(val->resize(size)); + OX_RETURN_ERROR(val->resize(size)); auto const data = val->data(); // read the string - oxReturnError(m_reader.read(data, size)); + OX_RETURN_ERROR(m_reader.read(data, size)); } else { *val = ""; } @@ -359,18 +359,18 @@ constexpr Error MetalClawReaderTemplate::fieldCString(const char*, char if (m_fieldPresence.get(static_cast(m_field))) { // read the length std::size_t bytesRead = 0; - oxRequire(size, mc::decodeInteger(m_reader, &bytesRead)); + OX_REQUIRE(size, mc::decodeInteger(m_reader, &bytesRead)); if (size > buffLen) { - return OxError(McOutputBuffEnded); + return ox::Error(McOutputBuffEnded); } // re-allocate in case too small auto data = val; // read the string - oxReturnError(m_reader.read(data, size)); + OX_RETURN_ERROR(m_reader.read(data, size)); data[size] = 0; } ++m_field; - return OxError(0); + return ox::Error(0); } template @@ -378,17 +378,17 @@ constexpr Error MetalClawReaderTemplate::fieldCString(const char*, char if (m_fieldPresence.get(static_cast(m_field))) { // read the length std::size_t bytesRead = 0; - oxRequire(size, mc::decodeInteger(m_reader, &bytesRead)); + OX_REQUIRE(size, mc::decodeInteger(m_reader, &bytesRead)); // re-allocate in case too small safeDelete(*val); *val = new char[size + 1]; auto data = ox::Span{*val, size + 1}; // read the string - oxReturnError(m_reader.read(data.data(), size)); + OX_RETURN_ERROR(m_reader.read(data.data(), size)); data[size] = 0; } ++m_field; - return OxError(0); + return ox::Error(0); } template @@ -397,7 +397,7 @@ constexpr Error MetalClawReaderTemplate::fieldCString(const char*, char if (m_fieldPresence.get(static_cast(m_field))) { // read the length std::size_t bytesRead = 0; - oxRequire(size, mc::decodeInteger(m_reader, &bytesRead)); + OX_REQUIRE(size, mc::decodeInteger(m_reader, &bytesRead)); // re-allocate if too small if (buffLen < size + 1) { safeDelete(*val); @@ -406,7 +406,7 @@ constexpr Error MetalClawReaderTemplate::fieldCString(const char*, char } auto data = ox::Span{*val, size + 1}; // read the string - oxReturnError(m_reader.read(data.data(), size)); + OX_RETURN_ERROR(m_reader.read(data.data(), size)); data[size] = 0; } else { auto data = *val; @@ -416,7 +416,7 @@ constexpr Error MetalClawReaderTemplate::fieldCString(const char*, char } } ++m_field; - return OxError(0); + return ox::Error(0); } template @@ -425,15 +425,15 @@ constexpr Result MetalClawReaderTemplate::arrayLength(const if (m_fieldPresence.get(static_cast(m_field))) { // read the length std::size_t bytesRead = 0; - oxRequire(g, m_reader.tellg()); - oxRequire(out, mc::decodeInteger(m_reader, &bytesRead)); + OX_REQUIRE(g, m_reader.tellg()); + OX_REQUIRE(out, mc::decodeInteger(m_reader, &bytesRead)); if (!pass) { - oxReturnError(m_reader.seekg(g)); + OX_RETURN_ERROR(m_reader.seekg(g)); } return out; } } - return OxError(1); + return ox::Error(1); } template @@ -443,7 +443,7 @@ constexpr Result MetalClawReaderTemplate::stringLength(con // read the length std::size_t bytesRead = 0; auto len = mc::decodeInteger(m_reader, &bytesRead); - oxReturnError(m_reader.seekg(-static_cast(bytesRead), ox::ios_base::cur)); + OX_RETURN_ERROR(m_reader.seekg(-static_cast(bytesRead), ox::ios_base::cur)); return len; } } @@ -457,14 +457,14 @@ constexpr Error MetalClawReaderTemplate::readInteger(I *val) noexcept { if (m_fieldPresence.get(static_cast(m_field))) { std::size_t bytesRead = 0; auto const result = mc::decodeInteger(m_reader, &bytesRead); - oxReturnError(result); + OX_RETURN_ERROR(result); *val = result.value; } else { *val = 0; } } ++m_field; - return OxError(0); + return ox::Error(0); } template @@ -474,20 +474,20 @@ constexpr Error MetalClawReaderTemplate::field(const char*, CB cb) noexc if (m_fieldPresence.get(static_cast(m_field))) { // read the length std::size_t bytesRead = 0; - oxRequire(len, mc::decodeInteger(m_reader, &bytesRead)); + OX_REQUIRE(len, mc::decodeInteger(m_reader, &bytesRead)); // read the list auto reader = child(""); auto &handler = *reader.interface(); - oxReturnError(handler.setTypeInfo("List", 0, {}, static_cast(len))); + OX_RETURN_ERROR(handler.setTypeInfo("List", 0, {}, static_cast(len))); for (std::size_t i = 0; i < len; ++i) { T val; - oxReturnError(handler.field("", &val)); - oxReturnError(cb(i, &val)); + OX_RETURN_ERROR(handler.field("", &val)); + OX_RETURN_ERROR(cb(i, &val)); } } } ++m_field; - return OxError(0); + return ox::Error(0); } template @@ -548,7 +548,7 @@ Error readMC(ox::BufferView buff, T &val) noexcept { template Result readMC(ox::BufferView buff) noexcept { Result val; - oxReturnError(readMC(buff, val.value)); + OX_RETURN_ERROR(readMC(buff, val.value)); return val; } diff --git a/deps/ox/src/ox/mc/test/tests.cpp b/deps/ox/src/ox/mc/test/tests.cpp index 08c4a0f..e795ba3 100644 --- a/deps/ox/src/ox/mc/test/tests.cpp +++ b/deps/ox/src/ox/mc/test/tests.cpp @@ -62,47 +62,47 @@ struct TestStruct { template constexpr ox::Error model(T *io, ox::CommonPtrWith auto *obj) noexcept { - oxReturnError(io->template setTypeInfo()); - oxReturnError(io->field("Bool", &obj->Bool)); - oxReturnError(io->field("Int", &obj->Int)); - oxReturnError(io->fieldCString("CString", &obj->CString)); - return OxError(0); + OX_RETURN_ERROR(io->template setTypeInfo()); + OX_RETURN_ERROR(io->field("Bool", &obj->Bool)); + OX_RETURN_ERROR(io->field("Int", &obj->Int)); + OX_RETURN_ERROR(io->fieldCString("CString", &obj->CString)); + return ox::Error(0); } -oxModelBegin(TestStructNest) - oxModelField(Bool) - oxModelField(Int) - oxModelField(IString) -oxModelEnd() +OX_MODEL_BEGIN(TestStructNest) + OX_MODEL_FIELD(Bool) + OX_MODEL_FIELD(Int) + OX_MODEL_FIELD(IString) +OX_MODEL_END() template constexpr ox::Error model(T *io, ox::CommonPtrWith auto *obj) noexcept { - oxReturnError(io->template setTypeInfo()); - oxReturnError(io->field("Bool", &obj->Bool)); - oxReturnError(io->field("Int", &obj->Int)); - oxReturnError(io->field("Int1", &obj->Int1)); - oxReturnError(io->field("Int2", &obj->Int2)); - oxReturnError(io->field("Int3", &obj->Int3)); - oxReturnError(io->field("Int4", &obj->Int4)); - oxReturnError(io->field("Int5", &obj->Int5)); - oxReturnError(io->field("Int6", &obj->Int6)); - oxReturnError(io->field("Int7", &obj->Int7)); - oxReturnError(io->field("Int8", &obj->Int8)); - oxReturnError(io->field("unionIdx", &obj->unionIdx)); + OX_RETURN_ERROR(io->template setTypeInfo()); + OX_RETURN_ERROR(io->field("Bool", &obj->Bool)); + OX_RETURN_ERROR(io->field("Int", &obj->Int)); + OX_RETURN_ERROR(io->field("Int1", &obj->Int1)); + OX_RETURN_ERROR(io->field("Int2", &obj->Int2)); + OX_RETURN_ERROR(io->field("Int3", &obj->Int3)); + OX_RETURN_ERROR(io->field("Int4", &obj->Int4)); + OX_RETURN_ERROR(io->field("Int5", &obj->Int5)); + OX_RETURN_ERROR(io->field("Int6", &obj->Int6)); + OX_RETURN_ERROR(io->field("Int7", &obj->Int7)); + OX_RETURN_ERROR(io->field("Int8", &obj->Int8)); + OX_RETURN_ERROR(io->field("unionIdx", &obj->unionIdx)); if constexpr(T::opType() == ox::OpType::Reflect) { - oxReturnError(io->field("Union", ox::UnionView{&obj->Union, 0})); + OX_RETURN_ERROR(io->field("Union", ox::UnionView{&obj->Union, 0})); } else { - oxReturnError(io->field("Union", ox::UnionView{&obj->Union, obj->unionIdx})); + OX_RETURN_ERROR(io->field("Union", ox::UnionView{&obj->Union, obj->unionIdx})); } - oxReturnError(io->field("String", &obj->String)); - oxReturnError(io->field("IString", &obj->IString)); - oxReturnError(io->field("List", obj->List, 4)); - oxReturnError(io->field("Vector", &obj->Vector)); - oxReturnError(io->field("Vector2", &obj->Vector2)); - oxReturnError(io->field("Map", &obj->Map)); - oxReturnError(io->field("Struct", &obj->Struct)); - oxReturnError(io->field("EmptyStruct", &obj->EmptyStruct)); - return OxError(0); + OX_RETURN_ERROR(io->field("String", &obj->String)); + OX_RETURN_ERROR(io->field("IString", &obj->IString)); + OX_RETURN_ERROR(io->field("List", obj->List, 4)); + OX_RETURN_ERROR(io->field("Vector", &obj->Vector)); + OX_RETURN_ERROR(io->field("Vector2", &obj->Vector2)); + OX_RETURN_ERROR(io->field("Map", &obj->Map)); + OX_RETURN_ERROR(io->field("Struct", &obj->Struct)); + OX_RETURN_ERROR(io->field("EmptyStruct", &obj->EmptyStruct)); + return ox::Error(0); } std::map tests = { @@ -114,9 +114,9 @@ std::map tests = { // doesn't segfault ox::Array buff; TestStruct ts; - oxReturnError(ox::writeMC(buff.data(), buff.size(), ts)); - oxReturnError(ox::writeMC(ts)); - return OxError(0); + OX_RETURN_ERROR(ox::writeMC(buff.data(), buff.size(), ts)); + OX_RETURN_ERROR(ox::writeMC(ts)); + return ox::Error(0); } }, @@ -176,7 +176,7 @@ std::map tests = { oxAssert(testIn.Struct.Int == testOut.Struct.Int, "Struct.Int value mismatch"); oxAssert(testIn.Struct.IString == testOut.Struct.IString, "Struct.IString value mismatch"); oxAssert(testIn.Struct.Bool == testOut.Struct.Bool, "Struct.Bool value mismatch"); - return OxError(0); + return ox::Error(0); } }, @@ -189,28 +189,28 @@ std::map tests = { static constexpr auto check = [](McInt val, const ox::Vector &expected) { if (val.length != expected.size()) { std::cout << "val.length: " << val.length << ", expected: " << expected.size() << '\n'; - return OxError(1); + return ox::Error(1); } for (std::size_t i = 0; i < expected.size(); i++) { if (expected[i] != val.data[i]) { std::cout << "decoded: " << static_cast(val.data[i]) << ", expected: " << static_cast(expected[i]) << '\n'; std::cout << "decoded: " << i << ": " << static_cast(val.data[i]) << '\n'; - return OxError(1); + return ox::Error(1); } } - return OxError(0); + return ox::Error(0); }; constexpr auto check64 = [](McInt val, auto expected) { if (val.length != 9) { std::cout << "val.length: " << val.length << '\n'; - return OxError(1); + return ox::Error(1); } ox::LittleEndian decoded = *reinterpret_cast(&val.data[1]); if (expected != decoded) { std::cout << "decoded: " << decoded << ", expected: " << expected << '\n'; - return OxError(1); + return ox::Error(1); } - return OxError(0); + return ox::Error(0); }; // signed positive oxAssert(check(encodeInteger(int64_t(1)), {0b000'0001'0}), "Encode 1 fail"); @@ -247,7 +247,7 @@ std::map tests = { // code deduplication oxAssert(check64(encodeInteger(MaxValue), MaxValue), "Encode MaxValue fail"); oxAssert(check64(encodeInteger(MaxValue), MaxValue), "Encode MaxValue fail"); - return OxError(0); + return ox::Error(0); } }, @@ -260,12 +260,12 @@ std::map tests = { using ox::mc::decodeInteger; static constexpr auto check = [](auto val) { auto result = decodeInteger(encodeInteger(val)); - oxReturnError(result.error); + OX_RETURN_ERROR(result.error); if (result.value != val) { std::cout << "Bad value: " << result.value << ", expected: " << val << '\n'; - return OxError(1); + return ox::Error(1); } - return OxError(0); + return ox::Error(0); }; oxAssert(check(uint32_t(14)), "Decode of 14 failed."); oxAssert(check(int8_t(-1)), "Decode of -1 failed."); @@ -291,7 +291,7 @@ std::map tests = { oxAssert(check(0xffffffff), "Decode of 0xffffffff failed."); oxAssert(check(0xffffffffffff), "Decode of 0xffffffffffff failed."); oxAssert(check(0xffffffffffffffff), "Decode of U64 max failed."); - return OxError(0); + return ox::Error(0); } }, @@ -319,7 +319,7 @@ std::map tests = { const auto [type, typeErr] = ox::buildTypeDef(typeStore, testIn); oxAssert(typeErr, "Descriptor write failed"); ox::ModelObject testOut; - oxReturnError(testOut.setType(type)); + OX_RETURN_ERROR(testOut.setType(type)); oxAssert(ox::readMC(dataBuff, testOut), "Data read failed"); oxAssert(testOut.at("Int").unwrap()->get() == testIn.Int, "testOut.Int failed"); oxAssert(testOut.at("Bool").unwrap()->get() == testIn.Bool, "testOut.Bool failed"); @@ -344,7 +344,7 @@ std::map tests = { oxAssert(testOutStructCopy.at("IString").unwrap()->get() == testIn.Struct.IString.c_str(), "testOut.Struct.IString (copy) failed"); oxAssert(testOutListCopy[0].get() == testIn.List[0], "testOut.Struct.List[0] (copy) failed"); oxAssert(testOutListCopy[1].get() == testIn.List[1], "testOut.Struct.List[1] (copy) failed"); - return OxError(0); + return ox::Error(0); } }, @@ -371,7 +371,7 @@ std::map tests = { const auto [type, typeErr] = ox::buildTypeDef(typeStore, testIn); oxAssert(typeErr, "Descriptor write failed"); ox::BufferReader br({dataBuff, dataBuffLen}); - oxReturnError(ox::walkModel(type, br, + OX_RETURN_ERROR(ox::walkModel(type, br, [](const ox::Vector&, const ox::Vector&, const ox::DescriptorField &f, ox::MetalClawReader *rdr) -> ox::Error { //std::cout << f.fieldName.c_str() << '\n'; auto fieldName = f.fieldName.c_str(); @@ -454,10 +454,10 @@ std::map tests = { case ox::PrimitiveType::Union: break; } - return OxError(0); + return ox::Error(0); } )); - return OxError(0); + return ox::Error(0); } }, } diff --git a/deps/ox/src/ox/mc/write.hpp b/deps/ox/src/ox/mc/write.hpp index b63480e..cfc1a58 100644 --- a/deps/ox/src/ox/mc/write.hpp +++ b/deps/ox/src/ox/mc/write.hpp @@ -117,12 +117,12 @@ class MetalClawWriter { bool fieldSet = false; if (val && (!m_unionIdx.has_value() || *m_unionIdx == m_field)) { auto mi = mc::encodeInteger(val); - oxReturnError(m_writer.write(reinterpret_cast(mi.data.data()), mi.length)); + OX_RETURN_ERROR(m_writer.write(reinterpret_cast(mi.data.data()), mi.length)); fieldSet = true; } - oxReturnError(m_fieldPresence.set(static_cast(m_field), fieldSet)); + OX_RETURN_ERROR(m_fieldPresence.set(static_cast(m_field), fieldSet)); ++m_field; - return OxError(0); + return ox::Error(0); } }; @@ -181,10 +181,10 @@ constexpr Error MetalClawWriter::field(const char*, const uint64_t *val) template constexpr Error MetalClawWriter::field(const char*, const bool *val) noexcept { if (!m_unionIdx.has_value() || *m_unionIdx == m_field) { - oxReturnError(m_fieldPresence.set(static_cast(m_field), *val)); + OX_RETURN_ERROR(m_fieldPresence.set(static_cast(m_field), *val)); } ++m_field; - return OxError(0); + return ox::Error(0); } template @@ -194,14 +194,14 @@ constexpr Error MetalClawWriter::field(const char*, const BasicStringlen() && (!m_unionIdx.has_value() || *m_unionIdx == m_field)) { // write the length const auto strLen = mc::encodeInteger(val->len()); - oxReturnError(m_writer.write(reinterpret_cast(strLen.data.data()), strLen.length)); + OX_RETURN_ERROR(m_writer.write(reinterpret_cast(strLen.data.data()), strLen.length)); // write the string - oxReturnError(m_writer.write(val->c_str(), static_cast(val->len()))); + OX_RETURN_ERROR(m_writer.write(val->c_str(), static_cast(val->len()))); fieldSet = true; } - oxReturnError(m_fieldPresence.set(static_cast(m_field), fieldSet)); + OX_RETURN_ERROR(m_fieldPresence.set(static_cast(m_field), fieldSet)); ++m_field; - return OxError(0); + return ox::Error(0); } template @@ -217,14 +217,14 @@ constexpr Error MetalClawWriter::fieldCString(const char*, const char *c const auto strLen = *val ? ox::strlen(*val) : 0; // write the length const auto strLenBuff = mc::encodeInteger(strLen); - oxReturnError(m_writer.write(reinterpret_cast(strLenBuff.data.data()), strLenBuff.length)); + OX_RETURN_ERROR(m_writer.write(reinterpret_cast(strLenBuff.data.data()), strLenBuff.length)); // write the string - oxReturnError(m_writer.write(*val, static_cast(strLen))); + OX_RETURN_ERROR(m_writer.write(*val, static_cast(strLen))); fieldSet = true; } - oxReturnError(m_fieldPresence.set(static_cast(m_field), fieldSet)); + OX_RETURN_ERROR(m_fieldPresence.set(static_cast(m_field), fieldSet)); ++m_field; - return OxError(0); + return ox::Error(0); } template @@ -243,14 +243,14 @@ constexpr Error MetalClawWriter::fieldCString(const char*, const char *v if (strLen && (!m_unionIdx.has_value() || *m_unionIdx == m_field)) { // write the length const auto strLenBuff = mc::encodeInteger(strLen); - oxReturnError(m_writer.write(reinterpret_cast(strLenBuff.data.data()), strLenBuff.length)); + OX_RETURN_ERROR(m_writer.write(reinterpret_cast(strLenBuff.data.data()), strLenBuff.length)); // write the string - oxReturnError(m_writer.write(val, static_cast(strLen))); + OX_RETURN_ERROR(m_writer.write(val, static_cast(strLen))); fieldSet = true; } - oxReturnError(m_fieldPresence.set(static_cast(m_field), fieldSet)); + OX_RETURN_ERROR(m_fieldPresence.set(static_cast(m_field), fieldSet)); ++m_field; - return OxError(0); + return ox::Error(0); } template @@ -264,11 +264,11 @@ constexpr Error MetalClawWriter::field(const char*, const T *val) noexce auto const writeIdx = m_writer.tellp(); MetalClawWriter writer(m_writer); ModelHandlerInterface> handler{&writer}; - oxReturnError(model(&handler, val)); - oxReturnError(writer.finalize()); + OX_RETURN_ERROR(model(&handler, val)); + OX_RETURN_ERROR(writer.finalize()); fieldSet = writeIdx != m_writer.tellp(); } - oxReturnError(m_fieldPresence.set(static_cast(m_field), fieldSet)); + OX_RETURN_ERROR(m_fieldPresence.set(static_cast(m_field), fieldSet)); ++m_field; return {}; } @@ -282,11 +282,11 @@ constexpr Error MetalClawWriter::field(const char*, UnionView auto const writeIdx = m_writer.tellp(); MetalClawWriter writer(m_writer, ox::Optional(ox::in_place, val.idx())); ModelHandlerInterface handler{&writer}; - oxReturnError(model(&handler, val.get())); - oxReturnError(writer.finalize()); + OX_RETURN_ERROR(model(&handler, val.get())); + OX_RETURN_ERROR(writer.finalize()); fieldSet = writeIdx != m_writer.tellp(); } - oxReturnError(m_fieldPresence.set(static_cast(m_field), fieldSet)); + OX_RETURN_ERROR(m_fieldPresence.set(static_cast(m_field), fieldSet)); ++m_field; return {}; } @@ -298,23 +298,23 @@ constexpr Error MetalClawWriter::field(const char*, const T *val, std::s if (len && (!m_unionIdx.has_value() || *m_unionIdx == m_field)) { // write the length const auto arrLen = mc::encodeInteger(len); - oxReturnError(m_writer.write(reinterpret_cast(arrLen.data.data()), arrLen.length)); + OX_RETURN_ERROR(m_writer.write(reinterpret_cast(arrLen.data.data()), arrLen.length)); auto const writeIdx = m_writer.tellp(); MetalClawWriter writer(m_writer); ModelHandlerInterface handler{&writer}; - oxReturnError(handler.template setTypeInfo("List", 0, {}, static_cast(len))); + OX_RETURN_ERROR(handler.template setTypeInfo("List", 0, {}, static_cast(len))); // write the array for (std::size_t i = 0; i < len; ++i) { OX_ALLOW_UNSAFE_BUFFERS_BEGIN - oxReturnError(handler.field("", &val[i])); + OX_RETURN_ERROR(handler.field("", &val[i])); OX_ALLOW_UNSAFE_BUFFERS_END } - oxReturnError(writer.finalize()); + OX_RETURN_ERROR(writer.finalize()); fieldSet = writeIdx != m_writer.tellp(); } - oxReturnError(m_fieldPresence.set(static_cast(m_field), fieldSet)); + OX_RETURN_ERROR(m_fieldPresence.set(static_cast(m_field), fieldSet)); ++m_field; - return OxError(0); + return ox::Error(0); } template @@ -326,32 +326,32 @@ constexpr Error MetalClawWriter::field(const char*, const HashMap(arrLen.data.data()), arrLen.length)); + OX_RETURN_ERROR(m_writer.write(reinterpret_cast(arrLen.data.data()), arrLen.length)); // write map MetalClawWriter writer(m_writer); ModelHandlerInterface handler{&writer}; // double len for both key and value - oxReturnError(handler.setTypeInfo("Map", 0, {}, len * 2)); + OX_RETURN_ERROR(handler.setTypeInfo("Map", 0, {}, len * 2)); // this loop body needs to be in a lambda because of the potential alloca call constexpr auto loopBody = [](auto &handler, auto const&key, auto const&val) -> ox::Error { const auto keyLen = key.len(); auto wkey = ox_malloca(keyLen + 1, char, 0); memcpy(wkey.get(), key.c_str(), keyLen + 1); - oxReturnError(handler.fieldCString("", wkey.get(), keyLen)); - oxRequireM(value, val.at(key)); + OX_RETURN_ERROR(handler.fieldCString("", wkey.get(), keyLen)); + OX_REQUIRE_M(value, val.at(key)); return handler.field("", value); }; // write the array for (std::size_t i = 0; i < len; ++i) { auto const&key = keys[i]; - oxReturnError(loopBody(handler, key, *val)); + OX_RETURN_ERROR(loopBody(handler, key, *val)); } - oxReturnError(writer.finalize()); + OX_RETURN_ERROR(writer.finalize()); fieldSet = true; } - oxReturnError(m_fieldPresence.set(static_cast(m_field), fieldSet)); + OX_RETURN_ERROR(m_fieldPresence.set(static_cast(m_field), fieldSet)); ++m_field; - return OxError(0); + return ox::Error(0); } template @@ -362,7 +362,7 @@ constexpr ox::Error MetalClawWriter::setTypeInfo( const Vector&, std::size_t fields) noexcept { const auto fieldPresenceLen = (fields - 1) / 8 + 1; - oxReturnError(m_writer.write(nullptr, fieldPresenceLen)); + OX_RETURN_ERROR(m_writer.write(nullptr, fieldPresenceLen)); m_presenceMapBuff.resize(fieldPresenceLen); m_fieldPresence.setBuffer(m_presenceMapBuff.data(), m_presenceMapBuff.size()); m_fieldPresence.setFields(static_cast(fields)); @@ -372,33 +372,33 @@ constexpr ox::Error MetalClawWriter::setTypeInfo( template ox::Error MetalClawWriter::finalize() noexcept { const auto end = m_writer.tellp(); - oxReturnError(m_writer.seekp(m_writerBeginP)); - oxReturnError(m_writer.write( + OX_RETURN_ERROR(m_writer.seekp(m_writerBeginP)); + OX_RETURN_ERROR(m_writer.write( reinterpret_cast(m_presenceMapBuff.data()), m_presenceMapBuff.size())); - oxReturnError(m_writer.seekp(end)); + OX_RETURN_ERROR(m_writer.seekp(end)); return {}; } Result writeMC(Writer_c auto &writer, const auto &val) noexcept { MetalClawWriter mcWriter(writer); ModelHandlerInterface handler{&mcWriter}; - oxReturnError(model(&handler, &val)); - oxReturnError(mcWriter.finalize()); + OX_RETURN_ERROR(model(&handler, &val)); + OX_RETURN_ERROR(mcWriter.finalize()); return {}; } Result writeMC(auto const&val, std::size_t buffReserveSz = 2 * units::KB) noexcept { Buffer buff(buffReserveSz); BufferWriter bw(&buff, 0); - oxReturnError(writeMC(bw, val)); + OX_RETURN_ERROR(writeMC(bw, val)); buff.resize(bw.tellp()); return buff; } Error writeMC(char *buff, std::size_t buffLen, auto const&val, std::size_t *sizeOut = nullptr) noexcept { CharBuffWriter bw{{buff, buffLen}}; - oxReturnError(writeMC(bw, val)); + OX_RETURN_ERROR(writeMC(bw, val)); if (sizeOut) { *sizeOut = bw.tellp(); } diff --git a/deps/ox/src/ox/model/def.hpp b/deps/ox/src/ox/model/def.hpp index f4f042f..0599ebd 100644 --- a/deps/ox/src/ox/model/def.hpp +++ b/deps/ox/src/ox/model/def.hpp @@ -11,9 +11,9 @@ #include // oxModelFwdDecl is necessary because Apple-Clang is broken... -#define oxModelFwdDecl(modelName) constexpr ox::Error model(auto *io, ox::CommonPtrWith auto *o) noexcept -#define oxModelBegin(modelName) constexpr ox::Error model(auto *io, [[maybe_unused]] ox::CommonPtrWith auto *o) noexcept { oxReturnError(io->template setTypeInfo()); -#define oxModelEnd() return OxError(0); } -#define oxModelField(fieldName) oxReturnError(io->field(#fieldName, &o->fieldName)); -#define oxModelFieldRename(objFieldName, serFieldName) oxReturnError(io->field(#serFieldName, &o->objFieldName)); -#define oxModelFriend(modelName) friend constexpr ox::Error model(auto *io, ox::CommonPtrWith auto *o) noexcept +#define OX_MODEL_FWD_DECL(modelName) constexpr ox::Error model(auto *io, ox::CommonPtrWith auto *o) noexcept +#define OX_MODEL_BEGIN(modelName) constexpr ox::Error model(auto *io, [[maybe_unused]] ox::CommonPtrWith auto *o) noexcept { OX_RETURN_ERROR(io->template setTypeInfo()); +#define OX_MODEL_END() return ox::Error(0); } +#define OX_MODEL_FIELD(fieldName) OX_RETURN_ERROR(io->field(#fieldName, &o->fieldName)); +#define OX_MODEL_FIELD_RENAME(objFieldName, serFieldName) OX_RETURN_ERROR(io->field(#serFieldName, &o->objFieldName)); +#define OX_MODEL_FRIEND(modelName) friend constexpr ox::Error model(auto *io, ox::CommonPtrWith auto *o) noexcept diff --git a/deps/ox/src/ox/model/desctypes.hpp b/deps/ox/src/ox/model/desctypes.hpp index 045cc86..f22d2a2 100644 --- a/deps/ox/src/ox/model/desctypes.hpp +++ b/deps/ox/src/ox/model/desctypes.hpp @@ -76,20 +76,20 @@ struct Subscript { template constexpr Error model(T *io, CommonPtrWith auto *type) noexcept { - oxReturnError(io->template setTypeInfo()); + OX_RETURN_ERROR(io->template setTypeInfo()); if constexpr(T::opType() == OpType::Reflect) { uint32_t st = 0; - oxReturnError(io->field("subscriptType", &st)); + OX_RETURN_ERROR(io->field("subscriptType", &st)); } else if constexpr(T::opType() == OpType::Write) { auto pt = type ? static_cast(type->subscriptType) : 0; - oxReturnError(io->field("subscriptType", &pt)); + OX_RETURN_ERROR(io->field("subscriptType", &pt)); } else { auto pt = type ? static_cast(type->subscriptType) : 0; - oxReturnError(io->field("subscriptType", &pt)); + OX_RETURN_ERROR(io->field("subscriptType", &pt)); type->subscriptType = static_cast(pt); } - oxReturnError(io->field("length", &type->length)); - oxReturnError(io->field("smallSzLen", &type->smallSzLen)); + OX_RETURN_ERROR(io->field("length", &type->length)); + OX_RETURN_ERROR(io->field("smallSzLen", &type->smallSzLen)); return {}; } @@ -185,37 +185,37 @@ constexpr auto buildTypeId(const DescriptorType &t) noexcept { template constexpr Error model(T *io, CommonPtrWith auto *type) noexcept { - oxReturnError(io->template setTypeInfo()); - oxReturnError(io->field("typeName", &type->typeName)); - oxReturnError(io->field("typeVersion", &type->typeVersion)); + OX_RETURN_ERROR(io->template setTypeInfo()); + OX_RETURN_ERROR(io->field("typeName", &type->typeName)); + OX_RETURN_ERROR(io->field("typeVersion", &type->typeVersion)); if constexpr(T::opType() == OpType::Reflect) { uint8_t pt = 0; - oxReturnError(io->field("primitiveType", &pt)); + OX_RETURN_ERROR(io->field("primitiveType", &pt)); } else if constexpr(T::opType() == OpType::Write) { auto pt = type ? static_cast(type->primitiveType) : 0; - oxReturnError(io->field("primitiveType", &pt)); + OX_RETURN_ERROR(io->field("primitiveType", &pt)); } else { auto pt = type ? static_cast(type->primitiveType) : 0; - oxReturnError(io->field("primitiveType", &pt)); + OX_RETURN_ERROR(io->field("primitiveType", &pt)); type->primitiveType = static_cast(pt); } - oxReturnError(io->field("typeParams", &type->typeParams)); - oxReturnError(io->field("fieldList", &type->fieldList)); - oxReturnError(io->field("length", &type->length)); - oxReturnError(io->field("preloadable", &type->preloadable)); + OX_RETURN_ERROR(io->field("typeParams", &type->typeParams)); + OX_RETURN_ERROR(io->field("fieldList", &type->fieldList)); + OX_RETURN_ERROR(io->field("length", &type->length)); + OX_RETURN_ERROR(io->field("preloadable", &type->preloadable)); return {}; } template constexpr Error model(T *io, CommonPtrWith auto *field) noexcept { - oxReturnError(io->template setTypeInfo()); - oxReturnError(io->field("typeId", &field->typeId)); - oxReturnError(io->field("fieldName", &field->fieldName)); - oxReturnError(io->field("subscriptLevels", &field->subscriptLevels)); - oxReturnError(io->field("subscriptStack", &field->subscriptStack)); + OX_RETURN_ERROR(io->template setTypeInfo()); + OX_RETURN_ERROR(io->field("typeId", &field->typeId)); + OX_RETURN_ERROR(io->field("fieldName", &field->fieldName)); + OX_RETURN_ERROR(io->field("subscriptLevels", &field->subscriptLevels)); + OX_RETURN_ERROR(io->field("subscriptStack", &field->subscriptStack)); // defaultValue is unused now, but leave placeholder for backwards compatibility int defaultValue = 0; - oxReturnError(io->field("defaultValue", &defaultValue)); + OX_RETURN_ERROR(io->field("defaultValue", &defaultValue)); return {}; } @@ -244,7 +244,7 @@ constexpr Error model(TypeDescReader *io, CommonPtrWith auto // defaultValue is unused now, but placeholder for backwards compatibility int defaultValue = 0; oxReturnError(io->field("defaultValue", &defaultValue)); - return OxError(0); + return ox::Error(0); } #endif diff --git a/deps/ox/src/ox/model/descwrite.hpp b/deps/ox/src/ox/model/descwrite.hpp index 8e50f50..290d586 100644 --- a/deps/ox/src/ox/model/descwrite.hpp +++ b/deps/ox/src/ox/model/descwrite.hpp @@ -205,9 +205,9 @@ constexpr Error TypeDescWriter::field(StringViewCR name, T const*, std::size_t, const auto t = type(p); oxAssert(t != nullptr, "field(const char *name, T *val, std::size_t): Type not found or generated"); m_type->fieldList.emplace_back(t, String(name), detail::indirectionLevels_v + 1, subscriptStack, buildTypeId(*t)); - return OxError(0); + return ox::Error(0); } - return OxError(1); + return ox::Error(1); } // array handler @@ -220,9 +220,9 @@ constexpr Error TypeDescWriter::field(StringViewCR name, T const*, std::size_t) auto const lvls = detail::indirectionLevels_v + 1; SubscriptStack subscriptStack{lvls}; m_type->fieldList.emplace_back(t, String(name), lvls, subscriptStack, buildTypeId(*t)); - return OxError(0); + return ox::Error(0); } - return OxError(1); + return ox::Error(1); } template @@ -231,9 +231,9 @@ constexpr Error TypeDescWriter::field(StringViewCR name, UnionView val const auto t = type(val); oxAssert(t != nullptr, "field(const char *name, T val): Type not found or generated"); m_type->fieldList.emplace_back(t, String(name), 0, SubscriptStack{}, ox::String(t->typeName)); - return OxError(0); + return ox::Error(0); } - return OxError(1); + return ox::Error(1); } template @@ -254,7 +254,7 @@ constexpr Error TypeDescWriter::field(StringViewCR name, const T *val) noexcept return {}; } } - return OxError(1); + return ox::Error(1); } template @@ -384,11 +384,11 @@ constexpr Result buildTypeDef(TypeStore &typeStore) noexcept { if (std::is_constant_evaluated()) { std::allocator a; T *t = a.allocate(1); - oxReturnError(model(&handler, t)); + OX_RETURN_ERROR(model(&handler, t)); a.deallocate(t, 1); } else { auto t = ox_malloca(sizeof(T), T); - oxReturnError(model(&handler, t.get())); + OX_RETURN_ERROR(model(&handler, t.get())); } return writer.definition(); } @@ -397,7 +397,7 @@ template constexpr Result buildTypeDef(TypeStore &typeStore, T &val) noexcept { TypeDescWriter writer(&typeStore); ModelHandlerInterface handler(&writer); - oxReturnError(model(&handler, &val)); + OX_RETURN_ERROR(model(&handler, &val)); return writer.definition(); } diff --git a/deps/ox/src/ox/model/fieldcounter.hpp b/deps/ox/src/ox/model/fieldcounter.hpp index 55bd25f..b39397d 100644 --- a/deps/ox/src/ox/model/fieldcounter.hpp +++ b/deps/ox/src/ox/model/fieldcounter.hpp @@ -31,25 +31,25 @@ class FieldCounter { template constexpr ox::Error field(StringViewCR, U) noexcept { ++fields; - return OxError(0); + return ox::Error(0); } template constexpr ox::Error field(StringViewCR, U, std::size_t) noexcept { ++fields; - return OxError(0); + return ox::Error(0); } template constexpr Error field(StringViewCR, Handler) { ++fields; - return OxError(0); + return ox::Error(0); } template constexpr Error fieldCString(Args&&...) noexcept { ++fields; - return OxError(0); + return ox::Error(0); } static constexpr auto opType() noexcept { diff --git a/deps/ox/src/ox/model/modelhandleradaptor.hpp b/deps/ox/src/ox/model/modelhandleradaptor.hpp index 854c541..2853b75 100644 --- a/deps/ox/src/ox/model/modelhandleradaptor.hpp +++ b/deps/ox/src/ox/model/modelhandleradaptor.hpp @@ -135,8 +135,8 @@ class ModelHandlerInterface { return m_handler->field(name, &v->template get()); } oxErrf("invalid type: {}: {}\n", name, static_cast(v->type())); - oxPanic(OxError(1), "invalid type"); - return OxError(1, "invalid type"); + oxPanic(ox::Error(1), "invalid type"); + return ox::Error(1, "invalid type"); } // array handler, with callback to allow handling individual elements diff --git a/deps/ox/src/ox/model/modelops.hpp b/deps/ox/src/ox/model/modelops.hpp index e8c4ad0..f40f678 100644 --- a/deps/ox/src/ox/model/modelops.hpp +++ b/deps/ox/src/ox/model/modelops.hpp @@ -56,19 +56,19 @@ class MemberList { template constexpr Error field(const char*, T *v) noexcept { vars[m_i++] = static_cast(v); - return OxError(0); + return ox::Error(0); } template constexpr Error field(const char*, T *v, int) noexcept { vars[m_i++] = static_cast(v); - return OxError(0); + return ox::Error(0); } template constexpr Error field(const char*, UnionView u) noexcept { vars[m_i++] = static_cast(u.get()); - return OxError(0); + return ox::Error(0); } template @@ -107,7 +107,7 @@ class Copier { auto &dst = *cbit_cast(m_dst->vars[m_i]); dst = src; ++m_i; - return OxError(0); + return ox::Error(0); } } @@ -119,7 +119,7 @@ class Copier { dst = src; } ++m_i; - return OxError(0); + return ox::Error(0); } template @@ -128,7 +128,7 @@ class Copier { auto &src = *u.get(); dst = src; ++m_i; - return OxError(0); + return ox::Error(0); } template @@ -168,7 +168,7 @@ class Mover { dst = std::move(src); src = FT{}; ++m_i; - return OxError(0); + return ox::Error(0); } } @@ -181,7 +181,7 @@ class Mover { src = FT{}; } ++m_i; - return OxError(0); + return ox::Error(0); } template @@ -190,7 +190,7 @@ class Mover { auto &src = *u.get(); dst = std::move(src); ++m_i; - return OxError(0); + return ox::Error(0); } template @@ -228,10 +228,10 @@ class Equals { const auto &dst = std::bit_cast(*m_other->vars[m_i]); ++m_i; if (dst == src) { - return OxError(0); + return ox::Error(0); } else { this->value = false; - return OxError(1); + return ox::Error(1); } } @@ -242,11 +242,11 @@ class Equals { const auto &dst = cbit_cast(m_other->vars[m_i])[i]; if (!(dst == src)) { this->value = false; - return OxError(1); + return ox::Error(1); } } ++m_i; - return OxError(0); + return ox::Error(0); } template @@ -255,10 +255,10 @@ class Equals { const auto &src = *u.get(); ++m_i; if (dst == src) { - return OxError(0); + return ox::Error(0); } else { this->value = false; - return OxError(1); + return ox::Error(1); } } diff --git a/deps/ox/src/ox/model/modelvalue.cpp b/deps/ox/src/ox/model/modelvalue.cpp index 9adf591..839ac71 100644 --- a/deps/ox/src/ox/model/modelvalue.cpp +++ b/deps/ox/src/ox/model/modelvalue.cpp @@ -12,12 +12,12 @@ namespace ox { static_assert([]() -> ox::Error { ox::ModelValue v; - oxReturnError(v.setType()); + OX_RETURN_ERROR(v.setType()); if (v.type() != ModelValue::Type::SignedInteger32) { - return OxError(1, "type is wrong"); + return ox::Error(1, "type is wrong"); } //oxReturnError(v.set(5)); return {}; -}() == OxError(0)); +}() == ox::Error(0)); } diff --git a/deps/ox/src/ox/model/modelvalue.hpp b/deps/ox/src/ox/model/modelvalue.hpp index 84dc58b..7b17862 100644 --- a/deps/ox/src/ox/model/modelvalue.hpp +++ b/deps/ox/src/ox/model/modelvalue.hpp @@ -168,7 +168,7 @@ class ModelValue { constexpr const auto &get() const noexcept { constexpr auto type = getType(); if (m_type != type) [[unlikely]] { - oxPanic(OxError(1), "invalid cast"); + oxPanic(ox::Error(1), "invalid cast"); } return getValue(*this); } @@ -178,7 +178,7 @@ class ModelValue { constexpr auto &get() noexcept { constexpr auto type = getType(); if (m_type != type) [[unlikely]] { - oxPanic(OxError(1), "invalid cast"); + oxPanic(ox::Error(1), "invalid cast"); } return getValue(*this); } @@ -242,7 +242,7 @@ class ModelValueArray { m_vec.resize(sz); if (sz > oldSz) { for (auto i = oldSz; i < sz; ++i) { - oxReturnError(m_vec[i].setType(m_type, m_subscriptStack, m_typeSubscriptLevels)); + OX_RETURN_ERROR(m_vec[i].setType(m_type, m_subscriptStack, m_typeSubscriptLevels)); } } return {}; @@ -401,7 +401,7 @@ class ModelValueVector { m_vec.resize(sz); if (sz > oldSz) { for (auto i = oldSz; i < sz; ++i) { - oxReturnError(m_vec[i].setType(m_type, m_subscriptStack, m_typeSubscriptLevels)); + OX_RETURN_ERROR(m_vec[i].setType(m_type, m_subscriptStack, m_typeSubscriptLevels)); } } return {}; @@ -519,7 +519,7 @@ class ModelObject { ModelValue value; }; protected: - oxModelFriend(ModelObject); + OX_MODEL_FRIEND(ModelObject); friend ModelValue; Vector> m_fieldsOrder; HashMap m_fields; @@ -634,18 +634,18 @@ class ModelObject { if (m_fields.contains(k)) { return *m_fields.at(k).value; } - return OxError(1); + return ox::Error(1); } template constexpr Error set(const String &k, T &&val) noexcept { - oxRequire(t, m_fields.at(k)); + OX_REQUIRE(t, m_fields.at(k)); *t = ox::forward(val); return {}; } constexpr ox::Result at(StringView const&k) noexcept { - oxRequire(v, m_fields.at(k)); + OX_REQUIRE(v, m_fields.at(k)); return *v; } @@ -670,13 +670,13 @@ class ModelObject { constexpr Error setType(const DescriptorType *type) noexcept { if (type->primitiveType != PrimitiveType::Struct && type->primitiveType != PrimitiveType::Union) { - return OxError(1, "Cannot load a non-struct type to ModelObject"); + return ox::Error(1, "Cannot load a non-struct type to ModelObject"); } m_type = type; for (const auto &f : type->fieldList) { auto field = make_unique(); field->name = f.fieldName; - oxReturnError(field->value.setType(f.type, f.subscriptStack, f.subscriptLevels)); + OX_RETURN_ERROR(field->value.setType(f.type, f.subscriptStack, f.subscriptLevels)); m_fields[field->name] = &field->value; m_fieldsOrder.emplace_back(std::move(field)); } @@ -722,7 +722,7 @@ class ModelUnion { static constexpr Result> make(const DescriptorType *type) noexcept { UniquePtr out(new ModelUnion); - oxReturnError(out->setType(type)); + OX_RETURN_ERROR(out->setType(type)); return out; } @@ -731,7 +731,7 @@ class ModelUnion { } constexpr ox::Result at(StringView const&k) noexcept { - oxRequire(v, m_fields.at(k)); + OX_REQUIRE(v, m_fields.at(k)); return &(*v)->value; } @@ -763,7 +763,7 @@ class ModelUnion { [[nodiscard]] constexpr Result get(StringView const&k) const noexcept { - oxRequire(t, m_fields.at(k)); + OX_REQUIRE(t, m_fields.at(k)); return &(*t)->value; } @@ -790,7 +790,7 @@ class ModelUnion { constexpr Error setType(const DescriptorType *type) noexcept { if (type->primitiveType != PrimitiveType::Struct && type->primitiveType != PrimitiveType::Union) { - return OxError(1, "Cannot load a non-struct type to ModelUnion"); + return ox::Error(1, "Cannot load a non-struct type to ModelUnion"); } m_fields.clear(); m_fieldsOrder.clear(); @@ -799,7 +799,7 @@ class ModelUnion { auto field = make_unique(); field->name = f.fieldName; field->idx = i; - oxReturnError(field->value.setType(f.type, SubscriptStack{static_cast(f.subscriptLevels)}, f.subscriptLevels)); + OX_RETURN_ERROR(field->value.setType(f.type, SubscriptStack{static_cast(f.subscriptLevels)}, f.subscriptLevels)); m_fields[field->name] = field.get(); m_fieldsOrder.emplace_back(std::move(field)); ++i; @@ -967,21 +967,21 @@ constexpr std::size_t alignOf(const ModelValue &t) noexcept { } constexpr Error model(auto *h, CommonPtrWith auto *obj) noexcept { - oxReturnError(h->template setTypeInfo( + OX_RETURN_ERROR(h->template setTypeInfo( obj->typeName().c_str(), obj->typeVersion(), {}, obj->m_fieldsOrder.size())); for (auto &f : obj->m_fieldsOrder) { - oxReturnError(h->field(f->name.c_str(), &f->value)); + OX_RETURN_ERROR(h->field(f->name.c_str(), &f->value)); } - return OxError(0); + return ox::Error(0); } constexpr Error model(auto *h, CommonPtrWith auto *obj) noexcept { - oxReturnError(h->template setTypeInfo( + OX_RETURN_ERROR(h->template setTypeInfo( obj->typeName().c_str(), obj->typeVersion(), {}, obj->m_fieldsOrder.size())); for (auto &f : obj->m_fieldsOrder) { - oxReturnError(h->field(f->name.c_str(), &f->value)); + OX_RETURN_ERROR(h->field(f->name.c_str(), &f->value)); } - return OxError(0); + return ox::Error(0); } constexpr ModelValue::ModelValue(const ModelValue &other) noexcept { @@ -1087,12 +1087,12 @@ constexpr Error ModelValue::setType( if (subscript.subscriptType == Subscript::SubscriptType::InlineArray) { m_type = Type::InlineArray; m_data.array = new ModelValueArray; - oxReturnError(m_data.array->setType(type, subscriptStack, subscriptLevels - 1)); - oxReturnError(m_data.array->setSize(static_cast(subscript.length))); + OX_RETURN_ERROR(m_data.array->setType(type, subscriptStack, subscriptLevels - 1)); + OX_RETURN_ERROR(m_data.array->setSize(static_cast(subscript.length))); } else { m_type = Type::Vector; m_data.vec = new ModelValueVector; - oxReturnError(m_data.vec->setType(type, subscriptStack, subscriptLevels - 1)); + OX_RETURN_ERROR(m_data.vec->setType(type, subscriptStack, subscriptLevels - 1)); } return {}; } else if (type->typeName == types::Bool) { @@ -1121,15 +1121,15 @@ constexpr Error ModelValue::setType( } else if (type->primitiveType == PrimitiveType::Struct) { m_type = Type::Object; m_data.obj = new ModelObject; - oxReturnError(m_data.obj->setType(type)); + OX_RETURN_ERROR(m_data.obj->setType(type)); } else if (type->primitiveType == PrimitiveType::Union) { m_type = Type::Union; - oxRequireM(u, ModelUnion::make(type)); + OX_REQUIRE_M(u, ModelUnion::make(type)); m_data.uni = u.release(); - oxReturnError(m_data.uni->setType(type)); + OX_RETURN_ERROR(m_data.uni->setType(type)); } oxAssert(m_type != Type::Undefined, "No type set"); - return OxError(0); + return ox::Error(0); } template @@ -1141,11 +1141,11 @@ constexpr Error ModelValue::setType() noexcept { // rather than using getValue() if constexpr(type == Type::Object) { m_data.obj = new ModelObject; - oxReturnError(m_data.obj->setType(type)); + OX_RETURN_ERROR(m_data.obj->setType(type)); } else if constexpr(type == Type::Union) { - oxRequireM(u, ModelUnion::make(type)); + OX_REQUIRE_M(u, ModelUnion::make(type)); m_data.uni = u.release(); - oxReturnError(m_data.uni->setType(type)); + OX_RETURN_ERROR(m_data.uni->setType(type)); } else if constexpr(type == Type::String) { m_data.str = new String; } else if constexpr(type == Type::Vector) { @@ -1176,7 +1176,7 @@ template constexpr Error ModelValue::set(const T &v) noexcept { constexpr auto type = getType(); if (m_type != type) [[unlikely]] { - return OxError(1, "type mismatch"); + return ox::Error(1, "type mismatch"); } auto &value = getValue(*this); if constexpr(type == Type::Vector || type == Type::Object || @@ -1184,14 +1184,14 @@ constexpr Error ModelValue::set(const T &v) noexcept { safeDelete(&value); } value = v; - return OxError(0); + return ox::Error(0); } template constexpr Error ModelValue::set(T &&v) noexcept { constexpr auto type = getType(); if (m_type != type) [[unlikely]] { - return OxError(1, "type mismatch"); + return ox::Error(1, "type mismatch"); } auto &value = getValue(*this); if constexpr(type == Type::Vector || type == Type::Object || @@ -1199,7 +1199,7 @@ constexpr Error ModelValue::set(T &&v) noexcept { safeDelete(&value); } value = std::move(v); - return OxError(0); + return ox::Error(0); } constexpr ModelValue &ModelValue::operator=(ModelValue &other) noexcept { diff --git a/deps/ox/src/ox/model/test/tests.cpp b/deps/ox/src/ox/model/test/tests.cpp index 610cae9..9aea6bf 100644 --- a/deps/ox/src/ox/model/test/tests.cpp +++ b/deps/ox/src/ox/model/test/tests.cpp @@ -17,8 +17,8 @@ struct TestType { static constexpr auto TypeVersion = 1; }; -oxModelBegin(TestType) -oxModelEnd() +OX_MODEL_BEGIN(TestType) +OX_MODEL_END() struct TestType2 { }; @@ -38,12 +38,12 @@ std::map tests = { "ModelValue", [] { ox::ModelValue v; - oxReturnError(v.setType()); + OX_RETURN_ERROR(v.setType()); //v.m_type = ox::ModelValue::getType(); if (v.type() != ox::ModelValue::Type::SignedInteger32) { - return OxError(1, "type is wrong"); + return ox::Error(1, "type is wrong"); } - oxReturnError(v.set(5)); + OX_RETURN_ERROR(v.set(5)); return ox::Error{}; } }, diff --git a/deps/ox/src/ox/model/typenamecatcher.hpp b/deps/ox/src/ox/model/typenamecatcher.hpp index 0a4b49a..870ae6e 100644 --- a/deps/ox/src/ox/model/typenamecatcher.hpp +++ b/deps/ox/src/ox/model/typenamecatcher.hpp @@ -38,17 +38,17 @@ struct TypeNameCatcher { template constexpr Error field(const char*, T*, std::size_t) noexcept { - return OxError(0); + return ox::Error(0); } template constexpr Error field(const char*, T) noexcept { - return OxError(0); + return ox::Error(0); } template constexpr Error fieldCString(Args&&...) noexcept { - return OxError(0); + return ox::Error(0); } static constexpr auto opType() noexcept { @@ -77,17 +77,17 @@ struct TypeInfoCatcher { template constexpr Error field(const char*, T*, std::size_t) noexcept { - return OxError(0); + return ox::Error(0); } template constexpr Error field(const char*, T) noexcept { - return OxError(0); + return ox::Error(0); } template constexpr Error fieldCString(const char*, T) noexcept { - return OxError(0); + return ox::Error(0); } static constexpr auto opType() noexcept { diff --git a/deps/ox/src/ox/model/typestore.hpp b/deps/ox/src/ox/model/typestore.hpp index 4f39ea7..d79902c 100644 --- a/deps/ox/src/ox/model/typestore.hpp +++ b/deps/ox/src/ox/model/typestore.hpp @@ -31,7 +31,7 @@ class TypeStore { constexpr Result get(const auto &name, int typeVersion, const TypeParamPack &typeParams) const noexcept { const auto typeId = buildTypeId(name, typeVersion, typeParams); - oxRequire(out, m_cache.at(typeId)); + OX_REQUIRE(out, m_cache.at(typeId)); return out->get(); } @@ -40,7 +40,7 @@ class TypeStore { constexpr auto typeName = ModelTypeName_v; constexpr auto typeVersion = ModelTypeVersion_v; const auto typeId = buildTypeId(typeName, typeVersion, {}); - oxRequire(out, m_cache.at(typeId)); + OX_REQUIRE(out, m_cache.at(typeId)); return out->get(); } @@ -56,15 +56,15 @@ class TypeStore { auto [val, err] = m_cache.at(typeId); if (err) { if (!std::is_constant_evaluated()) { - oxRequireM(dt, loadDescriptor(typeId)); + OX_REQUIRE_M(dt, loadDescriptor(typeId)); for (auto &f : dt->fieldList) { - oxReturnError(this->getLoad(f.typeId).moveTo(f.type)); + OX_RETURN_ERROR(this->getLoad(f.typeId).moveTo(f.type)); } auto &out = m_cache[typeId]; out = std::move(dt); return out.get(); } else { - return OxError(1, "Type not available"); + return ox::Error(1, "Type not available"); } } return val->get(); @@ -102,7 +102,7 @@ class TypeStore { protected: virtual Result> loadDescriptor(ox::StringView) noexcept { - return OxError(1); + return ox::Error(1); } Result> loadDescriptor(ox::StringViewCR name, int version, diff --git a/deps/ox/src/ox/model/walk.hpp b/deps/ox/src/ox/model/walk.hpp index 784bddc..0d452bb 100644 --- a/deps/ox/src/ox/model/walk.hpp +++ b/deps/ox/src/ox/model/walk.hpp @@ -50,7 +50,7 @@ constexpr DataWalker::DataWalker(DescriptorType *type, T fieldHandler template constexpr Result DataWalker::type() const noexcept { - oxRequire(out, m_typeStack.back()); + OX_REQUIRE(out, m_typeStack.back()); return *out; } @@ -87,9 +87,9 @@ static constexpr Error parseField(const DescriptorField &field, Reader *rdr, Dat walker->pushNamePath(field.fieldName); if (field.subscriptLevels) { // add array handling - oxRequire(arrayLen, rdr->arrayLength(field.fieldName.c_str(), true)); + OX_REQUIRE(arrayLen, rdr->arrayLength(field.fieldName.c_str(), true)); auto child = rdr->child(field.fieldName.c_str()); - oxReturnError(child.setTypeInfo(field.type->typeName.c_str(), field.type->typeVersion, field.type->typeParams, arrayLen)); + OX_RETURN_ERROR(child.setTypeInfo(field.type->typeName.c_str(), field.type->typeVersion, field.type->typeParams, arrayLen)); DescriptorField f(field); // create mutable copy --f.subscriptLevels; String subscript; @@ -98,7 +98,7 @@ static constexpr Error parseField(const DescriptorField &field, Reader *rdr, Dat subscript += static_cast(i); subscript += "]"; walker->pushNamePath(subscript); - oxReturnError(parseField(f, &child, walker)); + OX_RETURN_ERROR(parseField(f, &child, walker)); walker->popNamePath(); } rdr->nextField(); @@ -108,40 +108,40 @@ static constexpr Error parseField(const DescriptorField &field, Reader *rdr, Dat case PrimitiveType::SignedInteger: case PrimitiveType::Bool: case PrimitiveType::String: - oxReturnError(walker->read(field, rdr)); + OX_RETURN_ERROR(walker->read(field, rdr)); break; case PrimitiveType::Struct: case PrimitiveType::Union: if (rdr->fieldPresent(field.fieldName.c_str())) { auto child = rdr->child(field.fieldName.c_str()); walker->pushType(field.type); - oxReturnError(model(&child, walker)); + OX_RETURN_ERROR(model(&child, walker)); walker->popType(); rdr->nextField(); } else { // skip and discard absent field int discard; - oxReturnError(rdr->field(field.fieldName.c_str(), &discard)); + OX_RETURN_ERROR(rdr->field(field.fieldName.c_str(), &discard)); } break; } } walker->popNamePath(); - return OxError(0); + return ox::Error(0); } template constexpr Error model(Reader *rdr, DataWalker *walker) noexcept { - oxRequire(type, walker->type()); + OX_REQUIRE(type, walker->type()); auto typeName = type->typeName.c_str(); auto typeVersion = type->typeVersion; auto typeParams = type->typeParams; auto &fields = type->fieldList; - oxReturnError(rdr->setTypeInfo(typeName, typeVersion, typeParams, fields.size())); + OX_RETURN_ERROR(rdr->setTypeInfo(typeName, typeVersion, typeParams, fields.size())); for (const auto &field : fields) { - oxReturnError(parseField(field, rdr, walker)); + OX_RETURN_ERROR(parseField(field, rdr, walker)); } - return OxError(0); + return ox::Error(0); } template diff --git a/deps/ox/src/ox/oc/read.cpp b/deps/ox/src/ox/oc/read.cpp index fb5ef3f..d27b5ab 100644 --- a/deps/ox/src/ox/oc/read.cpp +++ b/deps/ox/src/ox/oc/read.cpp @@ -19,7 +19,7 @@ OrganicClawReader::OrganicClawReader(const uint8_t *buff, std::size_t buffSize) Json::CharReaderBuilder parserBuilder; auto parser = std::unique_ptr(parserBuilder.newCharReader()); if (!parser->parse(json, json + jsonLen, &m_json, nullptr)) { - throw OxException(1, "Could not parse JSON"); + throw ox::Exception(1, "Could not parse JSON"); } } @@ -27,7 +27,7 @@ OrganicClawReader::OrganicClawReader(const char *json, std::size_t jsonLen) { Json::CharReaderBuilder parserBuilder; auto parser = std::unique_ptr(parserBuilder.newCharReader()); if (!parser->parse(json, json + jsonLen, &m_json, nullptr)) { - throw OxException(1, "Could not parse JSON"); + throw ox::Exception(1, "Could not parse JSON"); } } @@ -37,7 +37,7 @@ OrganicClawReader::OrganicClawReader(Json::Value json, int unionIdx) noexcept: } Error OrganicClawReader::field(const char *key, bool *val) noexcept { - auto err = OxError(0); + auto err = ox::Error(0); if (targetValid()) { const auto &jv = value(key); if (jv.empty()) { @@ -45,7 +45,7 @@ Error OrganicClawReader::field(const char *key, bool *val) noexcept { } else if (jv.isBool()) { *val = jv.asBool(); } else { - err = OxError(1, "Type mismatch"); + err = ox::Error(1, "Type mismatch"); } } ++m_fieldIt; @@ -53,7 +53,7 @@ Error OrganicClawReader::field(const char *key, bool *val) noexcept { } Error OrganicClawReader::fieldCString(const char *key, char *val, std::size_t buffLen) noexcept { - auto err = OxError(0); + auto err = ox::Error(0); const char *begin = nullptr, *end = nullptr; const auto &jv = value(key); if (targetValid()) { @@ -67,13 +67,13 @@ Error OrganicClawReader::fieldCString(const char *key, char *val, std::size_t bu const auto strSize = static_cast(end - begin); auto data = val; if (strSize >= buffLen) { - err = OxError(2, "String size exceeds capacity of destination"); + err = ox::Error(2, "String size exceeds capacity of destination"); } else { ox::memcpy(data, begin, static_cast(strSize)); data[strSize] = 0; } } else { - err = OxError(1, "Type mismatch"); + err = ox::Error(1, "Type mismatch"); } } ++m_fieldIt; @@ -81,7 +81,7 @@ Error OrganicClawReader::fieldCString(const char *key, char *val, std::size_t bu } Error OrganicClawReader::fieldCString(const char *key, char **val) noexcept { - auto err = OxError(0); + auto err = ox::Error(0); const char *begin = nullptr, *end = nullptr; const auto &jv = value(key); auto &data = *val; @@ -98,7 +98,7 @@ Error OrganicClawReader::fieldCString(const char *key, char **val) noexcept { ox::memcpy(data, begin, static_cast(strSize)); data[strSize] = 0; } else { - err = OxError(1, "Type mismatch"); + err = ox::Error(1, "Type mismatch"); } } ++m_fieldIt; @@ -106,7 +106,7 @@ Error OrganicClawReader::fieldCString(const char *key, char **val) noexcept { } Error OrganicClawReader::fieldCString(const char *key, char **val, std::size_t buffLen) noexcept { - auto err = OxError(0); + auto err = ox::Error(0); const char *begin = nullptr, *end = nullptr; const auto &jv = value(key); if (targetValid()) { @@ -126,7 +126,7 @@ Error OrganicClawReader::fieldCString(const char *key, char **val, std::size_t b ox::memcpy(data, begin, static_cast(strSize)); data[strSize] = nullptr; } else { - err = OxError(1, "Type mismatch"); + err = ox::Error(1, "Type mismatch"); } } ++m_fieldIt; @@ -135,7 +135,7 @@ Error OrganicClawReader::fieldCString(const char *key, char **val, std::size_t b Error OrganicClawReader::field(const char *key, UUID *val) noexcept { UUIDStr str; - oxReturnError(field(key, &str)); + OX_RETURN_ERROR(field(key, &str)); return UUID::fromString(str).moveTo(*val); } @@ -147,7 +147,7 @@ Result OrganicClawReader::arrayLength(const char *key, bool) noexce if (jv.isArray()) { return jv.size(); } - return OxError(1, "Type mismatch"); + return ox::Error(1, "Type mismatch"); } [[nodiscard]] @@ -161,7 +161,7 @@ std::size_t OrganicClawReader::stringLength(const char *key) noexcept { jv.getString(&begin, &end); return static_cast(end - begin); } - return OxError(1, "Type mismatch"); + return ox::Error(1, "Type mismatch"); } OrganicClawReader OrganicClawReader::child(const char *key, int unionIdx) noexcept { diff --git a/deps/ox/src/ox/oc/read.hpp b/deps/ox/src/ox/oc/read.hpp index 9f220c3..9306d65 100644 --- a/deps/ox/src/ox/oc/read.hpp +++ b/deps/ox/src/ox/oc/read.hpp @@ -133,7 +133,7 @@ class OrganicClawReader { template Error OrganicClawReader::field(const char *key, T *val) noexcept { - auto err = OxError(0); + auto err = ox::Error(0); try { if constexpr (is_integer_v) { if (targetValid()) { @@ -146,19 +146,19 @@ Error OrganicClawReader::field(const char *key, T *val) noexcept { } else if (rightType) { *val = static_cast(jv.asUInt()); } else { - err = OxError(1, "Type mismatch"); + err = ox::Error(1, "Type mismatch"); } } } else if constexpr (isVector_v) { const auto&srcVal = value(key); const auto srcSize = srcVal.size(); - oxReturnError(ox::resizeVector(*val, srcSize)); + OX_RETURN_ERROR(ox::resizeVector(*val, srcSize)); err = field(key, val->data(), val->size()); } else if constexpr (isArray_v) { const auto&srcVal = value(key); const auto srcSize = srcVal.size(); if (srcSize > val->size()) { - err = OxError(1, "Input array is too long"); + err = ox::Error(1, "Input array is too long"); } else { err = field(key, val->data(), val->size()); } @@ -169,11 +169,11 @@ Error OrganicClawReader::field(const char *key, T *val) noexcept { ModelHandlerInterface handler(&reader); err = model(&handler, val); } else { - err = OxError(1, "Type mismatch"); + err = ox::Error(1, "Type mismatch"); } } } catch (Json::LogicError const&) { - err = OxError(1, "error reading JSON data"); + err = ox::Error(1, "error reading JSON data"); } ++m_fieldIt; return err; @@ -181,7 +181,7 @@ Error OrganicClawReader::field(const char *key, T *val) noexcept { template Error OrganicClawReader::field(const char *key, UnionView val) noexcept { - auto err = OxError(0); + auto err = ox::Error(0); if (targetValid()) { const auto &jv = value(key); if (jv.empty() || jv.isObject()) { @@ -189,7 +189,7 @@ Error OrganicClawReader::field(const char *key, UnionView val) noexcep ModelHandlerInterface handler(&reader); err = model(&handler, val.get()); } else { - err = OxError(1, "Type mismatch"); + err = ox::Error(1, "Type mismatch"); } } ++m_fieldIt; @@ -198,7 +198,7 @@ Error OrganicClawReader::field(const char *key, UnionView val) noexcep template Error OrganicClawReader::field(const char *key, BasicString *val) noexcept { - auto err = OxError(0); + auto err = ox::Error(0); if (targetValid()) { const auto &jv = value(key); if (jv.empty()) { @@ -206,7 +206,7 @@ Error OrganicClawReader::field(const char *key, BasicString *val) noexcept { } else if (jv.isString()) { *val = jv.asString().c_str(); } else { - err = OxError(1, "Type mismatch"); + err = ox::Error(1, "Type mismatch"); } } ++m_fieldIt; @@ -215,7 +215,7 @@ Error OrganicClawReader::field(const char *key, BasicString *val) noexcept { template Error OrganicClawReader::field(const char *key, IString *val) noexcept { - auto err = OxError(0); + auto err = ox::Error(0); if (targetValid()) { const auto &jv = value(key); if (jv.empty()) { @@ -223,7 +223,7 @@ Error OrganicClawReader::field(const char *key, IString *val) noexcept { } else if (jv.isString()) { *val = jv.asString().c_str(); } else { - err = OxError(1, "Type mismatch"); + err = ox::Error(1, "Type mismatch"); } } ++m_fieldIt; @@ -235,27 +235,27 @@ template Error OrganicClawReader::field(const char *key, T *val, std::size_t valLen) noexcept { const auto &srcVal = value(key); if (!srcVal.isNull() && !srcVal.isArray()) { - return OxError(1, "Type mismatch"); + return ox::Error(1, "Type mismatch"); } auto srcSize = srcVal.size(); if (srcSize > valLen) { - return OxError(1); + return ox::Error(1); } OrganicClawReader r(srcVal); ModelHandlerInterface handler{&r}; for (decltype(srcSize) i = 0; i < srcSize; ++i) { OX_ALLOW_UNSAFE_BUFFERS_BEGIN - oxReturnError(handler.field("", &val[i])); + OX_RETURN_ERROR(handler.field("", &val[i])); OX_ALLOW_UNSAFE_BUFFERS_END } - return OxError(0); + return ox::Error(0); } template Error OrganicClawReader::field(const char *key, HashMap *val) noexcept { const auto &srcVal = value(key); if (!srcVal.isObject()) { - return OxError(1, "Type mismatch"); + return ox::Error(1, "Type mismatch"); } auto keys = srcVal.getMemberNames(); auto srcSize = srcVal.size(); @@ -263,9 +263,9 @@ Error OrganicClawReader::field(const char *key, HashMap *val) noexcep ModelHandlerInterface handler{&r}; for (decltype(srcSize) i = 0; i < srcSize; ++i) { const auto k = keys[i].c_str(); - oxReturnError(handler.field(k, &val->operator[](k))); + OX_RETURN_ERROR(handler.field(k, &val->operator[](k))); } - return OxError(0); + return ox::Error(0); } Error readOC(BufferView buff, auto &val) noexcept { @@ -277,7 +277,7 @@ Error readOC(BufferView buff, auto &val) noexcept { OX_ALLOW_UNSAFE_BUFFERS_BEGIN if (!parser->parse(buff.data(), buff.data() + buff.size(), &doc, nullptr)) { OX_ALLOW_UNSAFE_BUFFERS_END - return OxError(1, "Could not parse JSON"); + return ox::Error(1, "Could not parse JSON"); } OrganicClawReader reader(buff.data(), buff.size()); ModelHandlerInterface handler(&reader); @@ -285,14 +285,14 @@ OX_ALLOW_UNSAFE_BUFFERS_END } catch (const Error &err) { return err; } catch (...) { - return OxError(1, "Unknown Error"); + return ox::Error(1, "Unknown Error"); } } template Result readOC(BufferView buff) noexcept { Result val; - oxReturnError(readOC(buff, val.value)); + OX_RETURN_ERROR(readOC(buff, val.value)); return val; } diff --git a/deps/ox/src/ox/oc/test/tests.cpp b/deps/ox/src/ox/oc/test/tests.cpp index 13747d5..3532f90 100644 --- a/deps/ox/src/ox/oc/test/tests.cpp +++ b/deps/ox/src/ox/oc/test/tests.cpp @@ -74,45 +74,45 @@ struct TestStruct { }; constexpr ox::Error model(auto *io, ox::CommonPtrWith auto *obj) noexcept { - oxReturnError(io->template setTypeInfo()); - oxReturnError(io->field("Bool", &obj->Bool)); - oxReturnError(io->field("Int", &obj->Int)); - oxReturnError(io->fieldCString("String", &obj->String)); - return OxError(0); + OX_RETURN_ERROR(io->template setTypeInfo()); + OX_RETURN_ERROR(io->field("Bool", &obj->Bool)); + OX_RETURN_ERROR(io->field("Int", &obj->Int)); + OX_RETURN_ERROR(io->fieldCString("String", &obj->String)); + return ox::Error(0); } constexpr ox::Error model(auto *io, ox::CommonPtrWith auto *obj) noexcept { - oxReturnError(io->template setTypeInfo()); - oxReturnError(io->field("Bool", &obj->Bool)); - oxReturnError(io->field("Int", &obj->Int)); - oxReturnError(io->field("String", &obj->String)); - return OxError(0); + OX_RETURN_ERROR(io->template setTypeInfo()); + OX_RETURN_ERROR(io->field("Bool", &obj->Bool)); + OX_RETURN_ERROR(io->field("Int", &obj->Int)); + OX_RETURN_ERROR(io->field("String", &obj->String)); + return ox::Error(0); } constexpr ox::Error model(auto *io, ox::CommonPtrWith auto *obj) noexcept { - oxReturnError(io->template setTypeInfo()); - oxReturnError(io->field("Bool", &obj->Bool)); - oxReturnError(io->field("Int", &obj->Int)); - oxReturnError(io->field("Int1", &obj->Int1)); - oxReturnError(io->field("Int2", &obj->Int2)); - oxReturnError(io->field("Int3", &obj->Int3)); - oxReturnError(io->field("Int4", &obj->Int4)); - oxReturnError(io->field("Int5", &obj->Int5)); - oxReturnError(io->field("Int6", &obj->Int6)); - oxReturnError(io->field("Int7", &obj->Int7)); - oxReturnError(io->field("Int8", &obj->Int8)); - oxReturnError(io->field("unionIdx", &obj->unionIdx)); + OX_RETURN_ERROR(io->template setTypeInfo()); + OX_RETURN_ERROR(io->field("Bool", &obj->Bool)); + OX_RETURN_ERROR(io->field("Int", &obj->Int)); + OX_RETURN_ERROR(io->field("Int1", &obj->Int1)); + OX_RETURN_ERROR(io->field("Int2", &obj->Int2)); + OX_RETURN_ERROR(io->field("Int3", &obj->Int3)); + OX_RETURN_ERROR(io->field("Int4", &obj->Int4)); + OX_RETURN_ERROR(io->field("Int5", &obj->Int5)); + OX_RETURN_ERROR(io->field("Int6", &obj->Int6)); + OX_RETURN_ERROR(io->field("Int7", &obj->Int7)); + OX_RETURN_ERROR(io->field("Int8", &obj->Int8)); + OX_RETURN_ERROR(io->field("unionIdx", &obj->unionIdx)); if (io->opType() == ox::OpType::Reflect) { - oxReturnError(io->field("Union", ox::UnionView{&obj->Union, 0})); + OX_RETURN_ERROR(io->field("Union", ox::UnionView{&obj->Union, 0})); } else { - oxReturnError(io->field("Union", ox::UnionView{&obj->Union, obj->unionIdx})); + OX_RETURN_ERROR(io->field("Union", ox::UnionView{&obj->Union, obj->unionIdx})); } - oxReturnError(io->field("String", &obj->String)); - oxReturnError(io->field("List", obj->List, 4)); - oxReturnError(io->field("Map", &obj->Map)); - oxReturnError(io->field("EmptyStruct", &obj->EmptyStruct)); - oxReturnError(io->field("Struct", &obj->Struct)); - return OxError(0); + OX_RETURN_ERROR(io->field("String", &obj->String)); + OX_RETURN_ERROR(io->field("List", obj->List, 4)); + OX_RETURN_ERROR(io->field("Map", &obj->Map)); + OX_RETURN_ERROR(io->field("EmptyStruct", &obj->EmptyStruct)); + OX_RETURN_ERROR(io->field("Struct", &obj->Struct)); + return ox::Error(0); } TestStruct::TestStruct(TestStruct &&other) noexcept { @@ -184,7 +184,7 @@ const std::map tests = { oxAssert(testIn.Struct.String == testOut.Struct.String, "Struct.String value mismatch"); oxAssert(testIn.Struct.Bool == testOut.Struct.Bool, "Struct.Bool value mismatch"); - return OxError(0); + return ox::Error(0); } }, @@ -210,7 +210,7 @@ const std::map tests = { auto type = ox::buildTypeDef(typeStore, testIn); oxAssert(type.error, "Descriptor write failed"); ox::ModelObject testOut; - oxReturnError(testOut.setType(type.value)); + OX_RETURN_ERROR(testOut.setType(type.value)); oxAssert(ox::readOC(dataBuff, testOut), "Data read failed"); oxAssert(testOut.get("Int").unwrap()->get() == testIn.Int, "testOut.Int failed"); oxAssert(testOut.get("Bool").unwrap()->get() == testIn.Bool, "testOut.Bool failed"); @@ -234,7 +234,7 @@ const std::map tests = { oxAssert(testOutStructCopy.get("String").unwrap()->get() == testIn.Struct.String.c_str(), "testOut.Struct.String (copy) failed"); oxAssert(testOutListCopy[0].get() == testIn.List[0], "testOut.Struct.List[0] (copy) failed"); oxAssert(testOutListCopy[1].get() == testIn.List[1], "testOut.Struct.List[1] (copy) failed"); - return OxError(0); + return ox::Error(0); } }, @@ -259,7 +259,7 @@ const std::map tests = { ox::TypeStore typeStore; auto type = ox::buildTypeDef(typeStore, testIn); oxAssert(type.error, "Descriptor write failed"); - oxReturnError(ox::walkModel(type.value, oc.data(), oc.size(), + OX_RETURN_ERROR(ox::walkModel(type.value, oc.data(), oc.size(), [](const ox::Vector&, const ox::Vector&, const ox::DescriptorField &f, ox::OrganicClawReader *rdr) -> ox::Error { auto fieldName = f.fieldName.c_str(); @@ -341,10 +341,10 @@ const std::map tests = { case ox::PrimitiveType::Union: break; } - return OxError(0); + return ox::Error(0); } )); - return OxError(0); + return ox::Error(0); } }, } diff --git a/deps/ox/src/ox/oc/write.cpp b/deps/ox/src/ox/oc/write.cpp index 13f99b8..88e4417 100644 --- a/deps/ox/src/ox/oc/write.cpp +++ b/deps/ox/src/ox/oc/write.cpp @@ -23,7 +23,7 @@ Error OrganicClawWriter::fieldCString(const char *key, const char *const*val, in value(key) = *val; } ++m_fieldIt; - return OxError(0); + return ox::Error(0); } Error OrganicClawWriter::fieldCString(const char *key, const char *const*val) noexcept { diff --git a/deps/ox/src/ox/oc/write.hpp b/deps/ox/src/ox/oc/write.hpp index d87b0f7..a1a3388 100644 --- a/deps/ox/src/ox/oc/write.hpp +++ b/deps/ox/src/ox/oc/write.hpp @@ -42,7 +42,7 @@ class OrganicClawWriter { value(key) = *val; } ++m_fieldIt; - return OxError(0); + return ox::Error(0); } Error field(const char *key, const int16_t *val) noexcept { @@ -50,7 +50,7 @@ class OrganicClawWriter { value(key) = *val; } ++m_fieldIt; - return OxError(0); + return ox::Error(0); } Error field(const char *key, const int32_t *val) noexcept { @@ -58,7 +58,7 @@ class OrganicClawWriter { value(key) = *val; } ++m_fieldIt; - return OxError(0); + return ox::Error(0); } Error field(const char *key, const int64_t *val) noexcept { @@ -66,7 +66,7 @@ class OrganicClawWriter { value(key) = *val; } ++m_fieldIt; - return OxError(0); + return ox::Error(0); } @@ -75,7 +75,7 @@ class OrganicClawWriter { value(key) = *val; } ++m_fieldIt; - return OxError(0); + return ox::Error(0); } Error field(const char *key, const uint16_t *val) noexcept { @@ -83,7 +83,7 @@ class OrganicClawWriter { value(key) = *val; } ++m_fieldIt; - return OxError(0); + return ox::Error(0); } Error field(const char *key, const uint32_t *val) noexcept { @@ -91,7 +91,7 @@ class OrganicClawWriter { value(key) = *val; } ++m_fieldIt; - return OxError(0); + return ox::Error(0); } Error field(const char *key, const uint64_t *val) noexcept { @@ -99,7 +99,7 @@ class OrganicClawWriter { value(key) = *val; } ++m_fieldIt; - return OxError(0); + return ox::Error(0); } Error field(char const*key, bool const*val) noexcept { @@ -122,8 +122,8 @@ class OrganicClawWriter { for (std::size_t i = 0; i < keys.size(); ++i) { const auto k = keys[i].c_str(); if (k) [[likely]] { - oxRequireM(value, val->at(k)); - oxReturnError(handler.field(k, value)); + OX_REQUIRE_M(value, val->at(k)); + OX_RETURN_ERROR(handler.field(k, value)); } } value(key) = w.m_json; @@ -147,7 +147,7 @@ class OrganicClawWriter { value(key) = val->c_str(); } ++m_fieldIt; - return OxError(0); + return ox::Error(0); } Error fieldCString(const char*, const char *const*val, int len) noexcept; @@ -201,13 +201,13 @@ Error OrganicClawWriter::field(const char *key, const T *val, std::size_t len) n ModelHandlerInterface handler{&w}; for (std::size_t i = 0; i < len; ++i) { OX_ALLOW_UNSAFE_BUFFERS_BEGIN - oxReturnError(handler.field({}, &val[i])); + OX_RETURN_ERROR(handler.field({}, &val[i])); OX_ALLOW_UNSAFE_BUFFERS_END } value(key) = w.m_json; } ++m_fieldIt; - return OxError(0); + return ox::Error(0); } template @@ -227,13 +227,13 @@ Error OrganicClawWriter::field(const char *key, const T *val) noexcept { } else if (val && targetValid()) { OrganicClawWriter w; ModelHandlerInterface handler{&w}; - oxReturnError(model(&handler, val)); + OX_RETURN_ERROR(model(&handler, val)); if (!w.m_json.empty() || m_json.isArray()) { value(key) = w.m_json; } } ++m_fieldIt; - return OxError(0); + return ox::Error(0); } template @@ -241,19 +241,19 @@ Error OrganicClawWriter::field(const char *key, UnionView val) noexcep if (targetValid()) { OrganicClawWriter w(val.idx()); ModelHandlerInterface handler{&w}; - oxReturnError(model(&handler, val.get())); + OX_RETURN_ERROR(model(&handler, val.get())); if (!w.m_json.isNull()) { value(key) = w.m_json; } } ++m_fieldIt; - return OxError(0); + return ox::Error(0); } Result writeOC(const auto &val) noexcept { OrganicClawWriter writer; ModelHandlerInterface handler(&writer); - oxReturnError(model(&handler, &val)); + OX_RETURN_ERROR(model(&handler, &val)); Json::StreamWriterBuilder const jsonBuilder; const auto str = Json::writeString(jsonBuilder, writer.m_json); Result buff; @@ -265,7 +265,7 @@ Result writeOC(const auto &val) noexcept { Result writeOCString(const auto &val) noexcept { OrganicClawWriter writer; ModelHandlerInterface handler(&writer); - oxReturnError(model(&handler, &val)); + OX_RETURN_ERROR(model(&handler, &val)); Json::StreamWriterBuilder const jsonBuilder; const auto str = Json::writeString(jsonBuilder, writer.m_json); Result buff; diff --git a/deps/ox/src/ox/preloader/alignmentcatcher.hpp b/deps/ox/src/ox/preloader/alignmentcatcher.hpp index 07b2fbb..3175190 100644 --- a/deps/ox/src/ox/preloader/alignmentcatcher.hpp +++ b/deps/ox/src/ox/preloader/alignmentcatcher.hpp @@ -63,7 +63,7 @@ struct AlignmentCatcher: public ModelHandlerBase, OpT template constexpr ox::Error field(StringViewCR, const T *val, std::size_t cnt) noexcept { for (std::size_t i = 0; i < cnt; ++i) { - oxReturnError(field(nullptr, &val[i])); + OX_RETURN_ERROR(field(nullptr, &val[i])); } return {}; } diff --git a/deps/ox/src/ox/preloader/preloader.hpp b/deps/ox/src/ox/preloader/preloader.hpp index cf49d00..e836b7c 100644 --- a/deps/ox/src/ox/preloader/preloader.hpp +++ b/deps/ox/src/ox/preloader/preloader.hpp @@ -162,7 +162,7 @@ constexpr ox::Error Preloader::field(StringViewCR, const ox::UnionView if (!unionCheckAndIt()) { return {}; } - oxReturnError(pad(val.get())); + OX_RETURN_ERROR(pad(val.get())); m_unionIdx.emplace_back(val.idx()); const auto err = preload(this, val.get()); m_unionIdx.pop_back(); @@ -175,13 +175,13 @@ constexpr ox::Error Preloader::field(StringViewCR name, const T *val) if (!unionCheckAndIt()) { return {}; } - oxReturnError(pad(val)); + OX_RETURN_ERROR(pad(val)); if constexpr(ox::is_integral_v) { return ox::serialize(m_writer, PlatSpec::correctEndianness(*val)); } else if constexpr(ox::is_pointer_v) { const PtrType a = startAlloc(sizeOf(val), alignOf(*val), m_writer.tellp()) + PlatSpec::RomStart; - oxReturnError(field(name, *val)); - oxReturnError(endAlloc()); + OX_RETURN_ERROR(field(name, *val)); + OX_RETURN_ERROR(endAlloc()); return ox::serialize(m_writer, PlatSpec::correctEndianness(a)); } else if constexpr(ox::isVector_v) { return fieldVector(name, val); @@ -211,19 +211,19 @@ constexpr ox::Error Preloader::field(StringViewCR, const ox::BasicStri .size = PlatSpec::correctEndianness(static_cast(sz)), .cap = PlatSpec::correctEndianness(static_cast(sz)), }; - oxReturnError(pad(&vecVal)); + OX_RETURN_ERROR(pad(&vecVal)); const auto restore = m_writer.tellp(); std::size_t a = 0; if (sz && sz >= SmallStringSize) { - oxReturnError(ox::allocate(m_writer, sz).moveTo(a)); + OX_RETURN_ERROR(ox::allocate(m_writer, sz).moveTo(a)); } else { a = restore; } vecVal.items = PlatSpec::correctEndianness(static_cast(a) + PlatSpec::RomStart); - oxReturnError(m_writer.seekp(a)); - oxReturnError(m_writer.write(val->data(), sz)); - oxReturnError(m_writer.seekp(restore)); - oxReturnError(serialize(m_writer, vecVal)); + OX_RETURN_ERROR(m_writer.seekp(a)); + OX_RETURN_ERROR(m_writer.write(val->data(), sz)); + OX_RETURN_ERROR(m_writer.seekp(restore)); + OX_RETURN_ERROR(serialize(m_writer, vecVal)); m_ptrs.emplace_back(restore + offsetof(VecMap, items), vecVal.items); return {}; } @@ -234,12 +234,12 @@ constexpr ox::Error Preloader::field(StringViewCR name, const ox::Arra if (!unionCheckAndIt()) { return {}; } - oxReturnError(pad(&(*val)[0])); + OX_RETURN_ERROR(pad(&(*val)[0])); // serialize the Array elements if constexpr(sz) { m_unionIdx.emplace_back(-1); for (std::size_t i = 0; i < val->size(); ++i) { - oxReturnError(this->interface()->field(name, &(*val)[i])); + OX_RETURN_ERROR(this->interface()->field(name, &(*val)[i])); } m_unionIdx.pop_back(); } @@ -253,11 +253,11 @@ constexpr ox::Error Preloader::field(StringViewCR, const T **val, std: return {}; } if (cnt) { - oxReturnError(pad(*val)); + OX_RETURN_ERROR(pad(*val)); // serialize the array m_unionIdx.emplace_back(-1); for (std::size_t i = 0; i < cnt; ++i) { - oxReturnError(this->interface()->field(nullptr, &val[i])); + OX_RETURN_ERROR(this->interface()->field(nullptr, &val[i])); } m_unionIdx.pop_back(); } @@ -267,11 +267,11 @@ constexpr ox::Error Preloader::field(StringViewCR, const T **val, std: template constexpr ox::Result Preloader::startAlloc(size_t sz, size_t align) noexcept { m_allocStack.emplace_back(static_cast(m_writer.tellp())); - oxReturnError(m_writer.seekp(0, ox::ios_base::end)); + OX_RETURN_ERROR(m_writer.seekp(0, ox::ios_base::end)); auto const padding = calcPadding(align); - oxRequireM(a, ox::allocate(m_writer, sz + padding)); + OX_REQUIRE_M(a, ox::allocate(m_writer, sz + padding)); a += padding; - oxReturnError(m_writer.seekp(a)); + OX_RETURN_ERROR(m_writer.seekp(a)); m_allocStart.push_back(a); return a; } @@ -280,11 +280,11 @@ template constexpr ox::Result Preloader::startAlloc( std::size_t sz, size_t align, std::size_t restore) noexcept { m_allocStack.emplace_back(restore, ox::ios_base::beg); - oxReturnError(m_writer.seekp(0, ox::ios_base::end)); + OX_RETURN_ERROR(m_writer.seekp(0, ox::ios_base::end)); auto const padding = calcPadding(align); - oxRequireM(a, ox::allocate(m_writer, sz + padding)); + OX_REQUIRE_M(a, ox::allocate(m_writer, sz + padding)); a += padding; - oxReturnError(m_writer.seekp(a)); + OX_RETURN_ERROR(m_writer.seekp(a)); m_allocStart.push_back(a); return a; } @@ -295,7 +295,7 @@ constexpr ox::Error Preloader::endAlloc() noexcept { return m_writer.seekp(0, ox::ios_base::end); } const auto &si = *m_allocStack.back().unwrap(); - oxReturnError(m_writer.seekp(static_cast(si.restore), si.seekdir)); + OX_RETURN_ERROR(m_writer.seekp(static_cast(si.restore), si.seekdir)); m_allocStack.pop_back(); m_allocStart.pop_back(); return {}; @@ -304,12 +304,12 @@ constexpr ox::Error Preloader::endAlloc() noexcept { template constexpr ox::Error Preloader::offsetPtrs(std::size_t offset) noexcept { for (const auto &p : m_ptrs) { - oxReturnError(m_writer.seekp(p.loc)); + OX_RETURN_ERROR(m_writer.seekp(p.loc)); const auto val = PlatSpec::template correctEndianness( static_cast(p.value + offset)); - oxReturnError(ox::serialize(m_writer, val)); + OX_RETURN_ERROR(ox::serialize(m_writer, val)); } - oxReturnError(m_writer.seekp(0, ox::ios_base::end)); + OX_RETURN_ERROR(m_writer.seekp(0, ox::ios_base::end)); return {}; } @@ -354,39 +354,39 @@ constexpr ox::Error Preloader::fieldVector( template constexpr ox::Error Preloader::fieldVector( StringViewCR, const auto *val, ox::VectorMemMap vecVal) noexcept { - oxReturnError(pad(&vecVal)); + OX_RETURN_ERROR(pad(&vecVal)); const auto vecValPt = m_writer.tellp(); // serialize the Vector elements if (val->size()) { const auto sz = sizeOf(&(*val)[0]) * val->size(); const auto align = alignOf((*val)[0]); - oxReturnError(m_writer.seekp(0, ox::ios_base::end)); + OX_RETURN_ERROR(m_writer.seekp(0, ox::ios_base::end)); auto const padding = calcPadding(align); - oxRequireM(p, ox::allocate(m_writer, sz + padding)); + OX_REQUIRE_M(p, ox::allocate(m_writer, sz + padding)); p += padding; - oxReturnError(m_writer.seekp(p)); + OX_RETURN_ERROR(m_writer.seekp(p)); m_unionIdx.emplace_back(-1); for (std::size_t i = 0; i < val->size(); ++i) { - oxReturnError(this->interface()->field(nullptr, &val->operator[](i))); + OX_RETURN_ERROR(this->interface()->field(nullptr, &val->operator[](i))); } m_unionIdx.pop_back(); vecVal.items = PlatSpec::correctEndianness( static_cast(p + PlatSpec::RomStart)); - oxReturnError(m_writer.seekp(vecValPt)); + OX_RETURN_ERROR(m_writer.seekp(vecValPt)); } else { vecVal.items = 0; } // serialize the Vector - oxReturnError(serialize(m_writer, vecVal)); + OX_RETURN_ERROR(serialize(m_writer, vecVal)); m_ptrs.emplace_back(m_writer.tellp() - PtrSize, vecVal.items); return {}; } template constexpr ox::Error Preloader::fieldArray(StringViewCR, ox::ModelValueArray const*val) noexcept { - oxReturnError(pad(&(*val)[0])); + OX_RETURN_ERROR(pad(&(*val)[0])); for (auto const&v : *val) { - oxReturnError(this->interface()->field({}, &v)); + OX_RETURN_ERROR(this->interface()->field({}, &v)); } return {}; } @@ -405,7 +405,7 @@ constexpr size_t Preloader::calcPadding(size_t align) const noexcept { template constexpr ox::Error preload(Preloader *pl, ox::CommonPtrWith auto *obj) noexcept { - oxReturnError(model(pl->interface(), obj)); + OX_RETURN_ERROR(model(pl->interface(), obj)); return pl->pad(obj); } diff --git a/deps/ox/src/ox/preloader/sizecatcher.hpp b/deps/ox/src/ox/preloader/sizecatcher.hpp index e9ca546..fb1eba6 100644 --- a/deps/ox/src/ox/preloader/sizecatcher.hpp +++ b/deps/ox/src/ox/preloader/sizecatcher.hpp @@ -74,7 +74,7 @@ template constexpr ox::Error SizeCatcher::field(const char*, const UnionView val) noexcept { pad(val.get()); UnionSizeCatcher sc; - oxReturnError(model(sc.interface(), val.get())); + OX_RETURN_ERROR(model(sc.interface(), val.get())); m_size += sc.size(); return {}; } @@ -91,7 +91,7 @@ template template constexpr ox::Error SizeCatcher::field(const char*, const T **val, std::size_t cnt) noexcept { for (std::size_t i = 0; i < cnt; ++i) { - oxReturnError(field("", &val[i])); + OX_RETURN_ERROR(field("", &val[i])); } return {}; } diff --git a/deps/ox/src/ox/preloader/unionsizecatcher.hpp b/deps/ox/src/ox/preloader/unionsizecatcher.hpp index 3468200..e6a59be 100644 --- a/deps/ox/src/ox/preloader/unionsizecatcher.hpp +++ b/deps/ox/src/ox/preloader/unionsizecatcher.hpp @@ -43,7 +43,7 @@ class UnionSizeCatcher: public ModelHandlerBase, OpTy template constexpr ox::Error field(StringViewCR, const UnionView val) noexcept { UnionSizeCatcher sc; - oxReturnError(model(sc.interface(), val.get())); + OX_RETURN_ERROR(model(sc.interface(), val.get())); m_size += sc.size(); return {}; } @@ -80,7 +80,7 @@ template template constexpr ox::Error UnionSizeCatcher::field(StringViewCR, const T **val, std::size_t cnt) noexcept { for (std::size_t i = 0; i < cnt; ++i) { - oxReturnError(field("", &val[i])); + OX_RETURN_ERROR(field("", &val[i])); } return {}; } diff --git a/deps/ox/src/ox/std/assert.hpp b/deps/ox/src/ox/std/assert.hpp index b9873b9..dd95982 100644 --- a/deps/ox/src/ox/std/assert.hpp +++ b/deps/ox/src/ox/std/assert.hpp @@ -22,9 +22,9 @@ namespace ox { -void panic(StringViewCR file, int line, StringViewCR panicMsg, const Error &err = OxError(0)) noexcept; +void panic(StringViewCR file, int line, StringViewCR panicMsg, const Error &err = ox::Error(0)) noexcept; -constexpr void constexprPanic(StringViewCR file, int line, StringViewCR panicMsg, const Error &err = OxError(0)) noexcept { +constexpr void constexprPanic(StringViewCR file, int line, StringViewCR panicMsg, const Error &err = ox::Error(0)) noexcept { if (!std::is_constant_evaluated()) { panic(file, line, panicMsg, err); } else { diff --git a/deps/ox/src/ox/std/bounds.hpp b/deps/ox/src/ox/std/bounds.hpp index 78090a5..e49fa51 100644 --- a/deps/ox/src/ox/std/bounds.hpp +++ b/deps/ox/src/ox/std/bounds.hpp @@ -126,11 +126,11 @@ constexpr void Bounds::set(const Point &pt1, const Point &pt2) noexcept { template constexpr Error model(T *io, ox::CommonPtrWith auto *obj) noexcept { - oxReturnError(io->template setTypeInfo()); - oxReturnError(io->field("x", &obj->x)); - oxReturnError(io->field("y", &obj->y)); - oxReturnError(io->field("width", &obj->width)); - oxReturnError(io->field("height", &obj->height)); + OX_RETURN_ERROR(io->template setTypeInfo()); + OX_RETURN_ERROR(io->field("x", &obj->x)); + OX_RETURN_ERROR(io->field("y", &obj->y)); + OX_RETURN_ERROR(io->field("width", &obj->width)); + OX_RETURN_ERROR(io->field("height", &obj->height)); return {}; } diff --git a/deps/ox/src/ox/std/buffer.hpp b/deps/ox/src/ox/std/buffer.hpp index b33b7be..d6b9a3d 100644 --- a/deps/ox/src/ox/std/buffer.hpp +++ b/deps/ox/src/ox/std/buffer.hpp @@ -53,7 +53,7 @@ class BufferWriter { base = static_cast>(m_it); break; default: - return OxError(1, "Invalid seekdir"); + return ox::Error(1, "Invalid seekdir"); } m_it = static_cast(base + off); return {}; @@ -125,7 +125,7 @@ class CharBuffWriter { base = static_cast>(m_it); break; default: - return OxError(1, "Invalid seekdir"); + return ox::Error(1, "Invalid seekdir"); } m_it = static_cast(base + off); return {}; @@ -138,7 +138,7 @@ class CharBuffWriter { constexpr ox::Error put(char val) noexcept { if (m_it >= m_cap) [[unlikely]] { - return OxError(1, "Buffer overrun"); + return ox::Error(1, "Buffer overrun"); } m_buff[m_it] = val; ++m_it; @@ -149,7 +149,7 @@ class CharBuffWriter { constexpr ox::Error write(const char *buff, std::size_t cnt) noexcept { const auto end = m_it + cnt; if (end > m_cap) [[unlikely]] { - return OxError(1, "Buffer overrun"); + return ox::Error(1, "Buffer overrun"); } if (buff) { for (auto i = 0u; i < cnt; ++i) { @@ -179,7 +179,7 @@ class BufferReader { constexpr ox::Result peek() const noexcept { if (m_it >= m_size) [[unlikely]] { - return OxError(1, "Peek failed: buffer overrun"); + return ox::Error(1, "Peek failed: buffer overrun"); } return m_buff[m_it]; } @@ -187,7 +187,7 @@ class BufferReader { constexpr ox::Result read(void *v, std::size_t sz) noexcept { sz = ox::min(sz, m_size - m_it); if (m_it + sz > m_size) [[unlikely]] { - return OxError(1, "Read failed: Buffer overrun"); + return ox::Error(1, "Read failed: Buffer overrun"); } ox::memcpy(v, &m_buff[m_it], sz); m_it += sz; @@ -196,7 +196,7 @@ class BufferReader { constexpr ox::Error seekg(std::size_t p) noexcept { if (p > m_size) [[unlikely]] { - return OxError(1, "Seek failed: Buffer overrun"); + return ox::Error(1, "Seek failed: Buffer overrun"); } m_it = p; return {}; @@ -215,11 +215,11 @@ class BufferReader { base = static_cast>(m_it); break; default: - return OxError(1, "Invalid seekdir"); + return ox::Error(1, "Invalid seekdir"); } auto const newIt = static_cast(base + off); if (newIt > m_size) [[unlikely]] { - return OxError(1, "Seek failed: Buffer overrun"); + return ox::Error(1, "Seek failed: Buffer overrun"); } m_it = newIt; return {}; diff --git a/deps/ox/src/ox/std/def.hpp b/deps/ox/src/ox/std/def.hpp index ab848ca..eb7ee0e 100644 --- a/deps/ox/src/ox/std/def.hpp +++ b/deps/ox/src/ox/std/def.hpp @@ -37,13 +37,13 @@ // Error handling -#define oxReturnError(x) { if (const auto _ox_error = ox::detail::toError(x)) [[unlikely]] return _ox_error; } (void) 0 -#define oxThrowError(x) { if (const auto _ox_error = ox::detail::toError(x)) [[unlikely]] throw ox::Exception(_ox_error); } (void) 0 -#define oxConcatImpl(a, b) a##b -#define oxConcat(a, b) oxConcatImpl(a, b) +#define OX_RETURN_ERROR(x) { if (const auto _ox_error = ox::detail::toError(x)) [[unlikely]] return _ox_error; } (void) 0 +#define OX_THROW_ERROR(x) { if (const auto _ox_error = ox::detail::toError(x)) [[unlikely]] throw ox::Exception(_ox_error); } (void) 0 +#define OX_CONCAT_IMPL(a, b) a##b +#define OX_CONCAT(a, b) OX_CONCAT_IMPL(a, b) // oxRequire Mutable -#define oxRequireM(out, x) auto [out, oxConcat(oxRequire_err_, __LINE__)] = x; oxReturnError(oxConcat(oxRequire_err_, __LINE__)) -#define oxRequire(out, x) const oxRequireM(out, x) +#define OX_REQUIRE_M(out, x) auto [out, OX_CONCAT(oxRequire_err_, __LINE__)] = x; OX_RETURN_ERROR(OX_CONCAT(oxRequire_err_, __LINE__)) +#define OX_REQUIRE(out, x) const OX_REQUIRE_M(out, x) // Asserts diff --git a/deps/ox/src/ox/std/defer.hpp b/deps/ox/src/ox/std/defer.hpp index 390ffeb..b1f0ea4 100644 --- a/deps/ox/src/ox/std/defer.hpp +++ b/deps/ox/src/ox/std/defer.hpp @@ -31,4 +31,4 @@ class Defer { } -#define oxDefer ox::Defer const oxConcat(oxDefer_, __LINE__) = +#define OX_DEFER ox::Defer const OX_CONCAT(oxDefer_, __LINE__) = diff --git a/deps/ox/src/ox/std/error.hpp b/deps/ox/src/ox/std/error.hpp index 49e2917..af33e8b 100644 --- a/deps/ox/src/ox/std/error.hpp +++ b/deps/ox/src/ox/std/error.hpp @@ -17,7 +17,7 @@ class exception { virtual ~exception() = default; [[nodiscard]] - virtual const char *what() const noexcept { + virtual char const*what() const noexcept { return ""; } }; @@ -26,49 +26,50 @@ class exception { #include "defines.hpp" #include "def.hpp" +#include "source_location.hpp" #include "typetraits.hpp" #include "utility.hpp" -#define OxError(...) ox::Error(__FILE__, __LINE__, __VA_ARGS__) -#define OxException(...) ox::Exception(__FILE__, __LINE__, __VA_ARGS__) - namespace ox { using ErrorCode = uint16_t; struct [[nodiscard]] Error { - const char *msg = nullptr; - const char *file = nullptr; + ox::CString msg = nullptr; + ox::CString file = nullptr; uint16_t line = 0; ErrorCode errCode = 0; constexpr Error() noexcept = default; - explicit constexpr Error(ErrorCode ec) noexcept: errCode(ec) { - } + 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(const char *file, uint32_t line, ErrorCode errCode, const char *msg = nullptr) noexcept { - this->file = file; - this->line = static_cast(line); - this->msg = msg; - this->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())}, + errCode{errCode} + {} - constexpr Error(const Error &o) noexcept { - this->msg = o.msg; - this->file = o.file; - this->line = o.line; - this->errCode = o.errCode; - } - - constexpr Error &operator=(const Error &o) noexcept { - this->msg = o.msg; - this->file = o.file; - this->line = o.line; - this->errCode = o.errCode; - return *this; - } + explicit constexpr Error( + ErrorCode const errCode, + ox::CString msg, + std::source_location const&src = std::source_location::current()) noexcept: + msg{msg}, + file{src.file_name()}, + line{static_cast(src.line())}, + errCode{errCode} + {} constexpr operator uint64_t() const noexcept { return errCode; @@ -77,51 +78,62 @@ struct [[nodiscard]] Error { }; [[nodiscard]] -constexpr auto errCode(const Error &err) noexcept { +constexpr auto errCode(Error const&err) noexcept { return err.errCode; } -template +template [[nodiscard]] -constexpr auto toStr(const Error &err) noexcept { - return err.msg ? T(err.msg) : ""; +constexpr auto toStr(Error const&err) noexcept { + return err.msg ? T{err.msg} : ""; } struct Exception: public std::exception { - const char *msg = nullptr; - const char *file = nullptr; + ox::CString msg = nullptr; + ox::CString file = nullptr; uint16_t line = 0; ErrorCode errCode = 0; - explicit inline Exception(const char *file, uint32_t line, ErrorCode errCode, const char *msg = "") noexcept { + 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(const Error &err) { - if (err.msg) { - this->msg = err.msg; - } else { - this->msg = ""; - } - this->file = err.file; - this->line = err.line; - this->errCode = err.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())}, + errCode{errCode} {} + + explicit inline Exception( + ErrorCode const errCode, + ox::CString msg, + std::source_location const&src = std::source_location::current()) noexcept: + msg{msg}, + file{src.file_name()}, + line{static_cast(src.line())}, + errCode{errCode} {} + + explicit inline Exception(Error const&err) noexcept: + 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); } [[nodiscard]] - const char *what() const noexcept override { + char const*what() const noexcept override { return msg; } }; -void panic(const char *file, int line, const char *panicMsg, const Error &err) noexcept; +void panic(char const*file, int line, char const*panicMsg, Error const&err) noexcept; template struct [[nodiscard]] Result { @@ -135,25 +147,25 @@ struct [[nodiscard]] Result { } template - constexpr Result(const Result &other) noexcept: value(other.value), error(other.error) { + constexpr Result(Result const&other) noexcept: value(other.value), error(other.error) { } template constexpr Result(Result &&other) noexcept: value(std::move(other.value)), error(std::move(other.error)) { } - constexpr Result(const Error &error) noexcept: value(), error(error) { + constexpr Result(Error const&error) noexcept: value(), error(error) { } - constexpr Result(const type &value, const Error &error = OxError(0)) noexcept: value(value), error(error) { + constexpr Result(type const&value, Error const&error = {}) noexcept: value(value), error(error) { } - constexpr Result(type &&value, const Error &error = OxError(0)) noexcept: value(std::move(value)), error(error) { + constexpr Result(type &&value, Error const&error = {}) noexcept: value(std::move(value)), error(error) { } constexpr ~Result() noexcept = default; - explicit constexpr operator const type&() const noexcept { + explicit constexpr operator type const&() const noexcept { return value; } @@ -322,21 +334,21 @@ struct [[nodiscard]] Result { namespace detail { -constexpr Error toError(const Error &e) noexcept { +constexpr Error toError(Error const&e) noexcept { return e; } template -constexpr Error toError(const Result &r) noexcept { +constexpr Error toError(Result const&r) noexcept { return r.error; } } -constexpr void primitiveAssert(const char *file, int line, bool pass, const char *msg) noexcept { +constexpr void primitiveAssert(char const*file, int line, bool pass, char const*msg) noexcept { if constexpr(ox::defines::Debug) { if (!pass) [[unlikely]] { - panic(file, line, msg, OxError(1)); + panic(file, line, msg, ox::Error(1)); } } } diff --git a/deps/ox/src/ox/std/hashmap.hpp b/deps/ox/src/ox/std/hashmap.hpp index 0133435..938add9 100644 --- a/deps/ox/src/ox/std/hashmap.hpp +++ b/deps/ox/src/ox/std/hashmap.hpp @@ -154,7 +154,7 @@ template constexpr Result HashMap::at(MaybeView_t const&k) noexcept { auto p = access(m_pairs, k); if (!p) { - return {nullptr, OxError(1, "value not found for given key")}; + return {nullptr, ox::Error(1, "value not found for given key")}; } return &p->value; } @@ -163,7 +163,7 @@ template constexpr Result HashMap::at(MaybeView_t const&k) const noexcept { auto p = access(m_pairs, k); if (!p) { - return {nullptr, OxError(1, "value not found for given key")}; + return {nullptr, ox::Error(1, "value not found for given key")}; } return &p->value; } diff --git a/deps/ox/src/ox/std/heapmgr.cpp b/deps/ox/src/ox/std/heapmgr.cpp index 9cdc358..b73b5f8 100644 --- a/deps/ox/src/ox/std/heapmgr.cpp +++ b/deps/ox/src/ox/std/heapmgr.cpp @@ -77,7 +77,7 @@ static HeapSegment *findSegmentFor(std::size_t sz) noexcept { return s; } } - oxPanic(OxError(1), "malloc: could not find segment"); + oxPanic(ox::Error(1), "malloc: could not find segment"); return nullptr; } @@ -102,7 +102,7 @@ void free(void *ptr) noexcept { } else if (p.segment) { p.segment->inUse = false; } else { - oxPanic(OxError(1), "Bad heap free"); + oxPanic(ox::Error(1), "Bad heap free"); } } diff --git a/deps/ox/src/ox/std/istring.hpp b/deps/ox/src/ox/std/istring.hpp index 6df2caa..3108341 100644 --- a/deps/ox/src/ox/std/istring.hpp +++ b/deps/ox/src/ox/std/istring.hpp @@ -174,7 +174,7 @@ constexpr Error IString::append(const char *str, std::size_t strLen) noe auto const currentLen = len(); if (cap() < currentLen + strLen) { strLen = cap() - currentLen; - err = OxError(1, "Insufficient space for full string"); + err = ox::Error(1, "Insufficient space for full string"); } OX_CLANG_NOWARN_BEGIN(-Wunsafe-buffer-usage) ox::strncpy(m_buff.data() + currentLen, str, strLen); @@ -219,7 +219,7 @@ constexpr std::size_t IString::bytes() const noexcept { template constexpr ox::Error IString::resize(size_t sz) noexcept { if (sz > StrCap) [[unlikely]] { - return OxError(1, "Trying to extend IString beyond its cap"); + return ox::Error(1, "Trying to extend IString beyond its cap"); } for (auto i = m_size; i < sz; ++i) { m_buff[i] = 0; @@ -231,7 +231,7 @@ constexpr ox::Error IString::resize(size_t sz) noexcept { template constexpr ox::Error IString::unsafeResize(size_t sz) noexcept { if (sz > StrCap) [[unlikely]] { - return OxError(1, "Trying to extend IString beyond its cap"); + return ox::Error(1, "Trying to extend IString beyond its cap"); } m_size = sz; return {}; diff --git a/deps/ox/src/ox/std/new.hpp b/deps/ox/src/ox/std/new.hpp index e631d0c..980d0a4 100644 --- a/deps/ox/src/ox/std/new.hpp +++ b/deps/ox/src/ox/std/new.hpp @@ -42,10 +42,10 @@ constexpr U *make(Args &&...args) noexcept { try { return new T(ox::forward(args)...); } catch (std::exception const&ex) { - oxPanic(OxError(1, ex.what()), ex.what()); + oxPanic(ox::Error(1, ex.what()), ex.what()); return nullptr; } catch (...) { - oxPanic(OxError(2, "Allocation or constructor failed"), "Allocation or constructor failed"); + oxPanic(ox::Error(2, "Allocation or constructor failed"), "Allocation or constructor failed"); return nullptr; } #else @@ -62,7 +62,7 @@ constexpr Result makeCatch(Args &&...args) noexcept { } catch (const ox::Exception &ex) { return ex.toError(); } catch (...) { - return OxError(1, "Allocation or constructor failed"); + return ox::Error(1, "Allocation or constructor failed"); } #else return new T(ox::forward(args)...); diff --git a/deps/ox/src/ox/std/point.hpp b/deps/ox/src/ox/std/point.hpp index 57737f8..c273855 100644 --- a/deps/ox/src/ox/std/point.hpp +++ b/deps/ox/src/ox/std/point.hpp @@ -189,9 +189,9 @@ constexpr bool Point::operator!=(const Point &p) const noexcept { template constexpr Error model(T *io, ox::CommonPtrWith auto *obj) noexcept { - oxReturnError(io->template setTypeInfo()); - oxReturnError(io->field("x", &obj->x)); - oxReturnError(io->field("y", &obj->y)); + OX_RETURN_ERROR(io->template setTypeInfo()); + OX_RETURN_ERROR(io->field("x", &obj->x)); + OX_RETURN_ERROR(io->field("y", &obj->y)); return {}; } diff --git a/deps/ox/src/ox/std/reader.cpp b/deps/ox/src/ox/std/reader.cpp index 7733c2b..0159600 100644 --- a/deps/ox/src/ox/std/reader.cpp +++ b/deps/ox/src/ox/std/reader.cpp @@ -34,11 +34,11 @@ ox::Result StreamReader::peek() const noexcept { m_strm.get(c); auto const ok = c != EOF; if (ok && m_strm.unget()) [[unlikely]] { - return OxError(1, "Unable to unget character"); + return ox::Error(1, "Unable to unget character"); } - return {static_cast(c), OxError(!ok, "File peek failed")}; + return {static_cast(c), ox::Error(!ok, "File peek failed")}; } catch (std::exception const&) { - return OxError(1, "peek failed"); + return ox::Error(1, "peek failed"); } } @@ -50,7 +50,7 @@ ox::Error StreamReader::seekg(std::size_t p) noexcept { try { m_strm.seekg(static_cast(p), std::ios_base::cur); } catch (std::exception const&) { - return OxError(1, "seekg failed"); + return ox::Error(1, "seekg failed"); } return {}; } @@ -59,14 +59,14 @@ ox::Error StreamReader::seekg(int64_t p, ios_base::seekdir sd) noexcept { try { m_strm.seekg(p, sdMap(sd)); } catch (std::exception const&) { - return OxError(1, "seekg failed"); + return ox::Error(1, "seekg failed"); } return {}; } ox::Result StreamReader::tellg() noexcept { const auto sz = m_strm.tellg(); - return {static_cast(sz), OxError(sz == -1)}; + return {static_cast(sz), ox::Error(sz == -1)}; } } diff --git a/deps/ox/src/ox/std/serialize.hpp b/deps/ox/src/ox/std/serialize.hpp index 4fc8778..2ff5c62 100644 --- a/deps/ox/src/ox/std/serialize.hpp +++ b/deps/ox/src/ox/std/serialize.hpp @@ -63,10 +63,10 @@ constexpr ox::Error pad(Writer_c auto &w, const T *v) noexcept { template constexpr ox::Error serialize(Writer_c auto &w, const VectorMemMap &vm) noexcept { - oxReturnError(w.write(nullptr, vm.smallVecSize)); - oxReturnError(serialize(w, PlatSpec::correctEndianness(vm.size))); - oxReturnError(serialize(w, PlatSpec::correctEndianness(vm.cap))); - oxReturnError(serialize(w, PlatSpec::correctEndianness(vm.items))); + OX_RETURN_ERROR(w.write(nullptr, vm.smallVecSize)); + OX_RETURN_ERROR(serialize(w, PlatSpec::correctEndianness(vm.size))); + OX_RETURN_ERROR(serialize(w, PlatSpec::correctEndianness(vm.cap))); + OX_RETURN_ERROR(serialize(w, PlatSpec::correctEndianness(vm.items))); return {}; } @@ -83,7 +83,7 @@ template constexpr ox::Result> serialize(const T &in) noexcept { ox::Array out = {}; CharBuffWriter w(out); - oxReturnError(serialize(w, in)); + OX_RETURN_ERROR(serialize(w, in)); return out; }; diff --git a/deps/ox/src/ox/std/size.hpp b/deps/ox/src/ox/std/size.hpp index b2980ed..b43d1f0 100644 --- a/deps/ox/src/ox/std/size.hpp +++ b/deps/ox/src/ox/std/size.hpp @@ -190,9 +190,9 @@ constexpr bool Size::operator!=(const Size &p) const noexcept { template constexpr Error model(T *io, ox::CommonPtrWith auto *obj) noexcept { - oxReturnError(io->template setTypeInfo()); - oxReturnError(io->field("width", &obj->width)); - oxReturnError(io->field("height", &obj->height)); + OX_RETURN_ERROR(io->template setTypeInfo()); + OX_RETURN_ERROR(io->field("width", &obj->width)); + OX_RETURN_ERROR(io->field("height", &obj->height)); return {}; } diff --git a/deps/ox/src/ox/std/smallmap.hpp b/deps/ox/src/ox/std/smallmap.hpp index 66871cf..0c3ab26 100644 --- a/deps/ox/src/ox/std/smallmap.hpp +++ b/deps/ox/src/ox/std/smallmap.hpp @@ -140,7 +140,7 @@ template constexpr Result SmallMap::at(MaybeView_t const&k) noexcept { auto p = access(m_pairs, k); if (!p) { - return {nullptr, OxError(1, "value not found for given key")}; + return {nullptr, ox::Error(1, "value not found for given key")}; } return &p->value; } @@ -149,7 +149,7 @@ template constexpr Result SmallMap::at(MaybeView_t const&k) const noexcept { auto p = access(m_pairs, k); if (!p) { - return {nullptr, OxError(1, "value not found for given key")}; + return {nullptr, ox::Error(1, "value not found for given key")}; } return &p->value; } @@ -247,8 +247,8 @@ constexpr typename SmallMap::Pair &SmallMap::acces template constexpr Error model(T *io, ox::CommonPtrWith> auto *obj) noexcept { using Map = SmallMap; - oxReturnError(io->template setTypeInfo()); - oxReturnError(io->field("pairs", &obj->m_pairs)); + OX_RETURN_ERROR(io->template setTypeInfo()); + OX_RETURN_ERROR(io->field("pairs", &obj->m_pairs)); return {}; } diff --git a/deps/ox/src/ox/std/source_location.hpp b/deps/ox/src/ox/std/source_location.hpp new file mode 100644 index 0000000..54bff14 --- /dev/null +++ b/deps/ox/src/ox/std/source_location.hpp @@ -0,0 +1,68 @@ +/* + * Copyright 2015 - 2024 gary@drinkingtea.net + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#if __has_include() + +#include + +#else + +#include "types.hpp" + +namespace std { + +class source_location { + private: + struct __impl { + char const*_M_file_name{}; + char const*_M_function_name{}; + uint32_t _M_line{}; + uint32_t _M_column{}; + }; + static constexpr __impl Default{ + ._M_file_name = "", + ._M_function_name = "", + ._M_line = {}, + ._M_column = {}, + }; + __impl const*m_data{&Default}; + using Raw = decltype(__builtin_source_location()); + + public: + constexpr source_location() noexcept = default; + + static consteval source_location current(Raw const pSl = __builtin_source_location()) noexcept { + source_location sl; + if (pSl) { + sl.m_data = static_cast<__impl const*>(pSl); + } + return sl; + } + + constexpr uint32_t line() const noexcept { + return m_data->_M_line; + } + + constexpr uint32_t column() const noexcept { + return m_data->_M_column; + } + + constexpr ox::CString file_name() const noexcept { + return m_data->_M_file_name; + } + + constexpr ox::CString function_name() const noexcept { + return m_data->_M_function_name; + } +}; + +} + +#endif diff --git a/deps/ox/src/ox/std/strconv.hpp b/deps/ox/src/ox/std/strconv.hpp index 6d8a25b..5ef1bfc 100644 --- a/deps/ox/src/ox/std/strconv.hpp +++ b/deps/ox/src/ox/std/strconv.hpp @@ -1,3 +1,10 @@ +/* + * Copyright 2015 - 2024 gary@drinkingtea.net + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ #pragma once @@ -17,7 +24,7 @@ constexpr ox::Error writeItoa(Integer v, ox::Writer_c auto &writer) noexcept { constexpr auto base = 10; auto it = 0; if (val < 0) { - oxReturnError(writer.put('-')); + OX_RETURN_ERROR(writer.put('-')); ++it; } while (mod) { @@ -30,13 +37,13 @@ constexpr ox::Error writeItoa(Integer v, ox::Writer_c auto &writer) noexcept { start = 'a'; digit -= 10; } - oxReturnError(writer.put(static_cast(start + digit))); + OX_RETURN_ERROR(writer.put(static_cast(start + digit))); ++it; } } } else { // 0 is a special case - oxReturnError(writer.put('0')); + OX_RETURN_ERROR(writer.put('0')); } return {}; } diff --git a/deps/ox/src/ox/std/string.hpp b/deps/ox/src/ox/std/string.hpp index 93daefd..88e23be 100644 --- a/deps/ox/src/ox/std/string.hpp +++ b/deps/ox/src/ox/std/string.hpp @@ -182,7 +182,7 @@ class BasicString { // make sure last element is a null terminator m_buff[currentLen + strLen] = 0; // this can't fail, but it returns an Error to match BString::append - return OxError(0); + return ox::Error(0); } constexpr Error append(ox::StringView sv) noexcept { diff --git a/deps/ox/src/ox/std/stringview.hpp b/deps/ox/src/ox/std/stringview.hpp index b2c4294..03b7a3b 100644 --- a/deps/ox/src/ox/std/stringview.hpp +++ b/deps/ox/src/ox/std/stringview.hpp @@ -109,7 +109,7 @@ constexpr ox::Result atoi(ox::StringViewCR str) noexcept { total += (str[s] - '0') * multiplier; multiplier *= 10; } else { - return OxError(1); + return ox::Error(1); } } return total; diff --git a/deps/ox/src/ox/std/strops.hpp b/deps/ox/src/ox/std/strops.hpp index 65e8900..0f34103 100644 --- a/deps/ox/src/ox/std/strops.hpp +++ b/deps/ox/src/ox/std/strops.hpp @@ -106,7 +106,7 @@ constexpr ox::Vector split(StringViewCR str, StringView [[nodiscard]] constexpr ox::Result lastIndexOf(ox::StringViewCR str, int character) noexcept { - ox::Result retval = OxError(1, "Character not found"); + ox::Result retval = ox::Error(1, "Character not found"); for (auto i = static_cast(str.bytes() - 1); i >= 0; --i) { if (str[static_cast(i)] == character) { retval = static_cast(i); diff --git a/deps/ox/src/ox/std/test/tests.cpp b/deps/ox/src/ox/std/test/tests.cpp index 4aecb7c..ede7e60 100644 --- a/deps/ox/src/ox/std/test/tests.cpp +++ b/deps/ox/src/ox/std/test/tests.cpp @@ -126,7 +126,7 @@ OX_CLANG_NOWARN_BEGIN(-Wunsafe-buffer-usage) OX_CLANG_NOWARN_END ox::heapmgr::free(a1); ox::heapmgr::free(a2); - return OxError(0); + return ox::Error(0); } }, { @@ -136,10 +136,10 @@ OX_CLANG_NOWARN_END ox::CharBuffWriter bw(buff); oxAssert(ox::writeItoa(5, bw), "ox::writeItoa returned Error"); oxExpect(ox::StringView(buff.data()), ox::StringView("5")); - oxReturnError(bw.seekp(0)); + OX_RETURN_ERROR(bw.seekp(0)); oxAssert(ox::writeItoa(50, bw), "ox::writeItoa returned Error"); oxExpect(ox::StringView(buff.data()), ox::StringView("50")); - oxReturnError(bw.seekp(0)); + OX_RETURN_ERROR(bw.seekp(0)); oxAssert(ox::writeItoa(500, bw), "ox::writeItoa returned Error"); oxExpect(ox::StringView(buff.data()), ox::StringView("500")); return ox::Error{}; @@ -148,41 +148,41 @@ OX_CLANG_NOWARN_END { "ABCDEFG != HIJKLMN", []() { - return OxError(ox::memcmp("ABCDEFG", "HIJKLMN", 7) >= 0); + return ox::Error(ox::memcmp("ABCDEFG", "HIJKLMN", 7) >= 0); } }, { "HIJKLMN != ABCDEFG", []() { - return OxError(ox::memcmp("HIJKLMN", "ABCDEFG", 7) <= 0); + return ox::Error(ox::memcmp("HIJKLMN", "ABCDEFG", 7) <= 0); } }, { "ABCDEFG == ABCDEFG", []() { - return OxError(ox::memcmp("ABCDEFG", "ABCDEFG", 7) != 0); + return ox::Error(ox::memcmp("ABCDEFG", "ABCDEFG", 7) != 0); } }, { "ABCDEFGHI == ABCDEFG", []() { - return OxError(ox::memcmp("ABCDEFGHI", "ABCDEFG", 7) != 0); + return ox::Error(ox::memcmp("ABCDEFGHI", "ABCDEFG", 7) != 0); } }, { "IString", []() { ox::IString<5> s; - oxReturnError(s.append("A")); - oxReturnError(s.append("B")); - oxReturnError(s.append("9")); - oxReturnError(s.append("C")); + OX_RETURN_ERROR(s.append("A")); + OX_RETURN_ERROR(s.append("B")); + OX_RETURN_ERROR(s.append("9")); + OX_RETURN_ERROR(s.append("C")); oxAssert(s == "AB9C", "IString append broken"); s = "asdf"; oxAssert(s == "asdf", "String assign broken"); oxAssert(s != "aoeu", "String assign broken"); oxAssert(s.len() == 4, "String assign broken"); - return OxError(0); + return ox::Error(0); } }, { @@ -216,7 +216,7 @@ OX_CLANG_NOWARN_END oxAssert( ox::String(ox::StringView("Write")) == ox::StringView("Write"), "String / StringView comparison broken"); - return OxError(0); + return ox::Error(0); } }, { @@ -227,14 +227,14 @@ OX_CLANG_NOWARN_END oxAssert(v.empty(), "Vector::empty() is broken"); auto insertTest = [&v](int val, std::size_t size) { v.push_back(val); - oxReturnError(OxError(v.size() != size, "Vector size incorrect")); - oxReturnError(OxError(v[v.size() - 1] != val, "Vector value wrong")); - return OxError(0); + OX_RETURN_ERROR(ox::Error(v.size() != size, "Vector size incorrect")); + OX_RETURN_ERROR(ox::Error(v[v.size() - 1] != val, "Vector value wrong")); + return ox::Error(0); }; oxAssert(insertTest(42, 1), "Vector insertion failed"); oxAssert(insertTest(100, 2), "Vector insertion failed"); oxAssert(insertTest(102, 3), "Vector insertion failed"); - return OxError(0); + return ox::Error(0); } }, { @@ -246,7 +246,7 @@ OX_CLANG_NOWARN_END oxExpect(map.size(), 1u); oxExpect(map["aoeu"], ""); oxExpect(map.size(), 2u); - return OxError(0); + return ox::Error(0); } }, { @@ -262,7 +262,7 @@ OX_CLANG_NOWARN_END ii[5] = 100; oxAssert(ii[4] == 42, "4 != 42"); oxAssert(ii[5] == 100, "5 != 100"); - return OxError(0); + return ox::Error(0); } }, { @@ -278,7 +278,7 @@ OX_CLANG_NOWARN_END ii[5] = 100; oxAssert(ii[4] == 42, "4 != 42"); oxAssert(ii[5] == 100, "5 != 100"); - return OxError(0); + return ox::Error(0); } }, { @@ -319,7 +319,7 @@ OX_CLANG_NOWARN_END oxExpect(ox::serialize(257).unwrap(), BA({1, 1, 0, 0})); constexpr auto neg1 = static_cast(-1); // ARM64 Linux assumes -1 literals are ints... oxExpect(ox::serialize(0xffff'ffff).unwrap(), BA({neg1, neg1, neg1, neg1})); - return OxError(0); + return ox::Error(0); } }, { @@ -336,7 +336,7 @@ OX_CLANG_NOWARN_END oxAssert(w.write(qwerty.data(), qwerty.bytes()), "write failed"); oxExpect(b.size(), 14u); oxExpect(ox::StringView(b.data(), b.size()), "asdfaoeuqwerty"); - return OxError(0); + return ox::Error(0); } }, { @@ -359,7 +359,7 @@ OX_CLANG_NOWARN_END oxExpect(ox::detail::fromHex("a0").unwrap(), 0xa0); oxExpect(ox::detail::fromHex("93").unwrap(), 0x93); oxExpect(ox::detail::fromHex("40").unwrap(), 0x40); - return OxError(0); + return ox::Error(0); } }, { @@ -379,18 +379,18 @@ OX_CLANG_NOWARN_END oxExpect(ox::detail::toHex(0x93), "93"); oxExpect(ox::detail::toHex(0x40), "40"); oxExpect(ox::detail::toHex(0xf0), "f0"); - return OxError(0); + return ox::Error(0); } }, { "UUID", [] { constexpr ox::StringView uuidStr = "8d814442-f46e-4cc3-8edc-ca3c01cc86db"; - oxRequire(uuid, ox::UUID::fromString(uuidStr)); + OX_REQUIRE(uuid, ox::UUID::fromString(uuidStr)); oxExpect(uuid.toString(), uuidStr); oxExpect(ox::UUID{}.isNull(), true); oxExpect(ox::UUID::fromString(uuidStr).value.isNull(), false); - return OxError(0); + return ox::Error(0); } }, { @@ -400,7 +400,7 @@ OX_CLANG_NOWARN_END oxExpect(ox::UUID::generate().unwrap().toString(), "5c3f4b5e-ccbf-4727-7f03-3053dedc8827"); oxExpect(ox::UUID::generate().unwrap().toString(), "90d0274a-2774-4afa-88e5-0c1d60ba3abf"); oxExpect(ox::UUID::generate().unwrap().toString(), "7df77910-841c-48ba-ea2e-44521ac47c2e"); - return OxError(0); + return ox::Error(0); } }, { @@ -467,7 +467,7 @@ OX_CLANG_NOWARN_END sv = ""; list = ox::split(sv, '.'); oxExpect(list.size(), 0u); - return OxError(0); + return ox::Error(0); } }, }; diff --git a/deps/ox/src/ox/std/trace.hpp b/deps/ox/src/ox/std/trace.hpp index b156957..d205021 100644 --- a/deps/ox/src/ox/std/trace.hpp +++ b/deps/ox/src/ox/std/trace.hpp @@ -48,12 +48,12 @@ struct TraceMsgRcv { template constexpr Error model(T *io, ox::CommonPtrWith auto *obj) noexcept { - oxReturnError(io->template setTypeInfo()); - oxReturnError(io->field("file", &obj->file)); - oxReturnError(io->field("line", &obj->line)); - oxReturnError(io->field("time", &obj->time)); - oxReturnError(io->field("ch", &obj->ch)); - oxReturnError(io->field("msg", &obj->msg)); + OX_RETURN_ERROR(io->template setTypeInfo()); + OX_RETURN_ERROR(io->field("file", &obj->file)); + OX_RETURN_ERROR(io->field("line", &obj->line)); + OX_RETURN_ERROR(io->field("time", &obj->time)); + OX_RETURN_ERROR(io->field("ch", &obj->ch)); + OX_RETURN_ERROR(io->field("msg", &obj->msg)); return {}; } @@ -69,12 +69,12 @@ struct TraceMsg { template constexpr Error model(T *io, ox::CommonPtrWith auto *obj) noexcept { - oxReturnError(io->template setTypeInfo()); - oxReturnError(io->fieldCString("file", &obj->file)); - oxReturnError(io->field("line", &obj->line)); - oxReturnError(io->field("time", &obj->time)); - oxReturnError(io->fieldCString("ch", &obj->ch)); - oxReturnError(io->field("msg", &obj->msg)); + OX_RETURN_ERROR(io->template setTypeInfo()); + OX_RETURN_ERROR(io->fieldCString("file", &obj->file)); + OX_RETURN_ERROR(io->field("line", &obj->line)); + OX_RETURN_ERROR(io->field("time", &obj->time)); + OX_RETURN_ERROR(io->fieldCString("ch", &obj->ch)); + OX_RETURN_ERROR(io->field("msg", &obj->msg)); return {}; } @@ -87,8 +87,8 @@ struct InitTraceMsgRcv { template constexpr Error model(T *io, ox::CommonPtrWith auto *obj) noexcept { - oxReturnError(io->template setTypeInfo()); - oxReturnError(io->field("appName", &obj->appName)); + OX_RETURN_ERROR(io->template setTypeInfo()); + OX_RETURN_ERROR(io->field("appName", &obj->appName)); return {}; } @@ -101,8 +101,8 @@ struct InitTraceMsg { template constexpr Error model(T *io, ox::CommonPtrWith auto *obj) noexcept { - oxReturnError(io->template setTypeInfo()); - oxReturnError(io->field("appName", &obj->appName)); + OX_RETURN_ERROR(io->template setTypeInfo()); + OX_RETURN_ERROR(io->field("appName", &obj->appName)); return {}; } diff --git a/deps/ox/src/ox/std/types.hpp b/deps/ox/src/ox/std/types.hpp index dcd2084..2e2f3c8 100644 --- a/deps/ox/src/ox/std/types.hpp +++ b/deps/ox/src/ox/std/types.hpp @@ -61,6 +61,8 @@ using uint_t = unsigned; namespace ox { +using CString = char const*; + /** * Aliases type T in size and alignment to allow allocating space for a T * without running the constructor. diff --git a/deps/ox/src/ox/std/uuid.cpp b/deps/ox/src/ox/std/uuid.cpp index 390717a..4c6a47f 100644 --- a/deps/ox/src/ox/std/uuid.cpp +++ b/deps/ox/src/ox/std/uuid.cpp @@ -21,7 +21,7 @@ void UUID::seedGenerator(const RandomSeed &seed) noexcept { // UUID v4 Result UUID::generate() noexcept { if (!s_seeded) { - return OxError(1, "UUID generator not seeded."); + return ox::Error(1, "UUID generator not seeded."); } UUID out; for (auto &v : out.m_value) { diff --git a/deps/ox/src/ox/std/uuid.hpp b/deps/ox/src/ox/std/uuid.hpp index 444a856..81a7a30 100644 --- a/deps/ox/src/ox/std/uuid.hpp +++ b/deps/ox/src/ox/std/uuid.hpp @@ -56,10 +56,10 @@ constexpr ox::Result fromHex(ox::StringViewCR v) noexcept { return out; }(); if (!detail::isHexChar(v[0]) || !detail::isHexChar(v[1])) { - return OxError(1, "Invalid UUID"); + return ox::Error(1, "Invalid UUID"); } if (v.len() != 2) { - return OxError(2); + return ox::Error(2); } uint8_t out = 0; out += static_cast(valMap[static_cast(v[0])] * 16); @@ -130,7 +130,7 @@ class UUID { static constexpr ox::Result fromString(ox::StringViewCR s) noexcept { if (s.len() < 36) { - return OxError(1, "Insufficient data to contain a complete UUID"); + return ox::Error(1, "Insufficient data to contain a complete UUID"); } UUID out; auto valueI = 0u; @@ -141,9 +141,9 @@ class UUID { } const auto seg = substr(s, i, i + 2); if (seg.len() != 2) { - return OxError(1, "Invalid UUID"); + return ox::Error(1, "Invalid UUID"); } - oxRequire(val, detail::fromHex(seg)); + OX_REQUIRE(val, detail::fromHex(seg)); out.m_value[valueI] = val; i += 2; ++valueI; @@ -175,13 +175,13 @@ class UUID { } }; printChars(writer, m_value, 4, valueI); - oxReturnError(writer.put('-')); + OX_RETURN_ERROR(writer.put('-')); printChars(writer, m_value, 2, valueI); - oxReturnError(writer.put('-')); + OX_RETURN_ERROR(writer.put('-')); printChars(writer, m_value, 2, valueI); - oxReturnError(writer.put('-')); + OX_RETURN_ERROR(writer.put('-')); printChars(writer, m_value, 2, valueI); - oxReturnError(writer.put('-')); + OX_RETURN_ERROR(writer.put('-')); printChars(writer, m_value, 6, valueI); return {}; } @@ -217,8 +217,8 @@ struct hash { template constexpr Error model(T *io, ox::CommonPtrWith auto *obj) noexcept { - oxReturnError(io->template setTypeInfo()); - oxReturnError(io->field("value", &obj->m_value)); + OX_RETURN_ERROR(io->template setTypeInfo()); + OX_RETURN_ERROR(io->field("value", &obj->m_value)); return {}; } diff --git a/deps/ox/src/ox/std/vec.cpp b/deps/ox/src/ox/std/vec.cpp index 8220cec..deac106 100644 --- a/deps/ox/src/ox/std/vec.cpp +++ b/deps/ox/src/ox/std/vec.cpp @@ -6,15 +6,13 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -#include - #include "vec.hpp" namespace ox { static_assert([] { Vec2 v(1, 2); - return v.x == 1 && v.y == 2 && v.size() == 2; + return v.x == 1 && v.y == 2; }()); } diff --git a/deps/ox/src/ox/std/vec.hpp b/deps/ox/src/ox/std/vec.hpp index 8b44ce0..7124cfb 100644 --- a/deps/ox/src/ox/std/vec.hpp +++ b/deps/ox/src/ox/std/vec.hpp @@ -12,13 +12,9 @@ #include #endif -#include -#include -#include +#include #include #include -#include -#include #include namespace ox { @@ -61,15 +57,6 @@ class Vec2 { return !operator==(v); } - explicit constexpr operator class Point() const noexcept; - - explicit constexpr operator class Size() const noexcept; - - [[nodiscard]] - constexpr std::size_t size() const noexcept { - return 2; - } - constexpr Vec2 operator+(float i) const noexcept { return {x + i, y + i}; } @@ -113,9 +100,9 @@ class Vec2 { template constexpr Error model(T *io, ox::CommonPtrWith auto *obj) noexcept { - oxReturnError(io->template setTypeInfo()); - oxReturnError(io->field("x", &obj->x)); - oxReturnError(io->field("y", &obj->y)); + OX_RETURN_ERROR(io->template setTypeInfo()); + OX_RETURN_ERROR(io->field("x", &obj->x)); + OX_RETURN_ERROR(io->field("y", &obj->y)); return {}; } diff --git a/deps/ox/src/ox/std/vector.hpp b/deps/ox/src/ox/std/vector.hpp index 7bdaf52..7c8b5e3 100644 --- a/deps/ox/src/ox/std/vector.hpp +++ b/deps/ox/src/ox/std/vector.hpp @@ -439,7 +439,7 @@ constexpr Result Vector::at(size_t i) noexcep if (i < size()) [[likely]] { return &operator[](i); } - return OxError(1, "Vector: Invalid index"); + return ox::Error(1, "Vector: Invalid index"); } template @@ -447,13 +447,13 @@ constexpr Result Vector::at(size_t i) c if (i < size()) [[likely]] { return &operator[](i); } - return OxError(1, "Vector: Invalid index"); + return ox::Error(1, "Vector: Invalid index"); } template constexpr Result Vector::front() noexcept { if (!m_size) { - return {nullptr, OxError(1)}; + return {nullptr, ox::Error(1)}; } return &m_items[0]; } @@ -461,7 +461,7 @@ constexpr Result Vector::front() noexcept { template constexpr Result Vector::front() const noexcept { if (!m_size) { - return {nullptr, OxError(1)}; + return {nullptr, ox::Error(1)}; } return &m_items[0]; } @@ -469,7 +469,7 @@ constexpr Result Vector::front() const template constexpr Result Vector::back() noexcept { if (!m_size) { - return {nullptr, OxError(1)}; + return {nullptr, ox::Error(1)}; } return &m_items[m_size - 1]; } @@ -477,7 +477,7 @@ constexpr Result Vector::back() noexcept { template constexpr Result Vector::back() const noexcept { if (!m_size) { - return {nullptr, OxError(1)}; + return {nullptr, ox::Error(1)}; } return &m_items[m_size - 1]; } @@ -634,7 +634,7 @@ template constexpr Result::template iterator> Vector::erase(std::size_t pos) noexcept(useNoexcept) { if (pos >= m_size) { - return OxError(1, "Vector::erase failed: pos is greater than Vector size"); + return ox::Error(1, "Vector::erase failed: pos is greater than Vector size"); } --m_size; for (auto i = pos; i < m_size; ++i) { @@ -648,12 +648,12 @@ template constexpr Error Vector::unordered_erase(std::size_t pos) noexcept(useNoexcept) { if (pos >= m_size) { - return OxError(1); + return ox::Error(1); } --m_size; m_items[pos] = std::move(m_items[m_size]); m_items[m_size].~T(); - return OxError(0); + return ox::Error(0); } template diff --git a/deps/ox/src/ox/std/writer.hpp b/deps/ox/src/ox/std/writer.hpp index 9f75cf0..9ac3393 100644 --- a/deps/ox/src/ox/std/writer.hpp +++ b/deps/ox/src/ox/std/writer.hpp @@ -74,10 +74,10 @@ class WriterT: public Writer_v { */ constexpr ox::Result allocate(Writer_c auto &writer, std::size_t sz) noexcept { const auto p = writer.tellp(); - oxReturnError(writer.seekp(0, ios_base::end)); + OX_RETURN_ERROR(writer.seekp(0, ios_base::end)); const auto out = writer.tellp(); - oxReturnError(writer.write(nullptr, sz)); - oxReturnError(writer.seekp(p)); + OX_RETURN_ERROR(writer.write(nullptr, sz)); + OX_RETURN_ERROR(writer.seekp(p)); return out; } diff --git a/sample_project/.nostalgia/type_descriptors/B.int32;0 b/sample_project/.nostalgia/type_descriptors/B.int32;0 index 5acc44f..c584116 100644 --- a/sample_project/.nostalgia/type_descriptors/B.int32;0 +++ b/sample_project/.nostalgia/type_descriptors/B.int32;0 @@ -2,4 +2,4 @@ O1;net.drinkingtea.ox.TypeDescriptor;1;{ "length" : 4, "primitiveType" : 1, "typeName" : "B.int32" -} +} \ No newline at end of file diff --git a/sample_project/.nostalgia/type_descriptors/B.int8;0 b/sample_project/.nostalgia/type_descriptors/B.int8;0 index a011811..2019e3c 100644 --- a/sample_project/.nostalgia/type_descriptors/B.int8;0 +++ b/sample_project/.nostalgia/type_descriptors/B.int8;0 @@ -2,4 +2,4 @@ O1;net.drinkingtea.ox.TypeDescriptor;1;{ "length" : 1, "primitiveType" : 1, "typeName" : "B.int8" -} +} \ No newline at end of file diff --git a/sample_project/.nostalgia/type_descriptors/B.string;0 b/sample_project/.nostalgia/type_descriptors/B.string;0 index f658c64..a6e483b 100644 --- a/sample_project/.nostalgia/type_descriptors/B.string;0 +++ b/sample_project/.nostalgia/type_descriptors/B.string;0 @@ -1,4 +1,4 @@ O1;net.drinkingtea.ox.TypeDescriptor;1;{ "primitiveType" : 4, "typeName" : "B.string" -} +} \ No newline at end of file diff --git a/sample_project/.nostalgia/type_descriptors/B.uint16;0 b/sample_project/.nostalgia/type_descriptors/B.uint16;0 index 1330cf9..e6addc3 100644 --- a/sample_project/.nostalgia/type_descriptors/B.uint16;0 +++ b/sample_project/.nostalgia/type_descriptors/B.uint16;0 @@ -1,4 +1,4 @@ O1;net.drinkingtea.ox.TypeDescriptor;1;{ "length" : 2, "typeName" : "B.uint16" -} +} \ No newline at end of file diff --git a/sample_project/.nostalgia/type_descriptors/B.uint64;0 b/sample_project/.nostalgia/type_descriptors/B.uint64;0 index 458ed70..78dfe05 100644 --- a/sample_project/.nostalgia/type_descriptors/B.uint64;0 +++ b/sample_project/.nostalgia/type_descriptors/B.uint64;0 @@ -1,4 +1,4 @@ O1;net.drinkingtea.ox.TypeDescriptor;1;{ "length" : 8, "typeName" : "B.uint64" -} +} \ No newline at end of file diff --git a/sample_project/.nostalgia/type_descriptors/B.uint8;0 b/sample_project/.nostalgia/type_descriptors/B.uint8;0 index 44d41b3..f7bad11 100644 --- a/sample_project/.nostalgia/type_descriptors/B.uint8;0 +++ b/sample_project/.nostalgia/type_descriptors/B.uint8;0 @@ -1,4 +1,4 @@ O1;net.drinkingtea.ox.TypeDescriptor;1;{ "length" : 1, "typeName" : "B.uint8" -} +} \ No newline at end of file diff --git a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.CompactPalette;1 b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.CompactPalette;1 index 4d2d0bc..d8c2caf 100644 --- a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.CompactPalette;1 +++ b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.CompactPalette;1 @@ -20,4 +20,4 @@ O1;net.drinkingtea.ox.TypeDescriptor;1;{ "primitiveType" : 5, "typeName" : "net.drinkingtea.nostalgia.core.CompactPalette", "typeVersion" : 1 -} +} \ No newline at end of file diff --git a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.CompactTileSheet;1 b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.CompactTileSheet;1 index bb9db51..dd0c514 100644 --- a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.CompactTileSheet;1 +++ b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.CompactTileSheet;1 @@ -25,4 +25,4 @@ O1;net.drinkingtea.ox.TypeDescriptor;1;{ "primitiveType" : 5, "typeName" : "net.drinkingtea.nostalgia.core.CompactTileSheet", "typeVersion" : 1 -} +} \ No newline at end of file diff --git a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.NostalgiaGraphic;1 b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.NostalgiaGraphic;1 index 1427537..2684c4f 100644 --- a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.NostalgiaGraphic;1 +++ b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.NostalgiaGraphic;1 @@ -36,4 +36,4 @@ O1;net.drinkingtea.ox.TypeDescriptor;1;{ "primitiveType" : 5, "typeName" : "net.drinkingtea.nostalgia.core.NostalgiaGraphic", "typeVersion" : 1 -} +} \ No newline at end of file diff --git a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.Palette.ColorInfo;3 b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.Palette.ColorInfo;3 index 1c2ad7d..a149b43 100644 --- a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.Palette.ColorInfo;3 +++ b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.Palette.ColorInfo;3 @@ -9,4 +9,4 @@ O1;net.drinkingtea.ox.TypeDescriptor;1;{ "primitiveType" : 5, "typeName" : "net.drinkingtea.nostalgia.core.Palette.ColorInfo", "typeVersion" : 3 -} +} \ No newline at end of file diff --git a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.Palette.PalettePage;1 b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.Palette.PalettePage;1 index 503ed99..0135632 100644 --- a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.Palette.PalettePage;1 +++ b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.Palette.PalettePage;1 @@ -20,4 +20,4 @@ O1;net.drinkingtea.ox.TypeDescriptor;1;{ "primitiveType" : 5, "typeName" : "net.drinkingtea.nostalgia.core.Palette.PalettePage", "typeVersion" : 1 -} +} \ No newline at end of file diff --git a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.Palette;1 b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.Palette;1 index 0336e78..5bcee5a 100644 --- a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.Palette;1 +++ b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.Palette;1 @@ -16,4 +16,4 @@ O1;net.drinkingtea.ox.TypeDescriptor;1;{ "primitiveType" : 5, "typeName" : "net.drinkingtea.nostalgia.core.Palette", "typeVersion" : 1 -} +} \ No newline at end of file diff --git a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.Palette;2 b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.Palette;2 index eb0ad42..93fbc82 100644 --- a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.Palette;2 +++ b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.Palette;2 @@ -20,4 +20,4 @@ O1;net.drinkingtea.ox.TypeDescriptor;1;{ "primitiveType" : 5, "typeName" : "net.drinkingtea.nostalgia.core.Palette", "typeVersion" : 2 -} +} \ No newline at end of file diff --git a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.Palette;3 b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.Palette;3 index 56f85fc..3438dc0 100644 --- a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.Palette;3 +++ b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.Palette;3 @@ -31,4 +31,4 @@ O1;net.drinkingtea.ox.TypeDescriptor;1;{ "primitiveType" : 5, "typeName" : "net.drinkingtea.nostalgia.core.Palette", "typeVersion" : 3 -} +} \ No newline at end of file diff --git a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.Palette;4 b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.Palette;4 index 9aff393..668216e 100644 --- a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.Palette;4 +++ b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.Palette;4 @@ -28,4 +28,4 @@ O1;net.drinkingtea.ox.TypeDescriptor;1;{ "primitiveType" : 5, "typeName" : "net.drinkingtea.nostalgia.core.Palette", "typeVersion" : 4 -} +} \ No newline at end of file diff --git a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.PaletteColor;1 b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.PaletteColor;1 index 816e719..d9d6aac 100644 --- a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.PaletteColor;1 +++ b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.PaletteColor;1 @@ -21,4 +21,4 @@ O1;net.drinkingtea.ox.TypeDescriptor;1;{ "primitiveType" : 5, "typeName" : "net.drinkingtea.nostalgia.core.PaletteColor", "typeVersion" : 1 -} +} \ No newline at end of file diff --git a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.TileSheet.SubSheet;1 b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.TileSheet.SubSheet;1 index 949b965..b32cb2b 100644 --- a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.TileSheet.SubSheet;1 +++ b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.TileSheet.SubSheet;1 @@ -39,4 +39,4 @@ O1;net.drinkingtea.ox.TypeDescriptor;1;{ "primitiveType" : 5, "typeName" : "net.drinkingtea.nostalgia.core.TileSheet.SubSheet", "typeVersion" : 1 -} +} \ No newline at end of file diff --git a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.TileSheet.SubSheet;3 b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.TileSheet.SubSheet;3 index 01125bb..26bf5d6 100644 --- a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.TileSheet.SubSheet;3 +++ b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.TileSheet.SubSheet;3 @@ -39,4 +39,4 @@ O1;net.drinkingtea.ox.TypeDescriptor;1;{ "primitiveType" : 5, "typeName" : "net.drinkingtea.nostalgia.core.TileSheet.SubSheet", "typeVersion" : 3 -} +} \ No newline at end of file diff --git a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.TileSheet.SubSheet;4 b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.TileSheet.SubSheet;4 index 185778a..78d1d7b 100644 --- a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.TileSheet.SubSheet;4 +++ b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.TileSheet.SubSheet;4 @@ -43,4 +43,4 @@ O1;net.drinkingtea.ox.TypeDescriptor;1;{ "primitiveType" : 5, "typeName" : "net.drinkingtea.nostalgia.core.TileSheet.SubSheet", "typeVersion" : 4 -} +} \ No newline at end of file diff --git a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.TileSheet;2 b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.TileSheet;2 index 17be8f6..4d55e8e 100644 --- a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.TileSheet;2 +++ b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.TileSheet;2 @@ -17,4 +17,4 @@ O1;net.drinkingtea.ox.TypeDescriptor;1;{ "primitiveType" : 5, "typeName" : "net.drinkingtea.nostalgia.core.TileSheet", "typeVersion" : 2 -} +} \ No newline at end of file diff --git a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.TileSheet;3 b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.TileSheet;3 index 3bb3448..75c7523 100644 --- a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.TileSheet;3 +++ b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.TileSheet;3 @@ -21,4 +21,4 @@ O1;net.drinkingtea.ox.TypeDescriptor;1;{ "primitiveType" : 5, "typeName" : "net.drinkingtea.nostalgia.core.TileSheet", "typeVersion" : 3 -} +} \ No newline at end of file diff --git a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.TileSheet;4 b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.TileSheet;4 index 9dc2b45..4acb515 100644 --- a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.TileSheet;4 +++ b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.core.TileSheet;4 @@ -21,4 +21,4 @@ O1;net.drinkingtea.ox.TypeDescriptor;1;{ "primitiveType" : 5, "typeName" : "net.drinkingtea.nostalgia.core.TileSheet", "typeVersion" : 4 -} +} \ No newline at end of file diff --git a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.scene.SceneDoc;1 b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.scene.SceneDoc;1 index 07dabd5..f1fa0e3 100644 --- a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.scene.SceneDoc;1 +++ b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.scene.SceneDoc;1 @@ -38,4 +38,4 @@ O1;net.drinkingtea.ox.TypeDescriptor;1;{ "primitiveType" : 5, "typeName" : "net.drinkingtea.nostalgia.scene.SceneDoc", "typeVersion" : 1 -} +} \ No newline at end of file diff --git a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.scene.SceneStatic;1 b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.scene.SceneStatic;1 index 8482e49..0927645 100644 --- a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.scene.SceneStatic;1 +++ b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.scene.SceneStatic;1 @@ -85,4 +85,4 @@ O1;net.drinkingtea.ox.TypeDescriptor;1;{ "primitiveType" : 5, "typeName" : "net.drinkingtea.nostalgia.scene.SceneStatic", "typeVersion" : 1 -} +} \ No newline at end of file diff --git a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.scene.TileDoc;1 b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.scene.TileDoc;1 index 3853479..5a7fa3d 100644 --- a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.scene.TileDoc;1 +++ b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.nostalgia.scene.TileDoc;1 @@ -30,4 +30,4 @@ O1;net.drinkingtea.ox.TypeDescriptor;1;{ "primitiveType" : 5, "typeName" : "net.drinkingtea.nostalgia.scene.TileDoc", "typeVersion" : 1 -} +} \ No newline at end of file diff --git a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.ox.BasicString#8#;1 b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.ox.BasicString#8#;1 index dc047dc..e267752 100644 --- a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.ox.BasicString#8#;1 +++ b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.ox.BasicString#8#;1 @@ -6,4 +6,4 @@ O1;net.drinkingtea.ox.TypeDescriptor;1;{ "8" ], "typeVersion" : 1 -} +} \ No newline at end of file diff --git a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.ox.FileAddress.Data;1 b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.ox.FileAddress.Data;1 index cb981fa..32e1824 100644 --- a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.ox.FileAddress.Data;1 +++ b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.ox.FileAddress.Data;1 @@ -17,4 +17,4 @@ O1;net.drinkingtea.ox.TypeDescriptor;1;{ "primitiveType" : 6, "typeName" : "net.drinkingtea.ox.FileAddress.Data", "typeVersion" : 1 -} +} \ No newline at end of file diff --git a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.ox.FileAddress;1 b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.ox.FileAddress;1 index 43361af..e30b37b 100644 --- a/sample_project/.nostalgia/type_descriptors/net.drinkingtea.ox.FileAddress;1 +++ b/sample_project/.nostalgia/type_descriptors/net.drinkingtea.ox.FileAddress;1 @@ -13,4 +13,4 @@ O1;net.drinkingtea.ox.TypeDescriptor;1;{ "primitiveType" : 5, "typeName" : "net.drinkingtea.ox.FileAddress", "typeVersion" : 1 -} +} \ No newline at end of file diff --git a/src/nostalgia/modules/core/include/nostalgia/core/gfx.hpp b/src/nostalgia/modules/core/include/nostalgia/core/gfx.hpp index 88b0f98..a22461a 100644 --- a/src/nostalgia/modules/core/include/nostalgia/core/gfx.hpp +++ b/src/nostalgia/modules/core/include/nostalgia/core/gfx.hpp @@ -32,18 +32,18 @@ struct Sprite { unsigned priority = 0; }; -oxModelBegin(Sprite) - oxModelField(idx) - oxModelField(x) - oxModelField(y) - oxModelField(enabled) - oxModelField(tileIdx) - oxModelField(spriteShape) - oxModelField(spriteSize) - oxModelField(flipX) - oxModelField(bpp) - oxModelField(priority) -oxModelEnd() +OX_MODEL_BEGIN(Sprite) + OX_MODEL_FIELD(idx) + OX_MODEL_FIELD(x) + OX_MODEL_FIELD(y) + OX_MODEL_FIELD(enabled) + OX_MODEL_FIELD(tileIdx) + OX_MODEL_FIELD(spriteShape) + OX_MODEL_FIELD(spriteSize) + OX_MODEL_FIELD(flipX) + OX_MODEL_FIELD(bpp) + OX_MODEL_FIELD(priority) +OX_MODEL_END() struct BgTile { static constexpr auto TypeName = "net.drinkingtea.nostalgia.core.BgTile"; @@ -54,12 +54,12 @@ struct BgTile { unsigned flipY = false; }; -oxModelBegin(BgTile) - oxModelField(tileIdx) - oxModelField(palBank) - oxModelField(horizontalFlip) - oxModelField(verticalFlip) -oxModelEnd() +OX_MODEL_BEGIN(BgTile) + OX_MODEL_FIELD(tileIdx) + OX_MODEL_FIELD(palBank) + OX_MODEL_FIELD(horizontalFlip) + OX_MODEL_FIELD(verticalFlip) +OX_MODEL_END() struct TileSheetSetEntrySection { static constexpr auto TypeName = "net.drinkingtea.nostalgia.core.TileSheetSetEntrySection"; @@ -72,10 +72,10 @@ struct TileSheetSetEntrySection { } }; -oxModelBegin(TileSheetSetEntrySection) - oxModelField(begin) - oxModelField(tiles) -oxModelEnd() +OX_MODEL_BEGIN(TileSheetSetEntrySection) + OX_MODEL_FIELD(begin) + OX_MODEL_FIELD(tiles) +OX_MODEL_END() struct TileSheetSetEntry { static constexpr auto TypeName = "net.drinkingtea.nostalgia.core.TileSheetSetEntry"; @@ -84,10 +84,10 @@ struct TileSheetSetEntry { ox::Vector sections; }; -oxModelBegin(TileSheetSetEntry) - oxModelField(tilesheet) - oxModelField(sections) -oxModelEnd() +OX_MODEL_BEGIN(TileSheetSetEntry) + OX_MODEL_FIELD(tilesheet) + OX_MODEL_FIELD(sections) +OX_MODEL_END() struct TileSheetSet { static constexpr auto TypeName = "net.drinkingtea.nostalgia.core.TileSheetSet"; @@ -97,10 +97,10 @@ struct TileSheetSet { ox::Vector entries; }; -oxModelBegin(TileSheetSet) - oxModelField(bpp) - oxModelField(entries) -oxModelEnd() +OX_MODEL_BEGIN(TileSheetSet) + OX_MODEL_FIELD(bpp) + OX_MODEL_FIELD(entries) +OX_MODEL_END() void addEntry(TileSheetSet &set, ox::FileAddress path, int32_t begin = 0, int32_t size = -1) noexcept; diff --git a/src/nostalgia/modules/core/include/nostalgia/core/palette.hpp b/src/nostalgia/modules/core/include/nostalgia/core/palette.hpp index 2550ba3..8da07c4 100644 --- a/src/nostalgia/modules/core/include/nostalgia/core/palette.hpp +++ b/src/nostalgia/modules/core/include/nostalgia/core/palette.hpp @@ -26,12 +26,12 @@ struct PaletteColorV1 { constexpr operator Color16() const noexcept { return color16(r, g, b, a); } }; -oxModelBegin(PaletteColorV1) - oxModelField(r) - oxModelField(g) - oxModelField(b) - oxModelField(a) -oxModelEnd() +OX_MODEL_BEGIN(PaletteColorV1) + OX_MODEL_FIELD(r) + OX_MODEL_FIELD(g) + OX_MODEL_FIELD(b) + OX_MODEL_FIELD(a) +OX_MODEL_END() using PaletteColor = PaletteColorV1; @@ -53,10 +53,10 @@ struct PalettePageV1 { } }; -oxModelBegin(PalettePageV1) - oxModelField(name) - oxModelField(colors) -oxModelEnd() +OX_MODEL_BEGIN(PalettePageV1) + OX_MODEL_FIELD(name) + OX_MODEL_FIELD(colors) +OX_MODEL_END() using PalettePage = PalettePageV1; @@ -67,9 +67,9 @@ struct NostalgiaPalette { ox::Vector colors = {}; }; -oxModelBegin(NostalgiaPalette) - oxModelField(colors) -oxModelEnd() +OX_MODEL_BEGIN(NostalgiaPalette) + OX_MODEL_FIELD(colors) +OX_MODEL_END() struct PaletteV1 { @@ -78,9 +78,9 @@ struct PaletteV1 { ox::Vector colors; }; -oxModelBegin(PaletteV1) - oxModelField(colors) -oxModelEnd() +OX_MODEL_BEGIN(PaletteV1) + OX_MODEL_FIELD(colors) +OX_MODEL_END() struct PaletteV2 { @@ -90,9 +90,9 @@ struct PaletteV2 { ox::Vector> pages; }; -oxModelBegin(PaletteV2) - oxModelField(pages) -oxModelEnd() +OX_MODEL_BEGIN(PaletteV2) + OX_MODEL_FIELD(pages) +OX_MODEL_END() struct PaletteV3 { @@ -110,14 +110,14 @@ struct PaletteV3 { ox::Vector> pages; }; -oxModelBegin(PaletteV3::ColorInfo) - oxModelField(name) -oxModelEnd() +OX_MODEL_BEGIN(PaletteV3::ColorInfo) + OX_MODEL_FIELD(name) +OX_MODEL_END() -oxModelBegin(PaletteV3) - oxModelField(colorInfo) - oxModelField(pages) -oxModelEnd() +OX_MODEL_BEGIN(PaletteV3) + OX_MODEL_FIELD(colorInfo) + OX_MODEL_FIELD(pages) +OX_MODEL_END() [[nodiscard]] constexpr bool valid(PaletteV3 const&p) noexcept { @@ -144,10 +144,10 @@ struct PaletteV4 { ox::Vector pages; }; -oxModelBegin(PaletteV4) - oxModelField(colorNames) - oxModelField(pages) -oxModelEnd() +OX_MODEL_BEGIN(PaletteV4) + OX_MODEL_FIELD(colorNames) + OX_MODEL_FIELD(pages) +OX_MODEL_END() [[nodiscard]] constexpr bool valid(PaletteV4 const&p) noexcept { @@ -176,9 +176,9 @@ struct CompactPaletteV1 { ox::Vector> pages{}; }; -oxModelBegin(CompactPaletteV1) - oxModelField(pages) -oxModelEnd() +OX_MODEL_BEGIN(CompactPaletteV1) + OX_MODEL_FIELD(pages) +OX_MODEL_END() [[nodiscard]] constexpr bool valid(CompactPaletteV1 const&p) noexcept { diff --git a/src/nostalgia/modules/core/include/nostalgia/core/tilesheet.hpp b/src/nostalgia/modules/core/include/nostalgia/core/tilesheet.hpp index 9821cc4..bbb7aca 100644 --- a/src/nostalgia/modules/core/include/nostalgia/core/tilesheet.hpp +++ b/src/nostalgia/modules/core/include/nostalgia/core/tilesheet.hpp @@ -96,7 +96,7 @@ constexpr void repair(TileSheetV2::SubSheet &ss, int bpp) noexcept { constexpr ox::Error repair(TileSheetV2 &ts) noexcept { if (ts.bpp != 4 && ts.bpp != 8) { - return OxError(1, "Unable to repair TileSheet"); + return ox::Error(1, "Unable to repair TileSheet"); } repair(ts.subsheet, ts.bpp); return {}; @@ -166,7 +166,7 @@ constexpr void repair(TileSheetV3::SubSheet &ss, int bpp) noexcept { constexpr ox::Error repair(TileSheetV3 &ts) noexcept { if (ts.bpp != 4 && ts.bpp != 8) { - return OxError(1, "Unable to repair TileSheet"); + return ox::Error(1, "Unable to repair TileSheet"); } repair(ts.subsheet, ts.bpp); return {}; @@ -254,7 +254,7 @@ constexpr void repair(TileSheetV4::SubSheet &ss, int bpp) noexcept { constexpr ox::Error repair(TileSheetV4 &ts) noexcept { if (ts.bpp != 4 && ts.bpp != 8) { - return OxError(1, "Unable to repair TileSheet"); + return ox::Error(1, "Unable to repair TileSheet"); } repair(ts.subsheet, ts.bpp); return {}; @@ -437,65 +437,65 @@ ox::Pair get2Pixels8Bpp( CompactTileSheet const&ts, size_t idx) noexcept; -oxModelBegin(TileSheetV1) - oxModelField(bpp) - oxModelField(rows) - oxModelField(columns) - oxModelField(defaultPalette) - oxModelField(pal) - oxModelField(pixels) -oxModelEnd() +OX_MODEL_BEGIN(TileSheetV1) + OX_MODEL_FIELD(bpp) + OX_MODEL_FIELD(rows) + OX_MODEL_FIELD(columns) + OX_MODEL_FIELD(defaultPalette) + OX_MODEL_FIELD(pal) + OX_MODEL_FIELD(pixels) +OX_MODEL_END() -oxModelBegin(TileSheetV2::SubSheet) - oxModelField(name) - oxModelField(rows) - oxModelField(columns) - oxModelField(subsheets) - oxModelField(pixels) -oxModelEnd() +OX_MODEL_BEGIN(TileSheetV2::SubSheet) + OX_MODEL_FIELD(name) + OX_MODEL_FIELD(rows) + OX_MODEL_FIELD(columns) + OX_MODEL_FIELD(subsheets) + OX_MODEL_FIELD(pixels) +OX_MODEL_END() -oxModelBegin(TileSheetV2) - oxModelField(bpp) - oxModelField(defaultPalette) - oxModelField(subsheet) -oxModelEnd() +OX_MODEL_BEGIN(TileSheetV2) + OX_MODEL_FIELD(bpp) + OX_MODEL_FIELD(defaultPalette) + OX_MODEL_FIELD(subsheet) +OX_MODEL_END() -oxModelBegin(TileSheetV3::SubSheet) - oxModelField(name) - oxModelField(rows) - oxModelField(columns) - oxModelField(subsheets) - oxModelField(pixels) -oxModelEnd() +OX_MODEL_BEGIN(TileSheetV3::SubSheet) + OX_MODEL_FIELD(name) + OX_MODEL_FIELD(rows) + OX_MODEL_FIELD(columns) + OX_MODEL_FIELD(subsheets) + OX_MODEL_FIELD(pixels) +OX_MODEL_END() -oxModelBegin(TileSheetV3) - oxModelField(bpp) - oxModelField(idIt) - oxModelField(defaultPalette) - oxModelField(subsheet) -oxModelEnd() +OX_MODEL_BEGIN(TileSheetV3) + OX_MODEL_FIELD(bpp) + OX_MODEL_FIELD(idIt) + OX_MODEL_FIELD(defaultPalette) + OX_MODEL_FIELD(subsheet) +OX_MODEL_END() -oxModelBegin(TileSheetV4::SubSheet) - oxModelField(id) - oxModelField(name) - oxModelField(rows) - oxModelField(columns) - oxModelField(subsheets) - oxModelField(pixels) -oxModelEnd() +OX_MODEL_BEGIN(TileSheetV4::SubSheet) + OX_MODEL_FIELD(id) + OX_MODEL_FIELD(name) + OX_MODEL_FIELD(rows) + OX_MODEL_FIELD(columns) + OX_MODEL_FIELD(subsheets) + OX_MODEL_FIELD(pixels) +OX_MODEL_END() -oxModelBegin(TileSheetV4) - oxModelField(bpp) - oxModelField(idIt) - oxModelField(defaultPalette) - oxModelField(subsheet) -oxModelEnd() +OX_MODEL_BEGIN(TileSheetV4) + OX_MODEL_FIELD(bpp) + OX_MODEL_FIELD(idIt) + OX_MODEL_FIELD(defaultPalette) + OX_MODEL_FIELD(subsheet) +OX_MODEL_END() -oxModelBegin(CompactTileSheetV1) - oxModelField(bpp) - oxModelField(defaultPalette) - oxModelField(pixels) -oxModelEnd() +OX_MODEL_BEGIN(CompactTileSheetV1) + OX_MODEL_FIELD(bpp) + OX_MODEL_FIELD(defaultPalette) + OX_MODEL_FIELD(pixels) +OX_MODEL_END() ox::Vector resizeTileSheetData( ox::Vector const&srcPixels, diff --git a/src/nostalgia/modules/core/src/gba/context.cpp b/src/nostalgia/modules/core/src/gba/context.cpp index 2d99f86..69f7c40 100644 --- a/src/nostalgia/modules/core/src/gba/context.cpp +++ b/src/nostalgia/modules/core/src/gba/context.cpp @@ -21,7 +21,7 @@ ox::Error initGfx(Context &ctx, InitParams const&) noexcept; ox::Result init(turbine::Context &tctx, InitParams const¶ms) noexcept { auto ctx = ox::make_unique(tctx); - oxReturnError(initGfx(*ctx, params)); + OX_RETURN_ERROR(initGfx(*ctx, params)); return ContextUPtr(std::move(ctx)); } diff --git a/src/nostalgia/modules/core/src/gba/gfx.cpp b/src/nostalgia/modules/core/src/gba/gfx.cpp index db0256b..de6084b 100644 --- a/src/nostalgia/modules/core/src/gba/gfx.cpp +++ b/src/nostalgia/modules/core/src/gba/gfx.cpp @@ -70,9 +70,9 @@ static ox::Error loadTileSheetSet( size_t tileWriteIdx = 0; size_t const bppMod = set.bpp == 4; for (auto const&entry : set.entries) { - oxRequire(ts, keel::readObj(keelCtx(ctx), entry.tilesheet)); + OX_REQUIRE(ts, keel::readObj(keelCtx(ctx), entry.tilesheet)); if (set.bpp != ts->bpp && ts->bpp == 8) { - return OxError(1, "cannot load an 8 BPP tilesheet into a 4 BPP CBB"); + return ox::Error(1, "cannot load an 8 BPP tilesheet into a 4 BPP CBB"); } for (auto const&s : entry.sections) { auto const cnt = (static_cast(s.tiles) * PixelsPerTile) >> bppMod; @@ -138,7 +138,7 @@ ox::Error loadBgTileSheet( } }); if (paletteBank.has_value() && ts.defaultPalette) { - oxReturnError(loadBgPalette(ctx, *paletteBank, ts.defaultPalette)); + OX_RETURN_ERROR(loadBgPalette(ctx, *paletteBank, ts.defaultPalette)); } return {}; } @@ -148,7 +148,7 @@ ox::Error loadBgTileSheet( unsigned const cbb, TileSheetSet const&set) noexcept { auto const bpp = static_cast(set.bpp); - oxReturnError(loadTileSheetSet(ctx, MEM_BG_TILES[cbb], set)); + OX_RETURN_ERROR(loadTileSheetSet(ctx, MEM_BG_TILES[cbb], set)); // update bpp of all bgs with the updated cbb ctx.cbbData[cbb].bpp = bpp; teagba::iterateBgCtl([bpp, cbb](volatile BgCtl &bgCtl) { @@ -178,7 +178,7 @@ ox::Error loadSpriteTileSheet( MEM_SPRITE_TILES[i] = v; } if (loadDefaultPalette && ts.defaultPalette) { - oxReturnError(loadSpritePalette(ctx, ts.defaultPalette)); + OX_RETURN_ERROR(loadSpritePalette(ctx, ts.defaultPalette)); } setSpritesBpp(static_cast(ts.bpp)); return {}; @@ -188,7 +188,7 @@ ox::Error loadSpriteTileSheet( Context &ctx, TileSheetSet const&set) noexcept { auto const bpp = static_cast(set.bpp); - oxReturnError(loadTileSheetSet(ctx, {MEM_SPRITE_TILES, 32 * ox::units::KB}, set)); + OX_RETURN_ERROR(loadTileSheetSet(ctx, {MEM_SPRITE_TILES, 32 * ox::units::KB}, set)); setSpritesBpp(bpp); return {}; } diff --git a/src/nostalgia/modules/core/src/gfx.cpp b/src/nostalgia/modules/core/src/gfx.cpp index c0ecf50..94f8eb6 100644 --- a/src/nostalgia/modules/core/src/gfx.cpp +++ b/src/nostalgia/modules/core/src/gfx.cpp @@ -22,7 +22,7 @@ ox::Error loadBgPalette( Context &ctx, size_t palBank, ox::StringViewCR palettePath) noexcept { - oxRequire(pal, keel::readObj(keelCtx(ctx), palettePath)); + OX_REQUIRE(pal, keel::readObj(keelCtx(ctx), palettePath)); return loadBgPalette(ctx, palBank, *pal, 0); } @@ -30,21 +30,21 @@ ox::Error loadBgPalette( Context &ctx, size_t palBank, ox::FileAddress const&paletteAddr) noexcept { - oxRequire(pal, keel::readObj(keelCtx(ctx), paletteAddr)); + OX_REQUIRE(pal, keel::readObj(keelCtx(ctx), paletteAddr)); return loadBgPalette(ctx, palBank, *pal, 0); } ox::Error loadSpritePalette( Context &ctx, ox::StringViewCR palettePath) noexcept { - oxRequire(pal, keel::readObj(keelCtx(ctx), palettePath)); + OX_REQUIRE(pal, keel::readObj(keelCtx(ctx), palettePath)); return loadSpritePalette(ctx, *pal, 0); } ox::Error loadSpritePalette( Context &ctx, ox::FileAddress const&paletteAddr) noexcept { - oxRequire(pal, keel::readObj(keelCtx(ctx), paletteAddr)); + OX_REQUIRE(pal, keel::readObj(keelCtx(ctx), paletteAddr)); return loadSpritePalette(ctx, *pal, 0); } @@ -55,7 +55,7 @@ ox::Error loadBgTileSheet( size_t dstTileIdx, size_t srcTileIdx, size_t tileCnt) noexcept { - oxRequire(ts, keel::readObj(keelCtx(ctx), tsAddr)); + OX_REQUIRE(ts, keel::readObj(keelCtx(ctx), tsAddr)); return loadBgTileSheet(ctx, cbb, *ts, dstTileIdx, srcTileIdx, tileCnt); } @@ -66,7 +66,7 @@ ox::Error loadBgTileSheet( size_t dstTileIdx, size_t srcTileIdx, size_t tileCnt) noexcept { - oxRequire(ts, keel::readObj(keelCtx(ctx), tsPath)); + OX_REQUIRE(ts, keel::readObj(keelCtx(ctx), tsPath)); return loadBgTileSheet(ctx, cbb, *ts, dstTileIdx, srcTileIdx, tileCnt); } @@ -75,7 +75,7 @@ ox::Error loadBgTileSheet( unsigned cbb, ox::StringViewCR tilesheetPath, ox::Optional const&paletteBank) noexcept { - oxRequire(ts, keel::readObj(keelCtx(ctx), tilesheetPath)); + OX_REQUIRE(ts, keel::readObj(keelCtx(ctx), tilesheetPath)); return loadBgTileSheet(ctx, cbb, *ts, paletteBank); } @@ -84,7 +84,7 @@ ox::Error loadBgTileSheet( unsigned cbb, ox::FileAddress const&tilesheetAddr, ox::Optional const&paletteBank) noexcept { - oxRequire(ts, keel::readObj(keelCtx(ctx), tilesheetAddr)); + OX_REQUIRE(ts, keel::readObj(keelCtx(ctx), tilesheetAddr)); return loadBgTileSheet(ctx, cbb, *ts, paletteBank); } @@ -92,7 +92,7 @@ ox::Error loadSpriteTileSheet( Context &ctx, ox::StringViewCR tilesheetPath, bool loadDefaultPalette) noexcept { - oxRequire(ts, readObj(keelCtx(ctx), tilesheetPath)); + OX_REQUIRE(ts, readObj(keelCtx(ctx), tilesheetPath)); return loadSpriteTileSheet(ctx, *ts, loadDefaultPalette); } @@ -100,7 +100,7 @@ ox::Error loadSpriteTileSheet( Context &ctx, ox::FileAddress const&tilesheetAddr, bool loadDefaultPalette) noexcept { - oxRequire(ts, readObj(keelCtx(ctx), tilesheetAddr)); + OX_REQUIRE(ts, readObj(keelCtx(ctx), tilesheetAddr)); return loadSpriteTileSheet(ctx, *ts, loadDefaultPalette); } @@ -247,7 +247,7 @@ ox::Error initConsole(Context &ctx) noexcept { constexpr ox::FileAddress PaletteAddr = ox::StringLiteral("/Palettes/Charset.npal"); setBgStatus(ctx, 0b0001); setBgCbb(ctx, 0, 0); - oxReturnError(loadBgTileSheet(ctx, 0, TilesheetAddr)); + OX_RETURN_ERROR(loadBgTileSheet(ctx, 0, TilesheetAddr)); return loadBgPalette(ctx, 0, PaletteAddr); } diff --git a/src/nostalgia/modules/core/src/keel/keelmodule.cpp b/src/nostalgia/modules/core/src/keel/keelmodule.cpp index 29f829e..d67b783 100644 --- a/src/nostalgia/modules/core/src/keel/keelmodule.cpp +++ b/src/nostalgia/modules/core/src/keel/keelmodule.cpp @@ -72,7 +72,7 @@ static class: public keel::Module { typeId == ox::ModelTypeId_v || typeId == ox::ModelTypeId_v || typeId == ox::ModelTypeId_v) { - oxReturnError(keel::convertBuffToBuff( + OX_RETURN_ERROR(keel::convertBuffToBuff( ctx, buff, ox::ClawFormat::Metal).moveTo(buff)); return true; } @@ -81,10 +81,10 @@ static class: public keel::Module { [](keel::Context &ctx, ox::Buffer &buff, ox::StringView typeId) -> ox::Result { if (typeId == ox::ModelTypeId_v || typeId == ox::ModelTypeId_v || - typeId == ox::ModelTypeId_v || - typeId == ox::ModelTypeId_v || - typeId == ox::ModelTypeId_v) { - oxReturnError(keel::convertBuffToBuff( + typeId == ox::ModelTypeId_v || + typeId == ox::ModelTypeId_v || + typeId == ox::ModelTypeId_v) { + OX_RETURN_ERROR(keel::convertBuffToBuff( ctx, buff, ox::ClawFormat::Metal).moveTo(buff)); return true; } @@ -92,7 +92,7 @@ static class: public keel::Module { }, }; } -} mod; +} const mod; keel::Module const*keelModule() noexcept { return &mod; diff --git a/src/nostalgia/modules/core/src/opengl/context.cpp b/src/nostalgia/modules/core/src/opengl/context.cpp index 8f41030..9d0cbc6 100644 --- a/src/nostalgia/modules/core/src/opengl/context.cpp +++ b/src/nostalgia/modules/core/src/opengl/context.cpp @@ -25,7 +25,7 @@ Context::~Context() noexcept { ox::Result init(turbine::Context &tctx, InitParams const¶ms) noexcept { auto ctx = ox::make_unique(tctx, params); - oxReturnError(initGfx(*ctx, params)); + OX_RETURN_ERROR(initGfx(*ctx, params)); return ContextUPtr(ctx.release()); } diff --git a/src/nostalgia/modules/core/src/opengl/gfx.cpp b/src/nostalgia/modules/core/src/opengl/gfx.cpp index efe06de..e8bbba2 100644 --- a/src/nostalgia/modules/core/src/opengl/gfx.cpp +++ b/src/nostalgia/modules/core/src/opengl/gfx.cpp @@ -464,8 +464,8 @@ ox::Error initGfx( const auto bgFshad = ox::sfmt(renderer::bgfshadTmpl, gl::GlslVersion); const auto spriteVshad = ox::sfmt(renderer::spritevshadTmpl, gl::GlslVersion); const auto spriteFshad = ox::sfmt(renderer::spritefshadTmpl, gl::GlslVersion); - oxReturnError(glutils::buildShaderProgram(bgVshad, bgFshad).moveTo(ctx.bgShader)); - oxReturnError( + OX_RETURN_ERROR(glutils::buildShaderProgram(bgVshad, bgFshad).moveTo(ctx.bgShader)); + OX_RETURN_ERROR( glutils::buildShaderProgram(spriteVshad, spriteFshad).moveTo(ctx.spriteShader)); for (auto &cbb : ctx.cbbs) { initBackgroundBufferset(ctx.bgShader, cbb); @@ -538,8 +538,8 @@ static ox::Result buildSetTsd( TileSheetData setTsd; setTsd.width = TileWidth; for (auto const&entry : set.entries) { - oxRequire(tilesheet, readObj(kctx, entry.tilesheet)); - oxRequire(tsd, normalizeTileSheet(*tilesheet)); + OX_REQUIRE(tilesheet, readObj(kctx, entry.tilesheet)); + OX_REQUIRE(tsd, normalizeTileSheet(*tilesheet)); for (auto const&s : entry.sections) { auto const size = s.tiles * PixelsPerTile; for (auto i = 0; i < size; ++i) { @@ -586,7 +586,7 @@ ox::Error loadBgTileSheet( auto const srcPxIdx = srcTileIdx * PixelsPerTile; auto const dstPxIdx = dstTileIdx * PixelsPerTile; if (dstPxIdx + pxlCnt >= cbbPxls.size()) { - return OxError(1, "video mem dst overflow"); + return ox::Error(1, "video mem dst overflow"); } auto const dst = ox::Span{cbbPxls} + dstPxIdx; copyPixels(ts, dst, srcPxIdx, pxlCnt); @@ -604,9 +604,9 @@ ox::Error loadBgTileSheet( ox::Optional const&paletteBank) noexcept { auto const bytesPerTile = static_cast(PixelsPerTile / (1 + (ts.bpp == 4))); auto const tiles = ts.pixels.size() / bytesPerTile; - oxReturnError(loadBgTileSheet(ctx, cbb, ts, 0, 0, tiles)); + OX_RETURN_ERROR(loadBgTileSheet(ctx, cbb, ts, 0, 0, tiles)); if (paletteBank.has_value() && ts.defaultPalette) { - oxReturnError(loadBgPalette(ctx, *paletteBank, ts.defaultPalette)); + OX_RETURN_ERROR(loadBgPalette(ctx, *paletteBank, ts.defaultPalette)); } return {}; } @@ -615,7 +615,7 @@ ox::Error loadBgTileSheet( Context &ctx, unsigned cbb, TileSheetSet const&set) noexcept { - oxRequire(setTsd, buildSetTsd(ctx, set)); + OX_REQUIRE(setTsd, buildSetTsd(ctx, set)); ctx.cbbs[cbb].tex = renderer::createTexture(setTsd.width, setTsd.height, setTsd.pixels.data()); return {}; } @@ -624,11 +624,11 @@ ox::Error loadSpriteTileSheet( Context &ctx, CompactTileSheet const&ts, bool loadDefaultPalette) noexcept { - oxRequire(tsd, normalizeTileSheet(ts)); + OX_REQUIRE(tsd, normalizeTileSheet(ts)); oxTracef("nostalgia.core.gfx.gl", "loadSpriteTexture: { w: {}, h: {} }", tsd.width, tsd.height); ctx.spriteBlocks.tex = renderer::createTexture(tsd.width, tsd.height, tsd.pixels.data()); if (loadDefaultPalette) { - oxReturnError(loadSpritePalette(ctx, ts.defaultPalette)); + OX_RETURN_ERROR(loadSpritePalette(ctx, ts.defaultPalette)); } return {}; } @@ -636,7 +636,7 @@ ox::Error loadSpriteTileSheet( ox::Error loadSpriteTileSheet( Context &ctx, TileSheetSet const&set) noexcept { - oxRequire(setTsd, buildSetTsd(ctx, set)); + OX_REQUIRE(setTsd, buildSetTsd(ctx, set)); ctx.spriteBlocks.tex = renderer::createTexture(setTsd.width, setTsd.height, setTsd.pixels.data()); return {}; } diff --git a/src/nostalgia/modules/core/src/studio/paletteeditor/CMakeLists.txt b/src/nostalgia/modules/core/src/studio/paletteeditor/CMakeLists.txt index 671cf09..862d43f 100644 --- a/src/nostalgia/modules/core/src/studio/paletteeditor/CMakeLists.txt +++ b/src/nostalgia/modules/core/src/studio/paletteeditor/CMakeLists.txt @@ -1,5 +1,13 @@ target_sources( NostalgiaCore-Studio PRIVATE - paletteeditor.cpp + commands/addcolorcommand.cpp + commands/applycolorallpagescommand.cpp + commands/duplicatepagecommand.cpp + commands/movecolorcommand.cpp + commands/removecolorcommand.cpp + commands/removepagecommand.cpp + commands/renamepagecommand.cpp + commands/updatecolorcommand.cpp + commands/updatecolorinfocommand.cpp paletteeditor-imgui.cpp ) diff --git a/src/nostalgia/modules/core/src/studio/paletteeditor/commands/addcolorcommand.cpp b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/addcolorcommand.cpp new file mode 100644 index 0000000..b92f372 --- /dev/null +++ b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/addcolorcommand.cpp @@ -0,0 +1,35 @@ +/* + * Copyright 2016 - 2024 Gary Talent (gary@drinkingtea.net). All rights reserved. + */ + +#include "commands.hpp" +#include "addcolorcommand.hpp" + +namespace nostalgia::core { + +AddColorCommand::AddColorCommand(Palette &pal, Color16 const color, size_t const idx) noexcept: + m_pal(pal), + m_color(color), + m_idx(idx) {} + +int AddColorCommand::commandId() const noexcept { + return static_cast(PaletteEditorCommandId::AddColor); +} + +ox::Error AddColorCommand::redo() noexcept { + m_pal.colorNames.emplace(m_idx, ox::sfmt("Color {}", m_pal.colorNames.size() + 1)); + for (auto &page : m_pal.pages) { + page.colors.emplace(m_idx, m_color); + } + return {}; +} + +ox::Error AddColorCommand::undo() noexcept { + OX_RETURN_ERROR(m_pal.colorNames.erase(m_idx)); + for (auto &page : m_pal.pages) { + OX_RETURN_ERROR(page.colors.erase(m_idx)); + } + return {}; +} + +} diff --git a/src/nostalgia/modules/core/src/studio/paletteeditor/commands/addcolorcommand.hpp b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/addcolorcommand.hpp new file mode 100644 index 0000000..73668b0 --- /dev/null +++ b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/addcolorcommand.hpp @@ -0,0 +1,33 @@ +/* + * Copyright 2016 - 2024 Gary Talent (gary@drinkingtea.net). All rights reserved. + */ + +#pragma once + +#include + +#include + +namespace nostalgia::core { + +class AddColorCommand: public studio::UndoCommand { + private: + Palette &m_pal; + Color16 m_color = 0; + size_t const m_idx = 0; + + public: + AddColorCommand(Palette &pal, Color16 color, size_t idx) noexcept; + + ~AddColorCommand() noexcept override = default; + + [[nodiscard]] + int commandId() const noexcept override; + + ox::Error redo() noexcept override; + + ox::Error undo() noexcept override; + +}; + +} diff --git a/src/nostalgia/modules/core/src/studio/paletteeditor/commands/applycolorallpagescommand.cpp b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/applycolorallpagescommand.cpp new file mode 100644 index 0000000..38d2e11 --- /dev/null +++ b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/applycolorallpagescommand.cpp @@ -0,0 +1,50 @@ +/* + * Copyright 2016 - 2024 Gary Talent (gary@drinkingtea.net). All rights reserved. + */ + +#include "commands.hpp" +#include "applycolorallpagescommand.hpp" + +namespace nostalgia::core { + +ApplyColorAllPagesCommand::ApplyColorAllPagesCommand(Palette &pal, size_t const page, size_t const idx): + m_pal(pal), + m_page(page), + m_idx(idx), + m_origColors([this] { + ox::Vector colors; + colors.reserve(m_pal.pages.size()); + for (auto const&p : m_pal.pages) { + colors.emplace_back(p.colors[m_idx]); + } + return colors; + }()) { + auto const c = color(m_pal, m_page, m_idx); + if (ox::all_of(m_pal.pages.begin(), m_pal.pages.end(), [this, c](PalettePage const&page) { + return page.colors[m_idx] == c; + })) { + throw studio::NoChangesException(); + } +} + +int ApplyColorAllPagesCommand::commandId() const noexcept { + return static_cast(PaletteEditorCommandId::ApplyColorAllPages); +} + +ox::Error ApplyColorAllPagesCommand::redo() noexcept { + auto const c = color(m_pal, m_page, m_idx); + for (auto &page : m_pal.pages) { + page.colors[m_idx] = c; + } + return {}; +} + +ox::Error ApplyColorAllPagesCommand::undo() noexcept { + for (size_t p = 0u; auto &page : m_pal.pages) { + page.colors[m_idx] = m_origColors[p]; + ++p; + } + return {}; +} + +} \ No newline at end of file diff --git a/src/nostalgia/modules/core/src/studio/paletteeditor/commands/applycolorallpagescommand.hpp b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/applycolorallpagescommand.hpp new file mode 100644 index 0000000..4582d8e --- /dev/null +++ b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/applycolorallpagescommand.hpp @@ -0,0 +1,33 @@ +/* + * Copyright 2016 - 2024 Gary Talent (gary@drinkingtea.net). All rights reserved. + */ + +#pragma once + +#include + +#include + +namespace nostalgia::core { + +class ApplyColorAllPagesCommand: public studio::UndoCommand { + private: + Palette &m_pal; + size_t const m_page{}; + size_t const m_idx{}; + ox::Vector const m_origColors; + + public: + ApplyColorAllPagesCommand(Palette &pal, size_t page, size_t idx); + + ~ApplyColorAllPagesCommand() noexcept override = default; + + [[nodiscard]] + int commandId() const noexcept final; + + ox::Error redo() noexcept final; + + ox::Error undo() noexcept final; +}; + +} \ No newline at end of file diff --git a/src/nostalgia/modules/core/src/studio/paletteeditor/commands/commands.hpp b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/commands.hpp new file mode 100644 index 0000000..dd258c2 --- /dev/null +++ b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/commands.hpp @@ -0,0 +1,21 @@ +/* + * Copyright 2016 - 2024 Gary Talent (gary@drinkingtea.net). All rights reserved. + */ + +#pragma once + +namespace nostalgia::core { + +enum class PaletteEditorCommandId { + ApplyColorAllPages, + RenamePage, + DuplicatePage, + RemovePage, + AddColor, + RemoveColor, + UpdateColorInfo, + UpdateColor, + MoveColor, +}; + +} \ No newline at end of file diff --git a/src/nostalgia/modules/core/src/studio/paletteeditor/commands/duplicatepagecommand.cpp b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/duplicatepagecommand.cpp new file mode 100644 index 0000000..a6ea2b6 --- /dev/null +++ b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/duplicatepagecommand.cpp @@ -0,0 +1,39 @@ +/* + * Copyright 2016 - 2024 Gary Talent (gary@drinkingtea.net). All rights reserved. + */ + +#include "commands.hpp" + +#include "duplicatepagecommand.hpp" + +namespace nostalgia::core { + +DuplicatePageCommand::DuplicatePageCommand(Palette &pal, size_t srcIdx, size_t dstIdx) noexcept: + m_pal(pal), + m_dstIdx(dstIdx) { + auto const&src = m_pal.pages[srcIdx]; + m_page.reserve(src.colors.size()); + for (auto const&s : src.colors) { + m_page.emplace_back(s); + } +} + +int DuplicatePageCommand::commandId() const noexcept { + return static_cast(PaletteEditorCommandId::DuplicatePage); +} + +ox::Error DuplicatePageCommand::redo() noexcept { + m_pal.pages.emplace(m_dstIdx, "", std::move(m_page)); + return {}; +} + +ox::Error DuplicatePageCommand::undo() noexcept { + m_page = std::move(m_pal.pages[m_dstIdx].colors); + return m_pal.pages.erase(m_dstIdx).error; +} + +size_t DuplicatePageCommand::insertIdx() const noexcept { + return m_dstIdx; +} + +} \ No newline at end of file diff --git a/src/nostalgia/modules/core/src/studio/paletteeditor/commands/duplicatepagecommand.hpp b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/duplicatepagecommand.hpp new file mode 100644 index 0000000..c827c3d --- /dev/null +++ b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/duplicatepagecommand.hpp @@ -0,0 +1,36 @@ +/* + * Copyright 2016 - 2024 Gary Talent (gary@drinkingtea.net). All rights reserved. + */ + +#pragma once + +#include + +#include + +namespace nostalgia::core { + +class DuplicatePageCommand: public studio::UndoCommand { + private: + Palette &m_pal; + size_t m_dstIdx = 0; + ox::Vector m_page; + + public: + DuplicatePageCommand(Palette &pal, size_t srcIdx, size_t dstIdx) noexcept; + + ~DuplicatePageCommand() noexcept override = default; + + [[nodiscard]] + int commandId() const noexcept final; + + ox::Error redo() noexcept final; + + ox::Error undo() noexcept final; + + [[nodiscard]] + size_t insertIdx() const noexcept; + +}; + +} \ No newline at end of file diff --git a/src/nostalgia/modules/core/src/studio/paletteeditor/commands/movecolorcommand.cpp b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/movecolorcommand.cpp new file mode 100644 index 0000000..f8df2a2 --- /dev/null +++ b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/movecolorcommand.cpp @@ -0,0 +1,38 @@ +/* + * Copyright 2016 - 2024 Gary Talent (gary@drinkingtea.net). All rights reserved. + */ + +#include "commands.hpp" + +#include "movecolorcommand.hpp" + +namespace nostalgia::core { + +MoveColorCommand::MoveColorCommand( + Palette &pal, size_t page, size_t srcIdx, size_t dstIdx) noexcept: + m_pal(pal), + m_page(page), + m_srcIdx(srcIdx), + m_dstIdx(dstIdx) {} + +int MoveColorCommand::commandId() const noexcept { + return static_cast(PaletteEditorCommandId::MoveColor); +} + +ox::Error MoveColorCommand::redo() noexcept { + moveColor(m_srcIdx, m_dstIdx); + return {}; +} + +ox::Error MoveColorCommand::undo() noexcept { + moveColor(m_dstIdx, m_srcIdx); + return {}; +} + +void MoveColorCommand::moveColor(size_t srcIdx, size_t dstIdx) noexcept { + auto const c = color(m_pal, m_page, srcIdx); + std::ignore = colors(m_pal, m_page).erase(srcIdx); + colors(m_pal, m_page).emplace(dstIdx, c); +} + +} diff --git a/src/nostalgia/modules/core/src/studio/paletteeditor/commands/movecolorcommand.hpp b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/movecolorcommand.hpp new file mode 100644 index 0000000..ed366cd --- /dev/null +++ b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/movecolorcommand.hpp @@ -0,0 +1,36 @@ +/* + * Copyright 2016 - 2024 Gary Talent (gary@drinkingtea.net). All rights reserved. + */ + +#pragma once + +#include + +#include + +namespace nostalgia::core { + +class MoveColorCommand: public studio::UndoCommand { + private: + Palette &m_pal; + size_t const m_page = 0; + std::size_t const m_srcIdx = 0; + std::size_t const m_dstIdx = 0; + + public: + MoveColorCommand(Palette &pal, size_t page, size_t srcIdx, size_t dstIdx) noexcept; + + ~MoveColorCommand() noexcept override = default; + + [[nodiscard]] + int commandId() const noexcept override; + + ox::Error redo() noexcept override; + + ox::Error undo() noexcept override; + + private: + void moveColor(size_t srcIdx, size_t dstIdx) noexcept; +}; + +} diff --git a/src/nostalgia/modules/core/src/studio/paletteeditor/commands/removecolorcommand.cpp b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/removecolorcommand.cpp new file mode 100644 index 0000000..d3c1605 --- /dev/null +++ b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/removecolorcommand.cpp @@ -0,0 +1,44 @@ +/* + * Copyright 2016 - 2024 Gary Talent (gary@drinkingtea.net). All rights reserved. + */ + +#include "commands.hpp" +#include "removecolorcommand.hpp" + +namespace nostalgia::core { + +RemoveColorCommand::RemoveColorCommand(Palette &pal, size_t const idx) noexcept: + m_pal(pal), + m_idx(idx), + m_colors([this] { + ox::Vector colors; + colors.reserve(m_pal.pages.size()); + for (auto const&p : m_pal.pages) { + colors.emplace_back(p.colors[m_idx]); + } + return colors; + }()) {} + +int RemoveColorCommand::commandId() const noexcept { + return static_cast(PaletteEditorCommandId::RemoveColor); +} + +ox::Error RemoveColorCommand::redo() noexcept { + m_colorInfo = std::move(m_pal.colorNames[m_idx]); + OX_RETURN_ERROR(m_pal.colorNames.erase(m_idx)); + for (auto &page : m_pal.pages) { + OX_RETURN_ERROR(page.colors.erase(m_idx)); + } + return {}; +} + +ox::Error RemoveColorCommand::undo() noexcept { + m_pal.colorNames.emplace(m_idx, std::move(m_colorInfo)); + for (size_t p = 0; auto &page : m_pal.pages) { + page.colors.emplace(m_idx, m_colors[p]); + ++p; + } + return {}; +} + +} diff --git a/src/nostalgia/modules/core/src/studio/paletteeditor/commands/removecolorcommand.hpp b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/removecolorcommand.hpp new file mode 100644 index 0000000..76039cf --- /dev/null +++ b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/removecolorcommand.hpp @@ -0,0 +1,34 @@ +/* + * Copyright 2016 - 2024 Gary Talent (gary@drinkingtea.net). All rights reserved. + */ + +#pragma once + +#include + +#include + +namespace nostalgia::core { + +class RemoveColorCommand: public studio::UndoCommand { + private: + Palette &m_pal; + size_t const m_idx = 0; + ox::String m_colorInfo; + ox::Vector const m_colors; + + public: + RemoveColorCommand(Palette &pal, size_t idx) noexcept; + + ~RemoveColorCommand() noexcept override = default; + + [[nodiscard]] + int commandId() const noexcept override; + + ox::Error redo() noexcept override; + + ox::Error undo() noexcept override; + +}; + +} diff --git a/src/nostalgia/modules/core/src/studio/paletteeditor/commands/removepagecommand.cpp b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/removepagecommand.cpp new file mode 100644 index 0000000..5a9fc37 --- /dev/null +++ b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/removepagecommand.cpp @@ -0,0 +1,29 @@ +/* + * Copyright 2016 - 2024 Gary Talent (gary@drinkingtea.net). All rights reserved. + */ + +#include "commands.hpp" + +#include "removepagecommand.hpp" + +namespace nostalgia::core { + +RemovePageCommand::RemovePageCommand(Palette &pal, size_t idx) noexcept: + m_pal(pal), + m_idx(idx) {} + +int RemovePageCommand::commandId() const noexcept { + return static_cast(PaletteEditorCommandId::RemovePage); +} + +ox::Error RemovePageCommand::redo() noexcept { + m_page = std::move(m_pal.pages[m_idx]); + return m_pal.pages.erase(m_idx).error; +} + +ox::Error RemovePageCommand::undo() noexcept { + m_pal.pages.emplace(m_idx, std::move(m_page)); + return {}; +} + +} diff --git a/src/nostalgia/modules/core/src/studio/paletteeditor/commands/removepagecommand.hpp b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/removepagecommand.hpp new file mode 100644 index 0000000..8137c73 --- /dev/null +++ b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/removepagecommand.hpp @@ -0,0 +1,33 @@ +/* + * Copyright 2016 - 2024 Gary Talent (gary@drinkingtea.net). All rights reserved. + */ + +#pragma once + +#include + +#include + +namespace nostalgia::core { + +class RemovePageCommand: public studio::UndoCommand { + private: + Palette &m_pal; + size_t m_idx = 0; + PalettePage m_page; + + public: + RemovePageCommand(Palette &pal, size_t idx) noexcept; + + ~RemovePageCommand() noexcept override = default; + + [[nodiscard]] + int commandId() const noexcept final; + + ox::Error redo() noexcept final; + + ox::Error undo() noexcept final; + +}; + +} diff --git a/src/nostalgia/modules/core/src/studio/paletteeditor/commands/renamepagecommand.cpp b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/renamepagecommand.cpp new file mode 100644 index 0000000..844e997 --- /dev/null +++ b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/renamepagecommand.cpp @@ -0,0 +1,28 @@ +/* + * Copyright 2016 - 2024 Gary Talent (gary@drinkingtea.net). All rights reserved. + */ + +#include "renamepagecommand.hpp" + +namespace nostalgia::core { + +RenamePageCommand::RenamePageCommand(Palette &pal, size_t const page, ox::StringParam name) noexcept: + m_pal(pal), + m_page(page), + m_name{std::move(name)} {} + +int RenamePageCommand::commandId() const noexcept { + return static_cast(PaletteEditorCommandId::RenamePage); +} + +ox::Error RenamePageCommand::redo() noexcept { + std::swap(m_pal.pages[m_page].name, m_name); + return {}; +} + +ox::Error RenamePageCommand::undo() noexcept { + std::swap(m_pal.pages[m_page].name, m_name); + return {}; +} + +} \ No newline at end of file diff --git a/src/nostalgia/modules/core/src/studio/paletteeditor/commands/renamepagecommand.hpp b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/renamepagecommand.hpp new file mode 100644 index 0000000..c5046eb --- /dev/null +++ b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/renamepagecommand.hpp @@ -0,0 +1,35 @@ +/* + * Copyright 2016 - 2024 Gary Talent (gary@drinkingtea.net). All rights reserved. + */ + +#pragma once + +#include + +#include + +#include "commands.hpp" + +namespace nostalgia::core { + +class RenamePageCommand: public studio::UndoCommand { + private: + Palette &m_pal; + size_t m_page = 0; + ox::String m_name; + + public: + RenamePageCommand(Palette &pal, size_t page, ox::StringParam name) noexcept; + + ~RenamePageCommand() noexcept override = default; + + [[nodiscard]] + int commandId() const noexcept final; + + ox::Error redo() noexcept final; + + ox::Error undo() noexcept final; + +}; + +} \ No newline at end of file diff --git a/src/nostalgia/modules/core/src/studio/paletteeditor/commands/updatecolorcommand.cpp b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/updatecolorcommand.cpp new file mode 100644 index 0000000..5e4191a --- /dev/null +++ b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/updatecolorcommand.cpp @@ -0,0 +1,54 @@ +/* + * Copyright 2016 - 2024 Gary Talent (gary@drinkingtea.net). All rights reserved. + */ + +#include "commands.hpp" +#include "updatecolorcommand.hpp" + +namespace nostalgia::core { + +UpdateColorCommand::UpdateColorCommand( + Palette &pal, + size_t page, + size_t idx, + Color16 newColor): + m_pal(pal), + m_page(page), + m_idx(idx), + m_altColor(newColor) { + if (color(m_pal, m_page, m_idx) == newColor) { + throw studio::NoChangesException(); + } +} + +bool UpdateColorCommand::mergeWith(UndoCommand &cmd) noexcept { + if (cmd.commandId() != static_cast(PaletteEditorCommandId::UpdateColor)) { + return false; + } + auto ucCmd = dynamic_cast(&cmd); + if (m_idx != ucCmd->m_idx) { + return false; + } + return true; +} + +int UpdateColorCommand::commandId() const noexcept { + return static_cast(PaletteEditorCommandId::UpdateColor); +} + +ox::Error UpdateColorCommand::redo() noexcept { + swap(); + return {}; +} + +ox::Error UpdateColorCommand::undo() noexcept { + swap(); + return {}; +} + +void UpdateColorCommand::swap() noexcept { + auto &dst = colors(m_pal, m_page)[m_idx]; + std::swap(dst, m_altColor); +} + +} \ No newline at end of file diff --git a/src/nostalgia/modules/core/src/studio/paletteeditor/commands/updatecolorcommand.hpp b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/updatecolorcommand.hpp new file mode 100644 index 0000000..49f94ef --- /dev/null +++ b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/updatecolorcommand.hpp @@ -0,0 +1,44 @@ +/* + * Copyright 2016 - 2024 Gary Talent (gary@drinkingtea.net). All rights reserved. + */ + +#pragma once + +#include + +#include + +namespace nostalgia::core { + +class UpdateColorCommand: public studio::UndoCommand { + private: + Palette &m_pal; + size_t const m_page = 0; + size_t const m_idx{}; + PaletteColor m_altColor{}; + + public: + UpdateColorCommand( + Palette &pal, + size_t page, + size_t idx, + Color16 newColor); + + ~UpdateColorCommand() noexcept override = default; + + [[nodiscard]] + bool mergeWith(UndoCommand &cmd) noexcept final; + + [[nodiscard]] + int commandId() const noexcept final; + + ox::Error redo() noexcept final; + + ox::Error undo() noexcept final; + + private: + void swap() noexcept; + +}; + +} diff --git a/src/nostalgia/modules/core/src/studio/paletteeditor/commands/updatecolorinfocommand.cpp b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/updatecolorinfocommand.cpp new file mode 100644 index 0000000..a2d8374 --- /dev/null +++ b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/updatecolorinfocommand.cpp @@ -0,0 +1,53 @@ +/* + * Copyright 2016 - 2024 Gary Talent (gary@drinkingtea.net). All rights reserved. + */ + +#include "commands.hpp" +#include "updatecolorinfocommand.hpp" + +namespace nostalgia::core { + +UpdateColorInfoCommand::UpdateColorInfoCommand( + Palette &pal, + size_t idx, + ox::StringParam newColorInfo): + m_pal(pal), + m_idx(idx), + m_altColorInfo(std::move(newColorInfo)) { + if (m_pal.colorNames[m_idx] == m_altColorInfo) { + throw studio::NoChangesException(); + } +} + +bool UpdateColorInfoCommand::mergeWith(UndoCommand &cmd) noexcept { + if (cmd.commandId() != static_cast(PaletteEditorCommandId::UpdateColorInfo)) { + return false; + } + auto ucCmd = dynamic_cast(&cmd); + if (m_idx != ucCmd->m_idx) { + return false; + } + m_pal.colorNames[m_idx] = std::move(ucCmd->m_pal.colorNames[m_idx]); + setObsolete(m_altColorInfo == m_pal.colorNames[m_idx]); + return true; +} + +int UpdateColorInfoCommand::commandId() const noexcept { + return static_cast(PaletteEditorCommandId::UpdateColorInfo); +} + +ox::Error UpdateColorInfoCommand::redo() noexcept { + swap(); + return {}; +} + +ox::Error UpdateColorInfoCommand::undo() noexcept { + swap(); + return {}; +} + +void UpdateColorInfoCommand::swap() noexcept { + std::swap(m_pal.colorNames[m_idx], m_altColorInfo); +} + +} \ No newline at end of file diff --git a/src/nostalgia/modules/core/src/studio/paletteeditor/commands/updatecolorinfocommand.hpp b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/updatecolorinfocommand.hpp new file mode 100644 index 0000000..59e898d --- /dev/null +++ b/src/nostalgia/modules/core/src/studio/paletteeditor/commands/updatecolorinfocommand.hpp @@ -0,0 +1,42 @@ +/* + * Copyright 2016 - 2024 Gary Talent (gary@drinkingtea.net). All rights reserved. + */ + +#pragma once + +#include + +#include + +namespace nostalgia::core { + +class UpdateColorInfoCommand: public studio::UndoCommand { + private: + Palette &m_pal; + size_t const m_idx{}; + ox::String m_altColorInfo; + + public: + UpdateColorInfoCommand( + Palette &pal, + size_t idx, + ox::StringParam newColorInfo); + + ~UpdateColorInfoCommand() noexcept override = default; + + [[nodiscard]] + bool mergeWith(UndoCommand &cmd) noexcept final; + + [[nodiscard]] + int commandId() const noexcept final; + + ox::Error redo() noexcept final; + + ox::Error undo() noexcept final; + + private: + void swap() noexcept; + +}; + +} diff --git a/src/nostalgia/modules/core/src/studio/paletteeditor/paletteeditor-imgui.cpp b/src/nostalgia/modules/core/src/studio/paletteeditor/paletteeditor-imgui.cpp index 5355da4..7dca2ee 100644 --- a/src/nostalgia/modules/core/src/studio/paletteeditor/paletteeditor-imgui.cpp +++ b/src/nostalgia/modules/core/src/studio/paletteeditor/paletteeditor-imgui.cpp @@ -6,9 +6,16 @@ #include -#include +#include "commands/addcolorcommand.hpp" +#include "commands/applycolorallpagescommand.hpp" +#include "commands/duplicatepagecommand.hpp" +#include "commands/movecolorcommand.hpp" +#include "commands/removecolorcommand.hpp" +#include "commands/removepagecommand.hpp" +#include "commands/renamepagecommand.hpp" +#include "commands/updatecolorcommand.hpp" +#include "commands/updatecolorinfocommand.hpp" -#include "paletteeditor.hpp" #include "paletteeditor-imgui.hpp" namespace nostalgia::core { @@ -16,7 +23,7 @@ namespace nostalgia::core { namespace ig = studio::ig; -void PaletteEditorImGui::PageRename::draw(turbine::Context &tctx) noexcept { +void PaletteEditorImGui::PageRenameDialog::draw(turbine::Context &tctx) noexcept { if (!m_show) { return; } @@ -42,7 +49,7 @@ PaletteEditorImGui::PaletteEditorImGui(studio::StudioContext &sctx, ox::StringPa m_tctx(sctx.tctx), m_pal(*keel::readObj(keelCtx(m_tctx), itemPath()).unwrapThrow()) { undoStack()->changeTriggered.connect(this, &PaletteEditorImGui::handleCommand); - m_pageRename.inputSubmitted.connect(this, &PaletteEditorImGui::renamePage); + m_pageRenameDlg.inputSubmitted.connect(this, &PaletteEditorImGui::renamePage); } void PaletteEditorImGui::draw(studio::StudioContext&) noexcept { @@ -58,7 +65,7 @@ void PaletteEditorImGui::draw(studio::StudioContext&) noexcept { drawColorsEditor(); ImGui::EndChild(); } - m_pageRename.draw(m_tctx); + m_pageRenameDlg.draw(m_tctx); } ox::Error PaletteEditorImGui::saveItem() noexcept { @@ -203,7 +210,7 @@ void PaletteEditorImGui::drawPagesEditor() noexcept { } ImGui::SameLine(); if (ImGui::Button("Rename", btnSz)) { - m_pageRename.show(m_pal.pages[m_page].name); + m_pageRenameDlg.show(m_pal.pages[m_page].name); } ImGui::BeginTable( "PageSelect", @@ -245,7 +252,7 @@ void PaletteEditorImGui::drawColorEditor() noexcept { std::ignore = pushCommand( m_pal, m_page, m_selectedColorRow); } - if (!inputFocused && !m_pageRename.isOpen()) { + if (!inputFocused && !m_pageRenameDlg.isOpen()) { if (!ImGui::IsKeyDown(ImGuiKey_ModAlt)) { numShortcuts(m_selectedColorRow, largestPage(m_pal)); } else { @@ -258,7 +265,7 @@ void PaletteEditorImGui::drawColorEditor() noexcept { } if (newName) { std::ignore = pushCommand( - m_pal, m_selectedColorRow, ox::String{newName}); + m_pal, m_selectedColorRow, static_cast(newName.text)); } } diff --git a/src/nostalgia/modules/core/src/studio/paletteeditor/paletteeditor-imgui.hpp b/src/nostalgia/modules/core/src/studio/paletteeditor/paletteeditor-imgui.hpp index 458dc64..1ea1a95 100644 --- a/src/nostalgia/modules/core/src/studio/paletteeditor/paletteeditor-imgui.hpp +++ b/src/nostalgia/modules/core/src/studio/paletteeditor/paletteeditor-imgui.hpp @@ -14,7 +14,7 @@ namespace nostalgia::core { class PaletteEditorImGui: public studio::Editor { private: - class PageRename { + class PageRenameDialog { private: ox::IString<50> m_name; bool m_show = false; @@ -30,7 +30,7 @@ class PaletteEditorImGui: public studio::Editor { [[nodiscard]] constexpr bool isOpen() const noexcept { return m_show; } void draw(turbine::Context &tctx) noexcept; - } m_pageRename; + } m_pageRenameDlg; studio::StudioContext &m_sctx; turbine::Context &m_tctx; Palette m_pal; diff --git a/src/nostalgia/modules/core/src/studio/paletteeditor/paletteeditor.cpp b/src/nostalgia/modules/core/src/studio/paletteeditor/paletteeditor.cpp deleted file mode 100644 index 0762c73..0000000 --- a/src/nostalgia/modules/core/src/studio/paletteeditor/paletteeditor.cpp +++ /dev/null @@ -1,295 +0,0 @@ -/* - * Copyright 2016 - 2024 Gary Talent (gary@drinkingtea.net). All rights reserved. - */ - -#include "paletteeditor.hpp" - -namespace nostalgia::core { - -ApplyColorAllPagesCommand::ApplyColorAllPagesCommand(Palette &pal, size_t const page, size_t const idx): - m_pal(pal), - m_page(page), - m_idx(idx), - m_origColors([this] { - ox::Vector colors; - colors.reserve(m_pal.pages.size()); - for (auto const&p : m_pal.pages) { - colors.emplace_back(p.colors[m_idx]); - } - return colors; - }()) { - auto const c = color(m_pal, m_page, m_idx); - if (ox::all_of(m_pal.pages.begin(), m_pal.pages.end(), [this, c](PalettePage const&page) { - return page.colors[m_idx] == c; - })) { - throw studio::NoChangesException(); - } -} - -int ApplyColorAllPagesCommand::commandId() const noexcept { - return static_cast(PaletteEditorCommandId::ApplyColorAllPages); -} - -ox::Error ApplyColorAllPagesCommand::redo() noexcept { - auto const c = color(m_pal, m_page, m_idx); - for (auto &page : m_pal.pages) { - page.colors[m_idx] = c; - } - return {}; -} - -ox::Error ApplyColorAllPagesCommand::undo() noexcept { - for (size_t p = 0u; auto &page : m_pal.pages) { - page.colors[m_idx] = m_origColors[p]; - ++p; - } - return {}; -} - - -RenamePageCommand::RenamePageCommand(Palette &pal, size_t const page, ox::StringParam name) noexcept: - m_pal(pal), - m_page(page), - m_name{std::move(name)} {} - -int RenamePageCommand::commandId() const noexcept { - return static_cast(PaletteEditorCommandId::RenamePage); -} - -ox::Error RenamePageCommand::redo() noexcept { - std::swap(m_pal.pages[m_page].name, m_name); - return {}; -} - -ox::Error RenamePageCommand::undo() noexcept { - std::swap(m_pal.pages[m_page].name, m_name); - return {}; -} - - -DuplicatePageCommand::DuplicatePageCommand(Palette &pal, size_t srcIdx, size_t dstIdx) noexcept: - m_pal(pal), - m_dstIdx(dstIdx) { - auto const&src = m_pal.pages[srcIdx]; - m_page.reserve(src.colors.size()); - for (auto const&s : src.colors) { - m_page.emplace_back(s); - } -} - -int DuplicatePageCommand::commandId() const noexcept { - return static_cast(PaletteEditorCommandId::DuplicatePage); -} - -ox::Error DuplicatePageCommand::redo() noexcept { - m_pal.pages.emplace(m_dstIdx, "", std::move(m_page)); - return {}; -} - -ox::Error DuplicatePageCommand::undo() noexcept { - m_page = std::move(m_pal.pages[m_dstIdx].colors); - return m_pal.pages.erase(m_dstIdx).error; -} - -size_t DuplicatePageCommand::insertIdx() const noexcept { - return m_dstIdx; -} - - -RemovePageCommand::RemovePageCommand(Palette &pal, size_t idx) noexcept: - m_pal(pal), - m_idx(idx) {} - -int RemovePageCommand::commandId() const noexcept { - return static_cast(PaletteEditorCommandId::RemovePage); -} - -ox::Error RemovePageCommand::redo() noexcept { - m_page = std::move(m_pal.pages[m_idx]); - return m_pal.pages.erase(m_idx).error; -} - -ox::Error RemovePageCommand::undo() noexcept { - m_pal.pages.emplace(m_idx, std::move(m_page)); - return {}; -} - - -AddColorCommand::AddColorCommand(Palette &pal, Color16 const color, size_t const idx) noexcept: - m_pal(pal), - m_color(color), - m_idx(idx) {} - -int AddColorCommand::commandId() const noexcept { - return static_cast(PaletteEditorCommandId::AddColor); -} - -ox::Error AddColorCommand::redo() noexcept { - m_pal.colorNames.emplace(m_idx, ox::sfmt("Color {}", m_pal.colorNames.size() + 1)); - for (auto &page : m_pal.pages) { - page.colors.emplace(m_idx, m_color); - } - return {}; -} - -ox::Error AddColorCommand::undo() noexcept { - oxReturnError(m_pal.colorNames.erase(m_idx)); - for (auto &page : m_pal.pages) { - oxReturnError(page.colors.erase(m_idx)); - } - return {}; -} - - -RemoveColorCommand::RemoveColorCommand(Palette &pal, size_t const idx) noexcept: - m_pal(pal), - m_idx(idx), - m_colors([this] { - ox::Vector colors; - colors.reserve(m_pal.pages.size()); - for (auto const&p : m_pal.pages) { - colors.emplace_back(p.colors[m_idx]); - } - return colors; - }()) {} - -int RemoveColorCommand::commandId() const noexcept { - return static_cast(PaletteEditorCommandId::RemoveColor); -} - -ox::Error RemoveColorCommand::redo() noexcept { - m_colorInfo = std::move(m_pal.colorNames[m_idx]); - oxReturnError(m_pal.colorNames.erase(m_idx)); - for (auto &page : m_pal.pages) { - oxReturnError(page.colors.erase(m_idx)); - } - return {}; -} - -ox::Error RemoveColorCommand::undo() noexcept { - m_pal.colorNames.emplace(m_idx, std::move(m_colorInfo)); - for (size_t p = 0; auto &page : m_pal.pages) { - page.colors.emplace(m_idx, m_colors[p]); - ++p; - } - return {}; -} - - -UpdateColorInfoCommand::UpdateColorInfoCommand( - Palette &pal, - size_t idx, - ox::StringParam newColorInfo): - m_pal(pal), - m_idx(idx), - m_altColorInfo(std::move(newColorInfo)) { - if (m_pal.colorNames[m_idx] == m_altColorInfo) { - throw studio::NoChangesException(); - } -} - -bool UpdateColorInfoCommand::mergeWith(UndoCommand &cmd) noexcept { - if (cmd.commandId() != static_cast(PaletteEditorCommandId::UpdateColorInfo)) { - return false; - } - auto ucCmd = dynamic_cast(&cmd); - if (m_idx != ucCmd->m_idx) { - return false; - } - m_pal.colorNames[m_idx] = std::move(ucCmd->m_pal.colorNames[m_idx]); - setObsolete(m_altColorInfo == m_pal.colorNames[m_idx]); - return true; -} - -int UpdateColorInfoCommand::commandId() const noexcept { - return static_cast(PaletteEditorCommandId::UpdateColorInfo); -} - -ox::Error UpdateColorInfoCommand::redo() noexcept { - swap(); - return {}; -} - -ox::Error UpdateColorInfoCommand::undo() noexcept { - swap(); - return {}; -} - -void UpdateColorInfoCommand::swap() noexcept { - std::swap(m_pal.colorNames[m_idx], m_altColorInfo); -} - - -UpdateColorCommand::UpdateColorCommand( - Palette &pal, - size_t page, - size_t idx, - Color16 newColor): - m_pal(pal), - m_page(page), - m_idx(idx), - m_altColor(newColor) { - if (color(m_pal, m_page, m_idx) == newColor) { - throw studio::NoChangesException(); - } -} - -bool UpdateColorCommand::mergeWith(UndoCommand &cmd) noexcept { - if (cmd.commandId() != static_cast(PaletteEditorCommandId::UpdateColor)) { - return false; - } - auto ucCmd = dynamic_cast(&cmd); - if (m_idx != ucCmd->m_idx) { - return false; - } - return true; -} - -int UpdateColorCommand::commandId() const noexcept { - return static_cast(PaletteEditorCommandId::UpdateColor); -} - -ox::Error UpdateColorCommand::redo() noexcept { - swap(); - return {}; -} - -ox::Error UpdateColorCommand::undo() noexcept { - swap(); - return {}; -} - -void UpdateColorCommand::swap() noexcept { - auto &dst = colors(m_pal, m_page)[m_idx]; - std::swap(dst, m_altColor); -} - - -MoveColorCommand::MoveColorCommand( - Palette &pal, size_t page, size_t srcIdx, size_t dstIdx) noexcept: - m_pal(pal), - m_page(page), - m_srcIdx(srcIdx), - m_dstIdx(dstIdx) {} - -int MoveColorCommand::commandId() const noexcept { - return static_cast(PaletteEditorCommandId::MoveColor); -} - -ox::Error MoveColorCommand::redo() noexcept { - moveColor(m_srcIdx, m_dstIdx); - return {}; -} - -ox::Error MoveColorCommand::undo() noexcept { - moveColor(m_dstIdx, m_srcIdx); - return {}; -} - -void MoveColorCommand::moveColor(size_t srcIdx, size_t dstIdx) noexcept { - auto const c = color(m_pal, m_page, srcIdx); - std::ignore = colors(m_pal, m_page).erase(srcIdx); - colors(m_pal, m_page).emplace(dstIdx, c); -} - -} diff --git a/src/nostalgia/modules/core/src/studio/paletteeditor/paletteeditor.hpp b/src/nostalgia/modules/core/src/studio/paletteeditor/paletteeditor.hpp deleted file mode 100644 index 7f61d16..0000000 --- a/src/nostalgia/modules/core/src/studio/paletteeditor/paletteeditor.hpp +++ /dev/null @@ -1,234 +0,0 @@ -/* - * Copyright 2016 - 2024 Gary Talent (gary@drinkingtea.net). All rights reserved. - */ - -#pragma once - -#include - -#include -#include - -namespace nostalgia::core { - -enum class PaletteEditorCommandId { - ApplyColorAllPages, - RenamePage, - DuplicatePage, - RemovePage, - AddColor, - RemoveColor, - UpdateColorInfo, - UpdateColor, - MoveColor, -}; - - -class ApplyColorAllPagesCommand: public studio::UndoCommand { - private: - Palette &m_pal; - size_t const m_page{}; - size_t const m_idx{}; - ox::Vector const m_origColors; - - public: - ApplyColorAllPagesCommand(Palette &pal, size_t page, size_t idx); - - ~ApplyColorAllPagesCommand() noexcept override = default; - - [[nodiscard]] - int commandId() const noexcept final; - - ox::Error redo() noexcept final; - - ox::Error undo() noexcept final; -}; - -class RenamePageCommand: public studio::UndoCommand { - private: - Palette &m_pal; - size_t m_page = 0; - ox::String m_name; - - public: - RenamePageCommand(Palette &pal, size_t page, ox::StringParam name) noexcept; - - ~RenamePageCommand() noexcept override = default; - - [[nodiscard]] - int commandId() const noexcept final; - - ox::Error redo() noexcept final; - - ox::Error undo() noexcept final; - -}; - -class DuplicatePageCommand: public studio::UndoCommand { - private: - Palette &m_pal; - size_t m_dstIdx = 0; - ox::Vector m_page; - - public: - DuplicatePageCommand(Palette &pal, size_t srcIdx, size_t dstIdx) noexcept; - - ~DuplicatePageCommand() noexcept override = default; - - [[nodiscard]] - int commandId() const noexcept final; - - ox::Error redo() noexcept final; - - ox::Error undo() noexcept final; - - [[nodiscard]] - size_t insertIdx() const noexcept; - -}; - -class RemovePageCommand: public studio::UndoCommand { - private: - Palette &m_pal; - size_t m_idx = 0; - PalettePage m_page; - - public: - RemovePageCommand(Palette &pal, size_t idx) noexcept; - - ~RemovePageCommand() noexcept override = default; - - [[nodiscard]] - int commandId() const noexcept final; - - ox::Error redo() noexcept final; - - ox::Error undo() noexcept final; - -}; - -class AddColorCommand: public studio::UndoCommand { - private: - Palette &m_pal; - Color16 m_color = 0; - size_t const m_idx = 0; - - public: - AddColorCommand(Palette &pal, Color16 color, size_t idx) noexcept; - - ~AddColorCommand() noexcept override = default; - - [[nodiscard]] - int commandId() const noexcept override; - - ox::Error redo() noexcept override; - - ox::Error undo() noexcept override; - -}; - -class RemoveColorCommand: public studio::UndoCommand { - private: - Palette &m_pal; - size_t const m_idx = 0; - ox::String m_colorInfo; - ox::Vector const m_colors; - - public: - RemoveColorCommand(Palette &pal, size_t idx) noexcept; - - ~RemoveColorCommand() noexcept override = default; - - [[nodiscard]] - int commandId() const noexcept override; - - ox::Error redo() noexcept override; - - ox::Error undo() noexcept override; - -}; - -class UpdateColorInfoCommand: public studio::UndoCommand { - private: - Palette &m_pal; - size_t const m_idx{}; - ox::String m_altColorInfo; - - public: - UpdateColorInfoCommand( - Palette &pal, - size_t idx, - ox::StringParam newColorInfo); - - ~UpdateColorInfoCommand() noexcept override = default; - - [[nodiscard]] - bool mergeWith(UndoCommand &cmd) noexcept final; - - [[nodiscard]] - int commandId() const noexcept final; - - ox::Error redo() noexcept final; - - ox::Error undo() noexcept final; - - private: - void swap() noexcept; - -}; - -class UpdateColorCommand: public studio::UndoCommand { - private: - Palette &m_pal; - size_t const m_page = 0; - size_t const m_idx{}; - PaletteColor m_altColor{}; - - public: - UpdateColorCommand( - Palette &pal, - size_t page, - size_t idx, - Color16 newColor); - - ~UpdateColorCommand() noexcept override = default; - - [[nodiscard]] - bool mergeWith(UndoCommand &cmd) noexcept final; - - [[nodiscard]] - int commandId() const noexcept final; - - ox::Error redo() noexcept final; - - ox::Error undo() noexcept final; - - private: - void swap() noexcept; - -}; - -class MoveColorCommand: public studio::UndoCommand { - private: - Palette &m_pal; - size_t const m_page = 0; - std::size_t const m_srcIdx = 0; - std::size_t const m_dstIdx = 0; - - public: - MoveColorCommand(Palette &pal, size_t page, size_t srcIdx, size_t dstIdx) noexcept; - - ~MoveColorCommand() noexcept override = default; - - [[nodiscard]] - int commandId() const noexcept override; - - ox::Error redo() noexcept override; - - ox::Error undo() noexcept override; - - private: - void moveColor(size_t srcIdx, size_t dstIdx) noexcept; -}; - -} diff --git a/src/nostalgia/modules/core/src/studio/studiomodule.cpp b/src/nostalgia/modules/core/src/studio/studiomodule.cpp index bba778b..a880ee2 100644 --- a/src/nostalgia/modules/core/src/studio/studiomodule.cpp +++ b/src/nostalgia/modules/core/src/studio/studiomodule.cpp @@ -25,7 +25,7 @@ static class: public studio::Module { out.emplace_back(ox::make>("Palette", "Palettes", FileExt_npal)); return out; } -} mod; +} const mod; const studio::Module *studioModule() noexcept { return &mod; diff --git a/src/nostalgia/modules/core/src/studio/tilesheeteditor/commands/addsubsheetcommand.cpp b/src/nostalgia/modules/core/src/studio/tilesheeteditor/commands/addsubsheetcommand.cpp index 8aa99f1..1e1b024 100644 --- a/src/nostalgia/modules/core/src/studio/tilesheeteditor/commands/addsubsheetcommand.cpp +++ b/src/nostalgia/modules/core/src/studio/tilesheeteditor/commands/addsubsheetcommand.cpp @@ -49,7 +49,7 @@ ox::Error AddSubSheetCommand::undo() noexcept { --m_img.idIt; } else { for (auto idx = m_addedSheets.rbegin(); idx != m_addedSheets.rend(); ++idx) { - oxReturnError(rmSubSheet(m_img, *idx)); + OX_RETURN_ERROR(rmSubSheet(m_img, *idx)); --m_img.idIt; } } diff --git a/src/nostalgia/modules/core/src/studio/tilesheeteditor/commands/cutpastecommand.hpp b/src/nostalgia/modules/core/src/studio/tilesheeteditor/commands/cutpastecommand.hpp index 6df4464..d6f648d 100644 --- a/src/nostalgia/modules/core/src/studio/tilesheeteditor/commands/cutpastecommand.hpp +++ b/src/nostalgia/modules/core/src/studio/tilesheeteditor/commands/cutpastecommand.hpp @@ -10,14 +10,14 @@ namespace nostalgia::core { -oxModelFwdDecl(class TileSheetClipboard); +OX_MODEL_FWD_DECL(class TileSheetClipboard); class TileSheetClipboard: public turbine::ClipboardObject { public: static constexpr auto TypeName = "net.drinkingtea.nostalgia.core.studio.TileSheetClipboard"; static constexpr auto TypeVersion = 1; - oxModelFriend(TileSheetClipboard); + OX_MODEL_FRIEND(TileSheetClipboard); struct Pixel { static constexpr auto TypeName = "net.drinkingtea.nostalgia.core.studio.TileSheetClipboard.Pixel"; @@ -36,14 +36,14 @@ class TileSheetClipboard: public turbine::ClipboardObject { ox::Vector const&pixels() const noexcept; }; -oxModelBegin(TileSheetClipboard::Pixel) - oxModelField(colorIdx) - oxModelField(pt) -oxModelEnd() +OX_MODEL_BEGIN(TileSheetClipboard::Pixel) + OX_MODEL_FIELD(colorIdx) + OX_MODEL_FIELD(pt) +OX_MODEL_END() -oxModelBegin(TileSheetClipboard) - oxModelFieldRename(m_pixels, pixels) -oxModelEnd() +OX_MODEL_BEGIN(TileSheetClipboard) + OX_MODEL_FIELD_RENAME(m_pixels, pixels) +OX_MODEL_END() class CutPasteCommand: public TileSheetCommand { private: diff --git a/src/nostalgia/modules/core/src/studio/tilesheeteditor/commands/rmsubsheetcommand.cpp b/src/nostalgia/modules/core/src/studio/tilesheeteditor/commands/rmsubsheetcommand.cpp index 4ea13a2..5b8108f 100644 --- a/src/nostalgia/modules/core/src/studio/tilesheeteditor/commands/rmsubsheetcommand.cpp +++ b/src/nostalgia/modules/core/src/studio/tilesheeteditor/commands/rmsubsheetcommand.cpp @@ -16,7 +16,7 @@ core::RmSubSheetCommand::RmSubSheetCommand(TileSheet &img, TileSheet::SubSheetId ox::Error RmSubSheetCommand::redo() noexcept { auto &parent = getSubSheet(m_img, m_parentIdx); m_sheet = std::move(parent.subsheets[*m_idx.back().value]); - oxReturnError(parent.subsheets.erase(*m_idx.back().value).error); + OX_RETURN_ERROR(parent.subsheets.erase(*m_idx.back().value).error); return {}; } diff --git a/src/nostalgia/modules/core/src/studio/tilesheeteditor/tilesheeteditor-imgui.cpp b/src/nostalgia/modules/core/src/studio/tilesheeteditor/tilesheeteditor-imgui.cpp index fc7f2d4..4f781f9 100644 --- a/src/nostalgia/modules/core/src/studio/tilesheeteditor/tilesheeteditor-imgui.cpp +++ b/src/nostalgia/modules/core/src/studio/tilesheeteditor/tilesheeteditor-imgui.cpp @@ -21,9 +21,9 @@ struct TileSheetEditorConfig { TileSheet::SubSheetIdx activeSubsheet{}; }; -oxModelBegin(TileSheetEditorConfig) - oxModelFieldRename(activeSubsheet, active_subsheet) -oxModelEnd() +OX_MODEL_BEGIN(TileSheetEditorConfig) + OX_MODEL_FIELD_RENAME(activeSubsheet, active_subsheet) +OX_MODEL_END() static ox::Vector normalizePixelSizes( ox::Vector const&inPixels, @@ -76,7 +76,7 @@ static ox::Error toPngFile( c = color32(color(pal, page, c)) | static_cast(0XFF << 24); } constexpr auto fmt = LCT_RGBA; - return OxError(static_cast( + return ox::Error(static_cast( lodepng_encode_file( path.c_str(), reinterpret_cast(pixels.data()), @@ -94,7 +94,6 @@ TileSheetEditorImGui::TileSheetEditorImGui(studio::StudioContext &sctx, ox::Stri m_model(m_view.model()) { std::ignore = setPaletteSelection(); // connect signal/slots - undoStack()->changeTriggered.connect(this, &TileSheetEditorImGui::markUnsavedChanges); m_subsheetEditor.inputSubmitted.connect(this, &TileSheetEditorImGui::updateActiveSubsheet); m_exportMenu.inputSubmitted.connect(this, &TileSheetEditorImGui::exportSubhseetToPng); m_model.paletteChanged.connect(this, &TileSheetEditorImGui::setPaletteSelection); @@ -196,7 +195,7 @@ void TileSheetEditorImGui::draw(studio::StudioContext&) noexcept { } } auto const paneSize = ImGui::GetContentRegionAvail(); - auto const tileSheetParentSize = ImVec2{paneSize.x - m_palViewWidth, paneSize.y}; + auto const tileSheetParentSize = ImVec2{paneSize.x - s_palViewWidth, paneSize.y}; auto const fbSize = ox::Vec2{tileSheetParentSize.x - 16, tileSheetParentSize.y - 16}; ImGui::BeginChild("TileSheetView", tileSheetParentSize, true); { @@ -204,10 +203,10 @@ void TileSheetEditorImGui::draw(studio::StudioContext&) noexcept { } ImGui::EndChild(); ImGui::SameLine(); - ImGui::BeginChild("Controls", {m_palViewWidth - 8, paneSize.y}, true); + ImGui::BeginChild("Controls", {s_palViewWidth - 8, paneSize.y}, true); { auto const controlsSize = ImGui::GetContentRegionAvail(); - ImGui::BeginChild("ToolBox", {m_palViewWidth - 24, 30}, true); + ImGui::BeginChild("ToolBox", {s_palViewWidth - 24, 30}, true); { auto const btnSz = ImVec2{45, 14}; if (ImGui::Selectable("Select", m_tool == TileSheetTool::Select, 0, btnSz)) { @@ -227,12 +226,12 @@ void TileSheetEditorImGui::draw(studio::StudioContext&) noexcept { ImGui::EndChild(); auto const ySize = controlsSize.y - 38; // draw palette/color picker - ImGui::BeginChild("Palette", {m_palViewWidth - 24, ySize / 2.f}, true); + ImGui::BeginChild("Palette", {s_palViewWidth - 24, ySize / 2.f}, true); { - drawPaletteSelector(); + drawPaletteMenu(); } ImGui::EndChild(); - ImGui::BeginChild("SubSheets", {m_palViewWidth - 24, ySize / 2.f}, true); + ImGui::BeginChild("SubSheets", {s_palViewWidth - 24, ySize / 2.f}, true); { static constexpr auto btnHeight = ig::BtnSz.y; auto const btnSize = ImVec2{btnHeight, btnHeight}; @@ -347,7 +346,7 @@ void TileSheetEditorImGui::showSubsheetEditor() noexcept { } ox::Error TileSheetEditorImGui::exportSubhseetToPng(int const scale) const noexcept { - oxRequire(path, studio::saveFile({{"PNG", "png"}})); + OX_REQUIRE(path, studio::saveFile({{"PNG", "png"}})); // subsheet to png auto const&img = m_model.img(); auto const&s = m_model.activeSubSheet(); @@ -434,7 +433,7 @@ void TileSheetEditorImGui::drawTileSheet(ox::Vec2 const&fbSize) noexcept { } } -void TileSheetEditorImGui::drawPaletteSelector() noexcept { +void TileSheetEditorImGui::drawPaletteMenu() noexcept { auto const&files = m_sctx.project->fileList(core::FileExt_npal); auto const comboWidthSub = 62; ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x - comboWidthSub); @@ -474,6 +473,7 @@ void TileSheetEditorImGui::drawPaletteSelector() noexcept { auto const&pal = m_model.pal(); if (pal.pages.size() > m_model.palettePage()) { for (auto i = 0u; auto const&c: pal.pages[m_model.palettePage()].colors) { + ImGui::TableNextRow(); ImGui::PushID(static_cast(i)); // Column: color idx ImGui::TableNextColumn(); @@ -492,7 +492,6 @@ void TileSheetEditorImGui::drawPaletteSelector() noexcept { ImGui::Text("%s", name); ImGui::TableNextColumn(); ImGui::Text("(%02d, %02d, %02d)", red16(c), green16(c), blue16(c)); - ImGui::TableNextRow(); ImGui::PopID(); ++i; } @@ -527,9 +526,12 @@ void TileSheetEditorImGui::setActiveSubsheet(TileSheet::SubSheetIdx path) noexce }); } -ox::Error TileSheetEditorImGui::markUnsavedChanges(studio::UndoCommand const*) noexcept { - setUnsavedChanges(true); - return {}; + +void TileSheetEditorImGui::SubSheetEditor::show(ox::StringViewCR name, int const cols, int const rows) noexcept { + m_show = true; + m_name = name; + m_cols = cols; + m_rows = rows; } void TileSheetEditorImGui::SubSheetEditor::draw(turbine::Context &tctx) noexcept { @@ -558,6 +560,12 @@ void TileSheetEditorImGui::SubSheetEditor::close() noexcept { m_show = false; } + +void TileSheetEditorImGui::ExportMenu::show() noexcept { + m_show = true; + m_scale = 5; +} + void TileSheetEditorImGui::ExportMenu::draw(turbine::Context &tctx) noexcept { constexpr auto popupName = "Export Tile Sheet"; if (!m_show) { diff --git a/src/nostalgia/modules/core/src/studio/tilesheeteditor/tilesheeteditor-imgui.hpp b/src/nostalgia/modules/core/src/studio/tilesheeteditor/tilesheeteditor-imgui.hpp index f891208..7ad6f27 100644 --- a/src/nostalgia/modules/core/src/studio/tilesheeteditor/tilesheeteditor-imgui.hpp +++ b/src/nostalgia/modules/core/src/studio/tilesheeteditor/tilesheeteditor-imgui.hpp @@ -26,17 +26,12 @@ class TileSheetEditorImGui: public studio::Editor { int m_rows = 0; bool m_show = false; public: - ox::Signal inputSubmitted; - constexpr void show(ox::StringView const&name, int cols, int rows) noexcept { - m_show = true; - m_name = name; - m_cols = cols; - m_rows = rows; - } + ox::Signal inputSubmitted; + void show(ox::StringViewCR name, int cols, int rows) noexcept; void draw(turbine::Context &sctx) noexcept; void close() noexcept; [[nodiscard]] - inline bool isOpen() const noexcept { return m_show; } + constexpr bool isOpen() const noexcept { return m_show; } }; class ExportMenu { private: @@ -44,15 +39,13 @@ class TileSheetEditorImGui: public studio::Editor { bool m_show = false; public: ox::Signal inputSubmitted; - constexpr void show() noexcept { - m_show = true; - m_scale = 5; - } + void show() noexcept; void draw(turbine::Context &sctx) noexcept; void close() noexcept; [[nodiscard]] - inline bool isOpen() const noexcept { return m_show; } + constexpr bool isOpen() const noexcept { return m_show; } }; + static constexpr float s_palViewWidth = 300; std::size_t m_selectedPaletteIdx = 0; studio::StudioContext &m_sctx; turbine::Context &m_tctx; @@ -62,7 +55,6 @@ class TileSheetEditorImGui: public studio::Editor { glutils::FrameBuffer m_framebuffer; TileSheetEditorView m_view; TileSheetEditorModel &m_model; - float m_palViewWidth = 300; ox::Vec2 m_prevMouseDownPos; TileSheetTool m_tool = TileSheetTool::Draw; @@ -101,7 +93,7 @@ class TileSheetEditorImGui: public studio::Editor { void drawTileSheet(ox::Vec2 const&fbSize) noexcept; - void drawPaletteSelector() noexcept; + void drawPaletteMenu() noexcept; ox::Error updateActiveSubsheet(ox::StringView const&name, int cols, int rows) noexcept; @@ -109,8 +101,6 @@ class TileSheetEditorImGui: public studio::Editor { // slots private: - ox::Error markUnsavedChanges(studio::UndoCommand const*) noexcept; - void setActiveSubsheet(TileSheet::SubSheetIdx path) noexcept; }; diff --git a/src/nostalgia/modules/core/src/studio/tilesheeteditor/tilesheeteditormodel.cpp b/src/nostalgia/modules/core/src/studio/tilesheeteditor/tilesheeteditormodel.cpp index 15811e7..bfef4a2 100644 --- a/src/nostalgia/modules/core/src/studio/tilesheeteditor/tilesheeteditormodel.cpp +++ b/src/nostalgia/modules/core/src/studio/tilesheeteditor/tilesheeteditormodel.cpp @@ -132,7 +132,7 @@ ox::StringView TileSheetEditorModel::palPath() const noexcept { } ox::Error TileSheetEditorModel::setPalette(ox::StringView path) noexcept { - oxRequire(uuid, keelCtx(m_tctx).pathToUuid.at(path)); + OX_REQUIRE(uuid, keelCtx(m_tctx).pathToUuid.at(path)); pushCommand(ox::make(activeSubSheetIdx(), m_img, uuid->toString())); return {}; } @@ -190,16 +190,16 @@ void TileSheetEditorModel::setActiveSubsheet(TileSheet::SubSheetIdx const&idx) n } void TileSheetEditorModel::fill(ox::Point const&pt, int palIdx) noexcept { - const auto &s = getSubSheet(m_img, m_activeSubsSheetIdx); + auto const&activeSubSheet = getSubSheet(m_img, m_activeSubsSheetIdx); // build idx list - ox::Array updateMap = {}; - const auto oldColor = getPixel(s, m_img.bpp, pt); - if (pt.x >= s.columns * TileWidth || pt.y >= s.rows * TileHeight) { + if (pt.x >= activeSubSheet.columns * TileWidth || pt.y >= activeSubSheet.rows * TileHeight) { return; } + ox::Array updateMap = {}; + auto const oldColor = getPixel(activeSubSheet, m_img.bpp, pt); getFillPixels(updateMap, pt, oldColor); ox::Vector idxList; - auto i = core::idx(s, pt) / PixelsPerTile * PixelsPerTile; + auto i = core::idx(activeSubSheet, pt) / PixelsPerTile * PixelsPerTile; for (auto u : updateMap) { if (u) { idxList.emplace_back(i); @@ -209,7 +209,7 @@ void TileSheetEditorModel::fill(ox::Point const&pt, int palIdx) noexcept { // do updates to sheet if (m_ongoingDrawCommand) { m_updated = m_updated || m_ongoingDrawCommand->append(idxList); - } else if (getPixel(s, m_img.bpp, pt) != palIdx) { + } else if (getPixel(activeSubSheet, m_img.bpp, pt) != palIdx) { pushCommand(ox::make(m_img, m_activeSubsSheetIdx, idxList, palIdx)); } } @@ -250,7 +250,7 @@ ox::Error TileSheetEditorModel::markUpdatedCmdId(studio::UndoCommand const*cmd) m_updated = true; const auto cmdId = cmd->commandId(); if (static_cast(cmdId) == CommandId::PaletteChange) { - oxReturnError(readObj(keelCtx(m_tctx), m_img.defaultPalette).moveTo(m_pal)); + OX_RETURN_ERROR(readObj(keelCtx(m_tctx), m_img.defaultPalette).moveTo(m_pal)); m_palettePage = ox::min(m_pal->pages.size(), 0); paletteChanged.emit(); } diff --git a/src/nostalgia/modules/core/src/studio/tilesheeteditor/tilesheeteditorview.cpp b/src/nostalgia/modules/core/src/studio/tilesheeteditor/tilesheeteditorview.cpp index 8ebd53f..7b1c318 100644 --- a/src/nostalgia/modules/core/src/studio/tilesheeteditor/tilesheeteditorview.cpp +++ b/src/nostalgia/modules/core/src/studio/tilesheeteditor/tilesheeteditorview.cpp @@ -16,8 +16,8 @@ TileSheetEditorView::TileSheetEditorView(studio::StudioContext &sctx, ox::String m_pixelsDrawer(m_model) { glBindVertexArray(0); // build shaders - oxThrowError(m_pixelsDrawer.buildShader()); - oxThrowError(m_pixelGridDrawer.buildShader()); + OX_THROW_ERROR(m_pixelsDrawer.buildShader()); + OX_THROW_ERROR(m_pixelGridDrawer.buildShader()); m_model.activeSubsheetChanged.connect(this, &TileSheetEditorView::setActiveSubsheet); } diff --git a/src/nostalgia/modules/core/src/tilesheet.cpp b/src/nostalgia/modules/core/src/tilesheet.cpp index 29ca442..6a11393 100644 --- a/src/nostalgia/modules/core/src/tilesheet.cpp +++ b/src/nostalgia/modules/core/src/tilesheet.cpp @@ -144,7 +144,7 @@ static ox::Error setPixelCount(ox::Vector &pixels, int8_t pBpp, std::si sz = cnt; break; default: - return OxError(1, "Invalid pBpp used for TileSheet::SubSheet::setPixelCount"); + return ox::Error(1, "Invalid pBpp used for TileSheet::SubSheet::setPixelCount"); } pixels.reserve(sz); pixels.resize(sz); @@ -162,7 +162,7 @@ unsigned pixelCnt(TileSheet::SubSheet const&ss, int8_t pBpp) noexcept { ox::Error resizeSubsheet(TileSheet::SubSheet &ss, int8_t pBpp, ox::Size const&sz) noexcept { ox::Vector out; - oxReturnError(setPixelCount(out, pBpp, static_cast(sz.width * sz.height) * PixelsPerTile)); + OX_RETURN_ERROR(setPixelCount(out, pBpp, static_cast(sz.width * sz.height) * PixelsPerTile)); auto const w = ox::min(ss.columns, sz.width) * TileWidth; auto const h = ox::min(ss.rows, sz.height) * TileHeight; for (auto x = 0; x < w; ++x) { @@ -187,7 +187,7 @@ ox::Result getNameFor(TileSheet::SubSheet const&ss, SubSheetId p return name; } } - return OxError(1, "SubSheet not found"); + return ox::Error(1, "SubSheet not found"); } @@ -256,7 +256,7 @@ ox::Error addSubSheet(TileSheet &ts, TileSheet::SubSheetIdx const&idx) noexcept parent.subsheets.emplace_back(++ts.idIt, "Subsheet 0", parent.columns, parent.rows, ts.bpp); parent.subsheets.emplace_back(++ts.idIt, "Subsheet 1", 1, 1, ts.bpp); } - return OxError(0); + return ox::Error(0); } ox::Error rmSubSheet( @@ -345,7 +345,7 @@ static ox::Result getIdFor( return getIdFor(ss, pNamePath, pIt + 1); } } - return OxError(1, "SubSheet not found"); + return ox::Error(1, "SubSheet not found"); } ox::Result getIdFor(TileSheet const&ts, ox::StringViewCR path) noexcept { @@ -363,7 +363,7 @@ static ox::Result getTileOffset( unsigned pCurrentTotal = 0) noexcept { // pIt == pNamePath.size() - 1 && if (ss.name != pNamePath[pIt]) { - return OxError(2, "Wrong branch"); + return ox::Error(2, "Wrong branch"); } if (pIt == pNamePath.size() - 1) { return pCurrentTotal; @@ -376,7 +376,7 @@ static ox::Result getTileOffset( } pCurrentTotal += pixelCnt(sub, pBpp) / PixelsPerTile; } - return OxError(1, "SubSheet not found"); + return ox::Error(1, "SubSheet not found"); } ox::Result getTileOffset(TileSheet const&ts, ox::StringViewCR pNamePath) noexcept { diff --git a/src/nostalgia/modules/core/test/tests.cpp b/src/nostalgia/modules/core/test/tests.cpp index 48b2825..1d46812 100644 --- a/src/nostalgia/modules/core/test/tests.cpp +++ b/src/nostalgia/modules/core/test/tests.cpp @@ -16,8 +16,8 @@ static std::map tests = { "readWriteTileSheet", []() -> ox::Error { core::TileSheet in; - oxRequire(buff, ox::writeMC(in)); - oxRequire(out, ox::readMC(buff)); + OX_REQUIRE(buff, ox::writeMC(in)); + OX_REQUIRE(out, ox::readMC(buff)); oxAssert(in.subsheet.name == out.subsheet.name, "subsheet.name serialization broken"); return {}; } diff --git a/src/nostalgia/modules/scene/include/nostalgia/scene/scenestatic.hpp b/src/nostalgia/modules/scene/include/nostalgia/scene/scenestatic.hpp index 709a0ab..3cc9825 100644 --- a/src/nostalgia/modules/scene/include/nostalgia/scene/scenestatic.hpp +++ b/src/nostalgia/modules/scene/include/nostalgia/scene/scenestatic.hpp @@ -57,12 +57,12 @@ struct TileDoc { }; -oxModelBegin(TileDoc) - oxModelFieldRename(subsheetId, subsheet_id) - oxModelFieldRename(subsheetPath, subsheet_path) - oxModelField(type) - oxModelFieldRename(layerAttachments, layer_attachments) -oxModelEnd() +OX_MODEL_BEGIN(TileDoc) + OX_MODEL_FIELD_RENAME(subsheetId, subsheet_id) + OX_MODEL_FIELD_RENAME(subsheetPath, subsheet_path) + OX_MODEL_FIELD(type) + OX_MODEL_FIELD_RENAME(layerAttachments, layer_attachments) +OX_MODEL_END() struct SceneDoc { @@ -95,11 +95,11 @@ struct SceneDoc { } }; -oxModelBegin(SceneDoc) - oxModelField(tilesheet) - oxModelField(palettes) - oxModelField(tiles) -oxModelEnd() +OX_MODEL_BEGIN(SceneDoc) + OX_MODEL_FIELD(tilesheet) + OX_MODEL_FIELD(palettes) + OX_MODEL_FIELD(tiles) +OX_MODEL_END() constexpr void setTopEdge(uint8_t &layerAttachments, unsigned val) noexcept { @@ -215,14 +215,14 @@ struct SceneStatic { }; -oxModelBegin(SceneStatic) - oxModelField(tilesheet) - oxModelField(palettes) - oxModelField(columns) - oxModelField(rows) - oxModelField(tileMapIdx) - oxModelField(tileType) - oxModelField(layerAttachments) -oxModelEnd() +OX_MODEL_BEGIN(SceneStatic) + OX_MODEL_FIELD(tilesheet) + OX_MODEL_FIELD(palettes) + OX_MODEL_FIELD(columns) + OX_MODEL_FIELD(rows) + OX_MODEL_FIELD(tileMapIdx) + OX_MODEL_FIELD(tileType) + OX_MODEL_FIELD(layerAttachments) +OX_MODEL_END() } diff --git a/src/nostalgia/modules/scene/src/keel/typeconv.cpp b/src/nostalgia/modules/scene/src/keel/typeconv.cpp index ac1e4d1..ede2069 100644 --- a/src/nostalgia/modules/scene/src/keel/typeconv.cpp +++ b/src/nostalgia/modules/scene/src/keel/typeconv.cpp @@ -37,7 +37,7 @@ ox::Error SceneDocToSceneStaticConverter::convert( keel::Context &ctx, SceneDoc &src, SceneStatic &dst) const noexcept { - oxRequire(ts, keel::readObj(ctx, src.tilesheet)); + OX_REQUIRE(ts, keel::readObj(ctx, src.tilesheet)); const auto layerCnt = src.tiles.size(); dst.setLayerCnt(layerCnt); dst.tilesheet = ox::FileAddress(src.tilesheet); @@ -53,8 +53,8 @@ ox::Error SceneDocToSceneStaticConverter::convert( for (const auto &srcTile : row) { auto dstTile = dstLayer.tile(tileIdx); dstTile.tileType = srcTile.type; - oxRequire(path, srcTile.getSubsheetPath(*ts)); - oxRequire(mapIdx, getTileOffset(*ts, path)); + OX_REQUIRE(path, srcTile.getSubsheetPath(*ts)); + OX_REQUIRE(mapIdx, getTileOffset(*ts, path)); dstTile.tileMapIdx = static_cast(mapIdx); setLayerAttachments(layerIdx, srcTile, dstTile); ++tileIdx; diff --git a/src/nostalgia/modules/scene/src/scene.cpp b/src/nostalgia/modules/scene/src/scene.cpp index b0d87bd..aa08f35 100644 --- a/src/nostalgia/modules/scene/src/scene.cpp +++ b/src/nostalgia/modules/scene/src/scene.cpp @@ -14,11 +14,11 @@ Scene::Scene(SceneStatic const&sceneStatic) noexcept: ox::Error Scene::setupDisplay(core::Context &ctx) const noexcept { if (m_sceneStatic.palettes.empty()) { - return OxError(1, "Scene has no palettes"); + return ox::Error(1, "Scene has no palettes"); } auto const&palette = m_sceneStatic.palettes[0]; - oxReturnError(core::loadBgTileSheet(ctx, 0, m_sceneStatic.tilesheet)); - oxReturnError(core::loadBgPalette(ctx, 0, palette)); + OX_RETURN_ERROR(core::loadBgTileSheet(ctx, 0, m_sceneStatic.tilesheet)); + OX_RETURN_ERROR(core::loadBgPalette(ctx, 0, palette)); // disable all backgrounds core::setBgStatus(ctx, 0); for (auto layerNo = 0u; auto const&layer : m_sceneStatic.tileMapIdx) { diff --git a/src/nostalgia/modules/scene/src/studio/sceneeditor-imgui.cpp b/src/nostalgia/modules/scene/src/studio/sceneeditor-imgui.cpp index 4a457c3..b7891a8 100644 --- a/src/nostalgia/modules/scene/src/studio/sceneeditor-imgui.cpp +++ b/src/nostalgia/modules/scene/src/studio/sceneeditor-imgui.cpp @@ -48,7 +48,7 @@ void SceneEditorImGui::onActivated() noexcept { ox::Error SceneEditorImGui::saveItem() noexcept { const auto sctx = applicationData(m_ctx); - oxReturnError(sctx->project->writeObj(itemPath(), m_editor.scene())); + OX_RETURN_ERROR(sctx->project->writeObj(itemPath(), m_editor.scene())); return {}; } diff --git a/src/nostalgia/player/app.cpp b/src/nostalgia/player/app.cpp index 4191b0a..7a531f1 100644 --- a/src/nostalgia/player/app.cpp +++ b/src/nostalgia/player/app.cpp @@ -67,12 +67,12 @@ static void testKeyEventHandler(turbine::Context &tctx, turbine::Key key, bool d static ox::Error runTest(turbine::Context &tctx) { constexpr ox::StringView TileSheetAddr{"/TileSheets/Charset.ng"}; constexpr ox::StringView PaletteAddr{"/Palettes/Chester.npal"}; - oxRequireM(cctx, core::init(tctx)); + OX_REQUIRE_M(cctx, core::init(tctx)); turbine::setApplicationData(tctx, cctx.get()); - oxRequire(tsStat, turbine::rom(tctx)->stat(PaletteAddr)); - oxReturnError(core::loadSpriteTileSheet(*cctx, TileSheetAddr)); - oxReturnError(core::loadSpritePalette(*cctx, PaletteAddr)); - oxReturnError(core::initConsole(*cctx)); + OX_REQUIRE(tsStat, turbine::rom(tctx)->stat(PaletteAddr)); + OX_RETURN_ERROR(core::loadSpriteTileSheet(*cctx, TileSheetAddr)); + OX_RETURN_ERROR(core::loadSpritePalette(*cctx, PaletteAddr)); + OX_RETURN_ERROR(core::initConsole(*cctx)); core::puts(*cctx, 10, 9, "DOPENESS!!!"); turbine::setUpdateHandler(tctx, testUpdateHandler); turbine::setKeyEventHandler(tctx, testKeyEventHandler); @@ -85,9 +85,9 @@ static ox::Error runTileSheetSetTest(turbine::Context &tctx) { // this should make the screen display 'ABCDB', with the A being upside down // and the first B being backwards constexpr ox::StringView PaletteAddr{"/Palettes/Charset.npal"}; - oxRequireM(cctx, core::init(tctx)); + OX_REQUIRE_M(cctx, core::init(tctx)); turbine::setApplicationData(tctx, cctx.get()); - oxRequire(tsStat, turbine::rom(tctx)->stat(PaletteAddr)); + OX_REQUIRE(tsStat, turbine::rom(tctx)->stat(PaletteAddr)); core::TileSheetSet const set{ .bpp = 4, .entries = { @@ -98,11 +98,11 @@ static ox::Error runTileSheetSetTest(turbine::Context &tctx) { }, }; constexpr auto bgPalBank = 1; - oxReturnError(core::loadBgTileSheet(*cctx, 0, set)); - oxReturnError(core::loadSpriteTileSheet(*cctx, set)); - oxReturnError(core::loadBgPalette(*cctx, bgPalBank, PaletteAddr)); - oxReturnError(core::loadBgPalette(*cctx, 0, PaletteAddr)); - oxReturnError(core::loadSpritePalette(*cctx, PaletteAddr)); + OX_RETURN_ERROR(core::loadBgTileSheet(*cctx, 0, set)); + OX_RETURN_ERROR(core::loadSpriteTileSheet(*cctx, set)); + OX_RETURN_ERROR(core::loadBgPalette(*cctx, bgPalBank, PaletteAddr)); + OX_RETURN_ERROR(core::loadBgPalette(*cctx, 0, PaletteAddr)); + OX_RETURN_ERROR(core::loadSpritePalette(*cctx, PaletteAddr)); core::setBgStatus(*cctx, 0, true); core::setBgTile(*cctx, 0, 10, 9, { .tileIdx = 1, .palBank = bgPalBank, .flipX = 0, .flipY = 1 }); core::setBgTile(*cctx, 0, 11, 9, { .tileIdx = 2, .palBank = bgPalBank, .flipX = 1, .flipY = 0 }); @@ -148,29 +148,25 @@ static void sceneKeyEventHandler(turbine::Context &tctx, turbine::Key key, bool [[maybe_unused]] static ox::Error runScene(turbine::Context &tctx) { constexpr ox::StringView SceneAddr{"/Scenes/Chester.nscn"}; - oxRequireM(cctx, core::init(tctx)); - oxRequire(scn, keel::readObj(keelCtx(tctx), SceneAddr)); + OX_REQUIRE_M(cctx, core::init(tctx)); + OX_REQUIRE(scn, keel::readObj(keelCtx(tctx), SceneAddr)); turbine::setUpdateHandler(tctx, sceneUpdateHandler); turbine::setKeyEventHandler(tctx, sceneKeyEventHandler); scene::Scene const scene(*scn); - oxReturnError(scene.setupDisplay(*cctx)); + OX_RETURN_ERROR(scene.setupDisplay(*cctx)); return turbine::run(tctx); } -namespace olympic { - ox::Error run( [[maybe_unused]] ox::StringView project, [[maybe_unused]] ox::StringView appName, [[maybe_unused]] ox::StringView projectDataDir, ox::SpanView args) noexcept { if (args.size() < 2) { - return OxError(1, "Please provide path to project directory or OxFS file."); + return ox::Error(1, "Please provide path to project directory or OxFS file."); } auto const path = args[1]; - oxRequireM(fs, keel::loadRomFs(path)); - oxRequireM(tctx, turbine::init(std::move(fs), project)); + OX_REQUIRE_M(fs, keel::loadRomFs(path)); + OX_REQUIRE_M(tctx, turbine::init(std::move(fs), project)); return runTileSheetSetTest(*tctx); } - -} \ No newline at end of file diff --git a/src/olympic/applib/applib.cpp b/src/olympic/applib/applib.cpp index 28211d8..3bb0210 100644 --- a/src/olympic/applib/applib.cpp +++ b/src/olympic/applib/applib.cpp @@ -17,6 +17,10 @@ #define OLYMPIC_APP_VERSION "dev build" #endif +#ifndef OLYMPIC_GUI_APP +#define OLYMPIC_GUI_APP 0 +#endif + #ifndef OLYMPIC_PROJECT_NAMESPACE #define OLYMPIC_PROJECT_NAMESPACE project #endif @@ -34,23 +38,21 @@ #endif namespace olympic { - ox::String appVersion = ox::String(OLYMPIC_APP_VERSION); +} ox::Error run( ox::StringView project, ox::StringView appName, ox::StringView projectDataDir, - ox::SpanView argv) noexcept; - -} + ox::SpanView argv) noexcept; namespace OLYMPIC_PROJECT_NAMESPACE { void registerKeelModules() noexcept; void registerStudioModules() noexcept; } -#ifdef _WIN32 +#if defined(_WIN32) && OLYMPIC_GUI_APP int WinMain() { auto const argc = __argc; auto const argv = const_cast(__argv); @@ -64,7 +66,7 @@ int main(int argc, char const**argv) { #if OLYMPIC_LOAD_STUDIO_MODULES OLYMPIC_PROJECT_NAMESPACE::registerStudioModules(); #endif - auto const err = olympic::run( + auto const err = run( OLYMPIC_PROJECT_NAME, OLYMPIC_APP_NAME, OLYMPIC_PROJECT_DATADIR, diff --git a/src/olympic/keel/include/keel/asset.hpp b/src/olympic/keel/include/keel/asset.hpp index 7639a37..a3d5da7 100644 --- a/src/olympic/keel/include/keel/asset.hpp +++ b/src/olympic/keel/include/keel/asset.hpp @@ -16,8 +16,8 @@ constexpr auto K1HdrSz = 40; ox::Result readUuidHeader(ox::BufferView buff) noexcept; ox::Error writeUuidHeader(ox::Writer_c auto &writer, ox::UUID const&uuid) noexcept { - oxReturnError(write(writer, "K1;")); - oxReturnError(uuid.toString(writer)); + OX_RETURN_ERROR(write(writer, "K1;")); + OX_RETURN_ERROR(uuid.toString(writer)); return writer.put(';'); } @@ -29,8 +29,8 @@ ox::Result readAsset(ox::BufferView buff) noexcept { offset = K1HdrSz; // the size of K1 headers } auto out = ox::readClaw(buff + offset); - oxReturnError(out); - oxReturnError(ensureValid(out.value)); + OX_RETURN_ERROR(out); + OX_RETURN_ERROR(ensureValid(out.value)); return out; } diff --git a/src/olympic/keel/include/keel/assetmanager.hpp b/src/olympic/keel/include/keel/assetmanager.hpp index 7180740..a857879 100644 --- a/src/olympic/keel/include/keel/assetmanager.hpp +++ b/src/olympic/keel/include/keel/assetmanager.hpp @@ -155,7 +155,7 @@ class AssetRef: public ox::SignalHandler { private: constexpr ox::Error emitUpdated() const noexcept { updated.emit(); - return OxError(0); + return ox::Error(0); } }; @@ -205,16 +205,16 @@ class AssetManager { AssetTypeManager(Loader loader) noexcept: m_loader(loader) {} ox::Result> getAsset(ox::StringView const assetId) const noexcept { - oxRequire(out, m_cache.at(assetId)); + OX_REQUIRE(out, m_cache.at(assetId)); if (!out || !*out) { - return OxError(1, "asset is null"); + return ox::Error(1, "asset is null"); } return AssetRef(out->get()); } ox::Result> loadAsset(ox::StringView const assetId) noexcept { auto &p = m_cache[assetId]; - oxRequireM(obj, m_loader(assetId)); + OX_REQUIRE_M(obj, m_loader(assetId)); if (!p) { p = ox::make_unique>(std::move(obj)); } else { @@ -226,7 +226,7 @@ class AssetManager { ox::Error reloadAsset(ox::StringView const assetId) noexcept { auto &p = m_cache[assetId]; - oxRequireM(obj, m_loader(assetId)); + OX_REQUIRE_M(obj, m_loader(assetId)); if (!p) { p = ox::make_unique>(std::move(obj)); } else { @@ -256,7 +256,7 @@ class AssetManager { auto &am = m_assetTypeManagers[typeId]; auto const out = dynamic_cast*>(am.get()); if (!out) { - return OxError(1, "no AssetTypeManager for type"); + return ox::Error(1, "no AssetTypeManager for type"); } return out; } @@ -274,7 +274,7 @@ class AssetManager { template ox::Result> getAsset(ox::StringView assetId) noexcept { - oxRequire(m, getTypeManager()); + OX_REQUIRE(m, getTypeManager()); return m->getAsset(assetId); } @@ -285,8 +285,8 @@ class AssetManager { template ox::Result> loadAsset(ox::StringView assetId) noexcept { - oxRequire(m, getTypeManager()); - oxRequire(out, m->loadAsset(assetId)); + OX_REQUIRE(m, getTypeManager()); + OX_REQUIRE(out, m->loadAsset(assetId)); m_fileUpdated[assetId].connect(m, &AssetTypeManager::reloadAsset); return out; } diff --git a/src/olympic/keel/include/keel/media.hpp b/src/olympic/keel/include/keel/media.hpp index 11a672f..17646fd 100644 --- a/src/olympic/keel/include/keel/media.hpp +++ b/src/olympic/keel/include/keel/media.hpp @@ -25,15 +25,15 @@ struct PreloadPtr { uint64_t preloadAddr = 0; }; -oxModelBegin(PreloadPtr) - oxModelField(preloadAddr) -oxModelEnd() +OX_MODEL_BEGIN(PreloadPtr) + OX_MODEL_FIELD(preloadAddr) +OX_MODEL_END() ox::Result getPreloadAddr(keel::Context &ctx, ox::FileAddress const&addr) noexcept; ox::Result getPreloadAddr(keel::Context &ctx, ox::StringViewCR path) noexcept; -void createUuidMapping(Context &ctx, ox::StringView filePath, ox::UUID const&uuid) noexcept; +void createUuidMapping(Context &ctx, ox::StringViewCR filePath, ox::UUID const&uuid) noexcept; ox::Error buildUuidMap(Context &ctx) noexcept; @@ -41,17 +41,17 @@ ox::Result pathToUuid(Context &ctx, ox::StringViewCR path) noexcept; ox::Result getUuid(Context &ctx, ox::FileAddress const&fileAddr) noexcept; -ox::Result getUuid(Context &ctx, ox::StringView path) noexcept; +ox::Result getUuid(Context &ctx, ox::StringViewCR path) noexcept; ox::Result getPath(Context &ctx, ox::FileAddress const&fileAddr) noexcept; -ox::Result getPath(Context &ctx, ox::CStringView fileId) noexcept; +ox::Result getPath(Context &ctx, ox::CStringViewCR fileId) noexcept; -constexpr ox::Result uuidUrlToUuid(ox::StringView uuidUrl) noexcept { +constexpr ox::Result uuidUrlToUuid(ox::StringViewCR uuidUrl) noexcept { return ox::UUID::fromString(substr(uuidUrl, 7)); } -ox::Result uuidUrlToPath(Context &ctx, ox::StringView uuid) noexcept; +ox::Result uuidUrlToPath(Context &ctx, ox::StringViewCR uuid) noexcept; ox::Result uuidToPath(Context &ctx, ox::StringViewCR uuid) noexcept; @@ -62,15 +62,15 @@ ox::Result uuidToPath(Context &ctx, ox::UUID const&uuid) noexce namespace detail { template constexpr auto makeLoader(Context &ctx) { - return [&ctx](ox::StringView assetId) -> ox::Result { - oxRequire(p, ctx.uuidToPath.at(assetId)); - oxRequire(buff, ctx.rom->read(*p)); + return [&ctx](ox::StringViewCR assetId) -> ox::Result { + OX_REQUIRE(p, ctx.uuidToPath.at(assetId)); + OX_REQUIRE(buff, ctx.rom->read(*p)); auto [obj, err] = readAsset(buff); if (err) { if (err != ox::Error_ClawTypeVersionMismatch && err != ox::Error_ClawTypeMismatch) { return err; } - oxReturnError(convert(ctx, buff, &obj)); + OX_RETURN_ERROR(convert(ctx, buff, &obj)); } return std::move(obj); }; @@ -80,27 +80,34 @@ constexpr auto makeLoader(Context &ctx) { template ox::Result> readObjFile( keel::Context &ctx, - ox::StringView assetId, - bool forceLoad) noexcept { + ox::StringViewCR assetId, + bool const forceLoad) noexcept { + static constexpr auto load = []( + keel::Context &ctx, + ox::StringViewCR assetId, + bool forceLoad) -> ox::Result> { + if (forceLoad) { + ctx.assetManager.initTypeManager(detail::makeLoader, ctx); + return ctx.assetManager.loadAsset(assetId); + } else { + auto [cached, err] = ctx.assetManager.getAsset(assetId); + if (err) { + ctx.assetManager.initTypeManager(detail::makeLoader, ctx); + OX_RETURN_ERROR(ctx.assetManager.loadAsset(assetId).moveTo(cached)); + } + return cached; + } + }; if (beginsWith(assetId, "uuid://")) { - assetId = substr(assetId, 7); + return load(ctx, substr(assetId, 7), forceLoad); } else { auto const [uuid, uuidErr] = getUuid(ctx, assetId); if (!uuidErr) { - assetId = uuid.toString(); + return load(ctx, uuid.toString(), forceLoad); + } else { + return load(ctx, assetId, forceLoad); } } - if (forceLoad) { - ctx.assetManager.initTypeManager(detail::makeLoader, ctx); - return ctx.assetManager.loadAsset(assetId); - } else { - auto [cached, err] = ctx.assetManager.getAsset(assetId); - if (err) { - ctx.assetManager.initTypeManager(detail::makeLoader, ctx); - oxReturnError(ctx.assetManager.loadAsset(assetId).moveTo(cached)); - } - return cached; - } } #else @@ -110,16 +117,16 @@ ox::Result> readObjNoCache( keel::Context &ctx, ox::StringViewCR assetId) noexcept { if constexpr(ox::preloadable::value) { - oxRequire(addr, getPreloadAddr(ctx, assetId)); + OX_REQUIRE(addr, getPreloadAddr(ctx, assetId)); return keel::AssetRef(std::bit_cast(uintptr_t{addr})); } else { - return OxError(1); + return ox::Error(1); } } #endif -ox::Error reloadAsset(keel::Context &ctx, ox::StringView assetId) noexcept; +ox::Error reloadAsset(keel::Context &ctx, ox::StringViewCR assetId) noexcept; template ox::Result> readObj( @@ -139,14 +146,14 @@ ox::Result> readObj( ox::FileAddress const&file, [[maybe_unused]] bool forceLoad = false) noexcept { #ifndef OX_BARE_METAL - oxRequire(assetId, file.getPath()); + OX_REQUIRE(assetId, file.getPath()); return readObj(ctx, ox::StringView(assetId), forceLoad); #else if constexpr(ox::preloadable::value) { - oxRequire(addr, getPreloadAddr(ctx, file)); + OX_REQUIRE(addr, getPreloadAddr(ctx, file)); return keel::AssetRef(std::bit_cast(uintptr_t{addr})); } else { - return OxError(1); + return ox::Error(1); } #endif } @@ -157,13 +164,13 @@ ox::Error writeObj( ox::FileAddress const&file, T const&obj, ox::ClawFormat fmt = ox::ClawFormat::Metal) noexcept { - oxRequire(objBuff, ox::writeClaw(obj, fmt)); + OX_REQUIRE(objBuff, ox::writeClaw(obj, fmt)); return ctx.rom->write(file, objBuff.data(), objBuff.size()); } ox::Error setRomFs(Context &ctx, ox::UPtr &&fs) noexcept; -ox::Result> loadRomFs(ox::StringViewCR path) noexcept; +ox::Result> loadRomFs(ox::StringViewCR path) noexcept; ox::Result loadRom(ox::StringViewCR path = "") noexcept; diff --git a/src/olympic/keel/include/keel/pack.hpp b/src/olympic/keel/include/keel/pack.hpp index 532b4ef..658bad6 100644 --- a/src/olympic/keel/include/keel/pack.hpp +++ b/src/olympic/keel/include/keel/pack.hpp @@ -20,11 +20,11 @@ struct ManifestEntry { ox::String type; }; -oxModelBegin(ManifestEntry) - oxModelField(inode) - oxModelField(preloaded) - oxModelField(type) -oxModelEnd() +OX_MODEL_BEGIN(ManifestEntry) + OX_MODEL_FIELD(inode) + OX_MODEL_FIELD(preloaded) + OX_MODEL_FIELD(type) +OX_MODEL_END() struct Manifest { static constexpr auto TypeName = "net.drinkingtea.keel.Manifest"; @@ -32,9 +32,9 @@ struct Manifest { ox::HashMap files; }; -oxModelBegin(Manifest) - oxModelField(files) -oxModelEnd() +OX_MODEL_BEGIN(Manifest) + OX_MODEL_FIELD(files) +OX_MODEL_END() class Context; @@ -113,24 +113,24 @@ ox::Error preloadObj( ox::Preloader &pl, ox::StringView const path) noexcept { // load file - oxRequireM(buff, romFs.read(path)); - oxRequireM(obj, keel::readAsset(ts, buff)); + OX_REQUIRE_M(buff, romFs.read(path)); + OX_REQUIRE_M(obj, keel::readAsset(ts, buff)); if (obj.type()->preloadable) { // preload auto const size = ox::sizeOf(&obj); auto const alignment = ox::alignOf(obj); - oxRequire(a, pl.startAlloc(size, alignment)); + OX_REQUIRE(a, pl.startAlloc(size, alignment)); auto const err = ox::preload(&pl, &obj); - oxReturnError(pl.endAlloc()); - oxReturnError(err); + OX_RETURN_ERROR(pl.endAlloc()); + OX_RETURN_ERROR(err); keel::PreloadPtr const p{.preloadAddr = a}; - oxReturnError(ox::writeMC(p).moveTo(buff)); + OX_RETURN_ERROR(ox::writeMC(p).moveTo(buff)); oxOutf("preloaded {} as a {} @ {} to {}\n", path, obj.type()->typeName, a, a + size); } else { // strip the Claw header (it is not needed after preloading) and write back out to dest fs - oxReturnError(ox::writeMC(obj).moveTo(buff)); + OX_RETURN_ERROR(ox::writeMC(obj).moveTo(buff)); } - oxReturnError(romFs.write(path, buff.data(), buff.size())); + OX_RETURN_ERROR(romFs.write(path, buff.data(), buff.size())); return {}; } @@ -145,13 +145,13 @@ ox::Error preloadDir( ox::StringViewCR path) noexcept { // copy oxTracef("pack.preload", "path: {}", path); - oxRequire(fileList, romFs.ls(path)); + OX_REQUIRE(fileList, romFs.ls(path)); for (auto const&name : fileList) { auto const filePath = ox::sfmt("{}{}", path, name); - oxRequire(stat, romFs.stat(filePath)); + OX_REQUIRE(stat, romFs.stat(filePath)); if (stat.fileType == ox::FileType::Directory) { auto const dir = ox::sfmt("{}{}/", path, name); - oxReturnError(preloadDir(manifest, ts, romFs, pl, dir)); + OX_RETURN_ERROR(preloadDir(manifest, ts, romFs, pl, dir)); } else { auto const err = preloadObj(ts, romFs, pl, filePath); if (err) { @@ -177,14 +177,14 @@ ox::Error appendBinary(ox::Buffer &binBuff, ox::SpanView const&fsBuff, ox: static_assert(mediaHdr.bytes() == hdrSize); static_assert(preloadHdr.bytes() == hdrSize); ox::BufferWriter w(&binBuff); - oxReturnError(padbin(w, hdrSize)); - oxReturnError(w.write(mediaHdr.data(), mediaHdr.bytes())); - oxReturnError(w.write(fsBuff.data(), fsBuff.size())); - oxReturnError(padbin(w, hdrSize)); - oxReturnError(w.write(preloadHdr.data(), preloadHdr.bytes())); - oxReturnError(pl.offsetPtrs(binBuff.size())); + OX_RETURN_ERROR(padbin(w, hdrSize)); + OX_RETURN_ERROR(w.write(mediaHdr.data(), mediaHdr.bytes())); + OX_RETURN_ERROR(w.write(fsBuff.data(), fsBuff.size())); + OX_RETURN_ERROR(padbin(w, hdrSize)); + OX_RETURN_ERROR(w.write(preloadHdr.data(), preloadHdr.bytes())); + OX_RETURN_ERROR(pl.offsetPtrs(binBuff.size())); auto const&plBuff = pl.buff(); - oxReturnError(w.write(plBuff.data(), plBuff.size())); + OX_RETURN_ERROR(w.write(plBuff.data(), plBuff.size())); return {}; } diff --git a/src/olympic/keel/include/keel/typeconv.hpp b/src/olympic/keel/include/keel/typeconv.hpp index 5d72f35..d4dde27 100644 --- a/src/olympic/keel/include/keel/typeconv.hpp +++ b/src/olympic/keel/include/keel/typeconv.hpp @@ -110,15 +110,15 @@ class Converter: public BaseConverter { ox::Result> convertPtrToPtr( keel::Context &ctx, Wrap &src) const noexcept final { auto dst = makeWrap(); - oxReturnError(convert(ctx, wrapCast(src), wrapCast(*dst))); + OX_RETURN_ERROR(convert(ctx, wrapCast(src), wrapCast(*dst))); return {std::move(dst)}; } ox::Result> convertBuffToPtr( keel::Context &ctx, ox::BufferView const&srcBuff) const noexcept final { - oxRequireM(src, readAsset(srcBuff)); + OX_REQUIRE_M(src, readAsset(srcBuff)); auto dst = makeWrap(); - oxReturnError(convert(ctx, src, wrapCast(*dst))); + OX_RETURN_ERROR(convert(ctx, src, wrapCast(*dst))); return {std::move(dst)}; } @@ -137,7 +137,7 @@ template ox::Result convert(keel::Context &ctx, ox::BufferView const&srcBuffer) noexcept { static constexpr auto DstTypeName = ox::requireModelTypeName(); static constexpr auto DstTypeVersion = ox::requireModelTypeVersion(); - oxRequire(out, convert(ctx, srcBuffer, DstTypeName, DstTypeVersion)); + OX_REQUIRE(out, convert(ctx, srcBuffer, DstTypeName, DstTypeVersion)); return std::move(wrapCast(out)); } @@ -145,7 +145,7 @@ template ox::Error convert(keel::Context &ctx, ox::BufferView const&buff, DstType *outObj) noexcept { static constexpr auto DstTypeName = ox::requireModelTypeName(); static constexpr auto DstTypeVersion = ox::requireModelTypeVersion(); - oxRequire(outPtr, convert(ctx, buff, DstTypeName, DstTypeVersion)); + OX_REQUIRE(outPtr, convert(ctx, buff, DstTypeName, DstTypeVersion)); *outObj = std::move(wrapCast(*outPtr)); return {}; } @@ -155,14 +155,14 @@ ox::Result convertBuffToBuff( keel::Context &ctx, ox::BufferView const&srcBuffer, ox::ClawFormat fmt) noexcept { static constexpr auto DstTypeName = ox::requireModelTypeName(); static constexpr auto DstTypeVersion = ox::requireModelTypeVersion(); - oxRequire(out, convert(ctx, srcBuffer, DstTypeName, DstTypeVersion)); + OX_REQUIRE(out, convert(ctx, srcBuffer, DstTypeName, DstTypeVersion)); return ox::writeClaw(wrapCast(*out), fmt); } template ox::Result transformRule(keel::Context &ctx, ox::Buffer &buff, ox::StringView typeId) noexcept { if (typeId == ox::ModelTypeId_v) { - oxReturnError(keel::convertBuffToBuff(ctx, buff, fmt).moveTo(buff)); + OX_RETURN_ERROR(keel::convertBuffToBuff(ctx, buff, fmt).moveTo(buff)); return true; } return false; diff --git a/src/olympic/keel/include/keel/validation.hpp b/src/olympic/keel/include/keel/validation.hpp index 7f86b0f..71f2a59 100644 --- a/src/olympic/keel/include/keel/validation.hpp +++ b/src/olympic/keel/include/keel/validation.hpp @@ -14,7 +14,7 @@ constexpr bool valid(auto const&) noexcept { } constexpr ox::Error repair(auto const&) noexcept { - return OxError(1, "No repair function for this type"); + return ox::Error(1, "No repair function for this type"); } constexpr ox::Error ensureValid(auto &o) noexcept { diff --git a/src/olympic/keel/src/asset.cpp b/src/olympic/keel/src/asset.cpp index 9817491..b24ab97 100644 --- a/src/olympic/keel/src/asset.cpp +++ b/src/olympic/keel/src/asset.cpp @@ -8,11 +8,11 @@ namespace keel { ox::Result readUuidHeader(ox::BufferView buff) noexcept { if (buff.size() < K1HdrSz) [[unlikely]] { - return OxError(1, "Insufficient data to contain complete Keel header"); + return ox::Error(1, "Insufficient data to contain complete Keel header"); } constexpr ox::StringView k1Hdr = "K1;"; if (k1Hdr != ox::StringView(buff.data(), k1Hdr.bytes())) [[unlikely]] { - return OxError(2, "No Keel asset header data"); + return ox::Error(2, "No Keel asset header data"); } return ox::UUID::fromString(ox::StringView(&buff[k1Hdr.bytes()], 36)); } @@ -30,7 +30,7 @@ ox::Result readAssetTypeId(ox::BufferView buff) noexcept { const auto err = readUuidHeader(buff).error; const auto offset = err ? 0u : K1HdrSz; if (offset >= buff.size()) [[unlikely]] { - return OxError(1, "Buffer too small for expected data"); + return ox::Error(1, "Buffer too small for expected data"); } return ox::readClawTypeId(buff + offset); } @@ -40,10 +40,10 @@ ox::Result readAssetHeader(ox::BufferView buff) noexcept { const auto err = readUuidHeader(buff).moveTo(out.value.uuid); const auto offset = err ? 0u : K1HdrSz; if (offset >= buff.size()) [[unlikely]] { - return OxError(1, "Buffer too small for expected data"); + return ox::Error(1, "Buffer too small for expected data"); } buff += offset; - oxReturnError(ox::readClawHeader(buff).moveTo(out.value.clawHdr)); + OX_RETURN_ERROR(ox::readClawHeader(buff).moveTo(out.value.clawHdr)); return out; } diff --git a/src/olympic/keel/src/keel.cpp b/src/olympic/keel/src/keel.cpp index 39f78e9..dbaf50a 100644 --- a/src/olympic/keel/src/keel.cpp +++ b/src/olympic/keel/src/keel.cpp @@ -30,7 +30,7 @@ ox::Error init( ox::Result> init(ox::UPtr &&fs, ox::StringViewCR appName) noexcept { auto ctx = ox::make_unique(); - oxReturnError(keel::init(*ctx, std::move(fs), appName)); + OX_RETURN_ERROR(keel::init(*ctx, std::move(fs), appName)); return ctx; } diff --git a/src/olympic/keel/src/media.cpp b/src/olympic/keel/src/media.cpp index 857e9a5..fdbb011 100644 --- a/src/olympic/keel/src/media.cpp +++ b/src/olympic/keel/src/media.cpp @@ -16,7 +16,7 @@ ox::Result loadRom(ox::StringViewCR path) noexcept { std::ifstream file(std::string(toStdStringView(path)), std::ios::binary | std::ios::ate); if (!file.good()) { oxErrorf("Could not find ROM file: {}", path); - return OxError(1, "Could not find ROM file"); + return ox::Error(1, "Could not find ROM file"); } try { auto const size = file.tellg(); @@ -26,10 +26,10 @@ ox::Result loadRom(ox::StringViewCR path) noexcept { return buff; } catch (std::ios_base::failure const&e) { oxErrorf("Could not read ROM file due to file IO failure: {}", e.what()); - return OxError(2, "Could not read ROM file"); + return ox::Error(2, "Could not read ROM file"); } catch (std::bad_alloc const&e) { oxErrorf("Could not read ROM file due to new failure: {}", e.what()); - return OxError(2, "Could not allocate memory for ROM file"); + return ox::Error(2, "Could not allocate memory for ROM file"); } } @@ -42,25 +42,25 @@ static void clearUuidMap(Context &ctx) noexcept { ctx.pathToUuid.clear(); } -void createUuidMapping(Context &ctx, ox::StringView filePath, ox::UUID const&uuid) noexcept { +void createUuidMapping(Context &ctx, ox::StringViewCR filePath, ox::UUID const&uuid) noexcept { ctx.pathToUuid[filePath] = uuid; ctx.uuidToPath[uuid.toString()] = filePath; } static ox::Error buildUuidMap(Context &ctx, ox::StringViewCR path) noexcept { - oxRequire(files, ctx.rom->ls(path)); + OX_REQUIRE(files, ctx.rom->ls(path)); for (auto const&f : files) { - oxRequireM(filePath, ox::join("/", ox::Array{path, f})); - oxRequire(stat, ctx.rom->stat(filePath)); + OX_REQUIRE_M(filePath, ox::join("/", ox::Array{path, f})); + OX_REQUIRE(stat, ctx.rom->stat(filePath)); if (stat.fileType == ox::FileType::NormalFile) { - oxRequire(data, ctx.rom->read(filePath)); + OX_REQUIRE(data, ctx.rom->read(filePath)); auto const [hdr, err] = readAssetHeader(data); if (!err) { createUuidMapping(ctx, filePath, hdr.uuid); } } else if (stat.fileType == ox::FileType::Directory) { if (!beginsWith(f, ".")) { - oxReturnError(buildUuidMap(ctx, filePath)); + OX_RETURN_ERROR(buildUuidMap(ctx, filePath)); } } } @@ -69,26 +69,26 @@ static ox::Error buildUuidMap(Context &ctx, ox::StringViewCR path) noexcept { ox::Error buildUuidMap(Context &ctx) noexcept { if (!ctx.rom) { - return OxError(1, "No ROM FS"); + return ox::Error(1, "No ROM FS"); } return buildUuidMap(ctx, ""); } ox::Result pathToUuid(Context &ctx, ox::StringViewCR path) noexcept { #ifndef OX_BARE_METAL - oxRequire(out, ctx.pathToUuid.at(path)); + OX_REQUIRE(out, ctx.pathToUuid.at(path)); return *out; #else - return OxError(1, "UUID to path conversion not supported on this platform"); + return ox::Error(1, "UUID to path conversion not supported on this platform"); #endif } ox::Result getUuid(Context &ctx, ox::FileAddress const&fileAddr) noexcept { - oxRequire(path, fileAddr.getPath()); + OX_REQUIRE(path, fileAddr.getPath()); return getUuid(ctx, path); } -ox::Result getUuid(Context &ctx, ox::StringView path) noexcept { +ox::Result getUuid(Context &ctx, ox::StringViewCR path) noexcept { if (beginsWith(path, "uuid://")) { auto const uuid = substr(path, 7); return ox::UUID::fromString(uuid); @@ -98,75 +98,73 @@ ox::Result getUuid(Context &ctx, ox::StringView path) noexcept { } ox::Result getPath(Context &ctx, ox::FileAddress const&fileAddr) noexcept { - oxRequire(path, fileAddr.getPath()); + OX_REQUIRE(path, fileAddr.getPath()); if (beginsWith(path, "uuid://")) { auto const uuid = substr(path, 7); #ifndef OX_BARE_METAL - oxRequireM(out, ctx.uuidToPath.at(uuid)); + OX_REQUIRE_M(out, ctx.uuidToPath.at(uuid)); return ox::CStringView{*out}; #else - return OxError(1, "UUID to path conversion not supported on this platform"); + return ox::Error(1, "UUID to path conversion not supported on this platform"); #endif } else { return ox::CStringView{path}; } } -ox::Result getPath(Context &ctx, ox::CStringView fileId) noexcept { +ox::Result getPath(Context &ctx, ox::CStringViewCR fileId) noexcept { if (beginsWith(fileId, "uuid://")) { auto const uuid = substr(fileId, 7); #ifndef OX_BARE_METAL - oxRequireM(out, ctx.uuidToPath.at(uuid)); + OX_REQUIRE_M(out, ctx.uuidToPath.at(uuid)); return ox::CStringView{*out}; #else - return OxError(1, "UUID to path conversion not supported on this platform"); + return ox::Error(1, "UUID to path conversion not supported on this platform"); #endif } else { return ox::CStringView{fileId}; } } -ox::Result uuidUrlToPath(Context &ctx, ox::StringView uuid) noexcept { - uuid = substr(uuid, 7); +ox::Result uuidUrlToPath(Context &ctx, ox::StringViewCR uuid) noexcept { #ifndef OX_BARE_METAL - oxRequireM(out, ctx.uuidToPath.at(uuid)); + OX_REQUIRE_M(out, ctx.uuidToPath.at(substr(uuid, 7))); return ox::CStringView(*out); #else - return OxError(1, "UUID to path conversion not supported on this platform"); + return ox::Error(1, "UUID to path conversion not supported on this platform"); #endif } ox::Result uuidToPath(Context &ctx, ox::StringViewCR uuid) noexcept { #ifndef OX_BARE_METAL - oxRequireM(out, ctx.uuidToPath.at(uuid)); + OX_REQUIRE_M(out, ctx.uuidToPath.at(uuid)); return ox::CStringView(*out); #else - return OxError(1, "UUID to path conversion not supported on this platform"); + return ox::Error(1, "UUID to path conversion not supported on this platform"); #endif } ox::Result uuidToPath(Context &ctx, ox::UUID const&uuid) noexcept { #ifndef OX_BARE_METAL - oxRequireM(out, ctx.uuidToPath.at(uuid.toString())); + OX_REQUIRE_M(out, ctx.uuidToPath.at(uuid.toString())); return ox::CStringView(*out); #else - return OxError(1, "UUID to path conversion not supported on this platform"); + return ox::Error(1, "UUID to path conversion not supported on this platform"); #endif } -ox::Error reloadAsset(keel::Context &ctx, ox::StringView assetId) noexcept { +ox::Error reloadAsset(keel::Context &ctx, ox::StringViewCR assetId) noexcept { ox::UUIDStr uuidStr; if (beginsWith(assetId, "uuid://")) { - assetId = substr(assetId, 7); - oxRequire(p, keel::uuidToPath(ctx, assetId)); + return ctx.assetManager.reloadAsset(substr(assetId, 7)); } else { auto const [uuid, uuidErr] = getUuid(ctx, assetId); if (!uuidErr) { - uuidStr = uuid.toString(); - assetId = uuidStr; + return ctx.assetManager.reloadAsset(uuidStr); + } else { + return ctx.assetManager.reloadAsset(assetId); } } - return ctx.assetManager.reloadAsset(assetId); } } @@ -200,30 +198,30 @@ ox::Result loadRom(ox::StringViewCR) noexcept { return current + headerLen; } } - return OxError(1); + return ox::Error(1); } void unloadRom(char*) noexcept { } ox::Result getPreloadAddr(keel::Context &ctx, ox::StringViewCR path) noexcept { - oxRequire(stat, ctx.rom->stat(path)); - oxRequire(buff, static_cast(*ctx.rom).directAccess(path)); + OX_REQUIRE(stat, ctx.rom->stat(path)); + OX_REQUIRE(buff, static_cast(*ctx.rom).directAccess(path)); PreloadPtr p; - oxReturnError(ox::readMC({buff, static_cast(stat.size)}, p)); + OX_RETURN_ERROR(ox::readMC({buff, static_cast(stat.size)}, p)); return static_cast(p.preloadAddr) + ctx.preloadSectionOffset; } ox::Result getPreloadAddr(keel::Context &ctx, ox::FileAddress const&addr) noexcept { - oxRequire(stat, ctx.rom->stat(addr)); - oxRequire(buff, static_cast(*ctx.rom).directAccess(addr)); + OX_REQUIRE(stat, ctx.rom->stat(addr)); + OX_REQUIRE(buff, static_cast(*ctx.rom).directAccess(addr)); PreloadPtr p; - oxReturnError(ox::readMC({buff, static_cast(stat.size)}, p)); + OX_RETURN_ERROR(ox::readMC({buff, static_cast(stat.size)}, p)); return static_cast(p.preloadAddr) + ctx.preloadSectionOffset; } ox::Error reloadAsset(keel::Context&, ox::StringView) noexcept { - return OxError(1, "reloadAsset is unsupported on this platform"); + return ox::Error(1, "reloadAsset is unsupported on this platform"); } } @@ -238,16 +236,16 @@ ox::Error setRomFs(Context &ctx, ox::UPtr &&fs) noexcept { return buildUuidMap(ctx); } -ox::Result> loadRomFs(ox::StringViewCR path) noexcept { +ox::Result> loadRomFs(ox::StringViewCR path) noexcept { auto const lastDot = ox::lastIndexOf(path, '.'); if (!lastDot.error && substr(path, lastDot.value) == ".oxfs") { - oxRequire(rom, loadRom(path)); + OX_REQUIRE(rom, loadRom(path)); return {ox::make_unique(rom, 32 * ox::units::MB, unloadRom)}; } else { #ifdef OX_HAS_PASSTHROUGHFS return {ox::make_unique(path)}; #else - return OxError(2); + return ox::Error(2); #endif } } diff --git a/src/olympic/keel/src/pack-applib.cpp b/src/olympic/keel/src/pack-applib.cpp index 3f480f0..b57b119 100644 --- a/src/olympic/keel/src/pack-applib.cpp +++ b/src/olympic/keel/src/pack-applib.cpp @@ -17,7 +17,7 @@ static ox::Error writeFileBuff(ox::StringView path, ox::BufferView const buff) n std::ofstream f(std::string(toStdStringView(path)), std::ios::binary); f.write(buff.data(), static_cast(buff.size())); } catch (std::fstream::failure const&) { - return OxError(2, "failed to write file"); + return ox::Error(2, "failed to write file"); } return {}; } @@ -26,7 +26,7 @@ static ox::Result readFileBuff(ox::StringView path) noexcept { std::ifstream file(std::string(toStdStringView(path)), std::ios::binary | std::ios::ate); if (!file.good()) { oxErrorf("Could not find OxFS file: {}", path); - return OxError(1, "Could not find OxFS file"); + return ox::Error(1, "Could not find OxFS file"); } try { auto const size = static_cast(file.tellg()); @@ -36,14 +36,14 @@ static ox::Result readFileBuff(ox::StringView path) noexcept { return buff; } catch (std::ios_base::failure const&e) { oxErrorf("Could not read OxFS file: {}", e.what()); - return OxError(2, "Could not read OxFS file"); + return ox::Error(2, "Could not read OxFS file"); } } static ox::Error generateTypes(ox::TypeStore &ts) noexcept { for (auto const mod : keel::modules()) { for (auto gen : mod->types()) { - oxReturnError(gen(ts)); + OX_RETURN_ERROR(gen(ts)); } } return {}; @@ -55,56 +55,48 @@ static ox::Error pack( ox::StringView argManifest, ox::StringView projectDataDir) noexcept { ox::Buffer dstBuff(32 * ox::units::MB); - oxReturnError(ox::FileSystem32::format(dstBuff.data(), dstBuff.size())); + OX_RETURN_ERROR(ox::FileSystem32::format(dstBuff.data(), dstBuff.size())); ox::FileSystem32 dst(dstBuff); - oxRequire(ctx, keel::init(ox::make_unique(argSrc), "keel-pack")); + OX_REQUIRE(ctx, keel::init(ox::make_unique(argSrc), "keel-pack")); keel::TypeStore ts(*ctx->rom, ox::sfmt("{}/type_descriptors", projectDataDir)); - oxReturnError(generateTypes(ts)); + OX_RETURN_ERROR(generateTypes(ts)); keel::Manifest manifest; - oxReturnError(keel::pack(manifest, *ctx, ts, dst)); - oxRequireM(pl, keel::GbaPreloader::make()); - oxReturnError(preload(manifest, ts, dst, *pl)); - oxReturnError(dst.resize()); + OX_RETURN_ERROR(keel::pack(manifest, *ctx, ts, dst)); + OX_REQUIRE_M(pl, keel::GbaPreloader::make()); + OX_RETURN_ERROR(preload(manifest, ts, dst, *pl)); + OX_RETURN_ERROR(dst.resize()); // resize buffer - oxRequire(dstSize, dst.size()); + OX_REQUIRE(dstSize, dst.size()); dstBuff.resize(dstSize); // concatenate ROM segments - oxRequireM(romBuff, readFileBuff(argRomBin)); + OX_REQUIRE_M(romBuff, readFileBuff(argRomBin)); oxOutf("Input exe size: {} bytes\n", romBuff.size()); oxOutf("Dest FS size: {} bytes\n", dstSize); oxOutf("Preload buff size: {} bytes\n", pl->buff().size()); - oxReturnError(appendBinary(romBuff, dstBuff, *pl)); + OX_RETURN_ERROR(appendBinary(romBuff, dstBuff, *pl)); oxOutf("Final ROM buff size: {} bytes\n", romBuff.size()); - oxReturnError(writeFileBuff(argRomBin, romBuff)); - oxRequire(manifestJson, ox::writeOCString(manifest)); - oxReturnError(writeFileBuff(argManifest, {manifestJson.data(), manifestJson.len()})); + OX_RETURN_ERROR(writeFileBuff(argRomBin, romBuff)); + OX_REQUIRE(manifestJson, ox::writeOCString(manifest)); + OX_RETURN_ERROR(writeFileBuff(argManifest, {manifestJson.data(), manifestJson.len()})); return {}; } -static ox::Error run(ox::SpanView argv, ox::StringView projectDataDir) noexcept { +ox::Error run( + [[maybe_unused]] ox::StringView project, + [[maybe_unused]] ox::StringView appName, + ox::StringView projectDataDir, + ox::SpanView argv) noexcept { ox::ClArgs const args(argv); auto const argSrc = args.getString("src", ""); auto const argRomBin = args.getString("rom-bin", ""); auto const argManifest = args.getString("manifest", ""); if (argSrc == "") { oxErr("\033[31;1;1merror:\033[0m must specify a source directory\n"); - return OxError(1, "must specify a source directory"); + return ox::Error(1, "must specify a source directory"); } if (argRomBin == "") { oxErr("\033[31;1;1merror:\033[0m must specify a path for ROM file\n"); - return OxError(1, "must specify a path for preload file"); + return ox::Error(1, "must specify a path for preload file"); } return pack(argSrc, argRomBin, argManifest, projectDataDir); } - -namespace olympic { - -ox::Error run( - [[maybe_unused]] ox::StringView project, - [[maybe_unused]] ox::StringView appName, - ox::StringView projectDataDir, - ox::SpanView argv) noexcept { - return ::run(argv, projectDataDir); -} - -} diff --git a/src/olympic/keel/src/pack.cpp b/src/olympic/keel/src/pack.cpp index 3810f16..8714416 100644 --- a/src/olympic/keel/src/pack.cpp +++ b/src/olympic/keel/src/pack.cpp @@ -15,19 +15,19 @@ static ox::Error pathToInode( ox::FileSystem &dest, ox::ModelObject &obj) noexcept { auto &o = obj; - oxRequire(typeVal, o.at("type")); + OX_REQUIRE(typeVal, o.at("type")); auto const type = static_cast(typeVal->get()); - oxRequire(dataVal, o.at("data")); + OX_REQUIRE(dataVal, o.at("data")); auto &data = dataVal->get(); ox::String path; switch (type) { case ox::FileAddressType::Path: { - oxRequire(pathVal, data.at("path")); + OX_REQUIRE(pathVal, data.at("path")); path = pathVal->get(); break; } case ox::FileAddressType::ConstPath: { - oxRequire(pathVal, data.at("constPath")); + OX_REQUIRE(pathVal, data.at("constPath")); path = pathVal->get(); break; } @@ -37,10 +37,10 @@ static ox::Error pathToInode( } if (beginsWith(path, "uuid://")) { auto const uuid = ox::substr(path, 7); - oxReturnError(keel::uuidToPath(ctx, uuid).to().moveTo(path)); + OX_RETURN_ERROR(keel::uuidToPath(ctx, uuid).to().moveTo(path)); } - oxRequire(s, dest.stat(path)); - oxReturnError(typeVal->set(static_cast(ox::FileAddressType::Inode))); + OX_REQUIRE(s, dest.stat(path)); + OX_RETURN_ERROR(typeVal->set(static_cast(ox::FileAddressType::Inode))); oxOutf("\tpath to inode: {} => {}\n", path, s.inode); return data.set(2, s.inode); } @@ -69,7 +69,7 @@ static ox::Error transformFileAddressesVec( ox::FileSystem &dest, ox::ModelValueVector &v) noexcept { for (auto &f : v) { - oxReturnError(transformFileAddresses(ctx, dest, f)); + OX_RETURN_ERROR(transformFileAddresses(ctx, dest, f)); } return {}; } @@ -87,7 +87,7 @@ static ox::Error transformFileAddressesObj( } for (auto &f : obj) { auto &v = f->value; - oxReturnError(transformFileAddresses(ctx, dest, v)); + OX_RETURN_ERROR(transformFileAddresses(ctx, dest, v)); } return {}; } @@ -96,12 +96,12 @@ static ox::Error performPackTransforms( ManifestEntry &entry, Context &ctx, ox::Buffer &clawData) noexcept { - oxRequireM(typeId, readAssetTypeId(clawData)); + OX_REQUIRE_M(typeId, readAssetTypeId(clawData)); for (auto const tr : packTransforms(ctx)) { bool changed{}; - oxReturnError(tr(ctx, clawData, typeId).moveTo(changed)); + OX_RETURN_ERROR(tr(ctx, clawData, typeId).moveTo(changed)); if (changed) { - oxReturnError(readAssetTypeId(clawData).moveTo(typeId)); + OX_RETURN_ERROR(readAssetTypeId(clawData).moveTo(typeId)); } } entry.type = ox::String{typeId}; @@ -115,17 +115,17 @@ static ox::Error doTransformations( ox::FileSystem &dest, ox::StringViewCR filePath) noexcept { // load file - oxRequire(s, dest.stat(filePath)); + OX_REQUIRE(s, dest.stat(filePath)); // do transformations - oxRequireM(buff, dest.read(s.inode)); - oxReturnError(keel::performPackTransforms(manifest.files[filePath], ctx, buff)); + OX_REQUIRE_M(buff, dest.read(s.inode)); + OX_RETURN_ERROR(keel::performPackTransforms(manifest.files[filePath], ctx, buff)); // transform FileAddresses - oxRequireM(obj, keel::readAsset(ts, buff)); + OX_REQUIRE_M(obj, keel::readAsset(ts, buff)); oxOutf("transforming {}\n", filePath); - oxReturnError(transformFileAddressesObj(ctx, dest, obj)); - oxReturnError(ox::writeClaw(obj).moveTo(buff)); + OX_RETURN_ERROR(transformFileAddressesObj(ctx, dest, obj)); + OX_RETURN_ERROR(ox::writeClaw(obj).moveTo(buff)); // write file to dest - oxReturnError(dest.write(s.inode, buff)); + OX_RETURN_ERROR(dest.write(s.inode, buff)); return {}; } @@ -139,13 +139,13 @@ static ox::Error transformClaw( ox::StringViewCR path) noexcept { // copy oxTracef("pack.transformClaw", "path: {}", path); - oxRequire(fileList, dest.ls(path)); + OX_REQUIRE(fileList, dest.ls(path)); for (auto const&name : fileList) { auto const filePath = ox::sfmt("{}{}", path, name); - oxRequire(stat, dest.stat(filePath)); + OX_REQUIRE(stat, dest.stat(filePath)); if (stat.fileType == ox::FileType::Directory) { auto const dir = ox::sfmt("{}{}/", path, name); - oxReturnError(transformClaw(manifest, ctx, ts, dest, dir)); + OX_RETURN_ERROR(transformClaw(manifest, ctx, ts, dest, dir)); } else { auto const err = doTransformations(manifest, ctx, ts, dest, filePath); if (err) { @@ -166,28 +166,28 @@ static ox::Error copy( oxOutf("{}copying directory: {}\n", logPrefix, path); auto const childLogPrefix = ox::sfmt("{}\t", logPrefix); // copy - oxRequire(fileList, src.ls(path)); + OX_REQUIRE(fileList, src.ls(path)); for (auto const&name : fileList) { auto const currentFile = ox::sfmt("{}{}", path, name); if (beginsWith(name, ".")) { continue; } - oxRequire(srcStat, src.stat(currentFile)); + OX_REQUIRE(srcStat, src.stat(currentFile)); if (srcStat.fileType == ox::FileType::Directory) { - oxReturnError(dest.mkdir(currentFile, true)); - oxReturnError(copy(manifest, src, dest, currentFile + '/', childLogPrefix)); + OX_RETURN_ERROR(dest.mkdir(currentFile, true)); + OX_RETURN_ERROR(copy(manifest, src, dest, currentFile + '/', childLogPrefix)); } else { // load file oxOutf("{}copying file: {}...", childLogPrefix, currentFile); ox::StringView status = "failed"; - oxDefer [&status] { + OX_DEFER [&status] { oxOutf(" {}\n", status); }; - oxRequireM(buff, src.read(currentFile)); + OX_REQUIRE_M(buff, src.read(currentFile)); // write file to dest - oxReturnError(dest.write(currentFile, buff)); + OX_RETURN_ERROR(dest.write(currentFile, buff)); status = "OK"; - oxRequire(dstStat, dest.stat(currentFile)); + OX_REQUIRE(dstStat, dest.stat(currentFile)); manifest.files[currentFile] = { .inode = dstStat.inode, .type = ox::String{keel::readAssetTypeId(buff).or_value({})}, @@ -202,9 +202,9 @@ ox::Error pack( keel::Context &ctx, ox::TypeStore &ts, ox::FileSystem &dest) noexcept { - oxReturnError(copy(manifest, *ctx.rom, dest, "/")); + OX_RETURN_ERROR(copy(manifest, *ctx.rom, dest, "/")); oxOut("Doing transforms\n"); - oxReturnError(transformClaw(manifest, ctx, ts, dest, "/")); + OX_RETURN_ERROR(transformClaw(manifest, ctx, ts, dest, "/")); return {}; } diff --git a/src/olympic/keel/src/typeconv.cpp b/src/olympic/keel/src/typeconv.cpp index c09bf89..cd6ff7f 100644 --- a/src/olympic/keel/src/typeconv.cpp +++ b/src/olympic/keel/src/typeconv.cpp @@ -18,7 +18,7 @@ static ox::Result findConverter( return c; } } - return OxError(1, "Could not find converter"); + return ox::Error(1, "Could not find converter"); }; static ox::Result> convert( @@ -47,7 +47,7 @@ static ox::Result> convert( return subConverter->convertPtrToPtr(ctx, *intermediate); } } - return OxError(1, "Could not convert between types"); + return ox::Error(1, "Could not convert between types"); } ox::Result> convert( @@ -55,7 +55,7 @@ ox::Result> convert( ox::BufferView const&srcBuffer, ox::StringViewCR dstTypeName, int dstTypeVersion) noexcept { - oxRequire(hdr, readAssetHeader(srcBuffer)); + OX_REQUIRE(hdr, readAssetHeader(srcBuffer)); return convert( ctx, converters(ctx), diff --git a/src/olympic/keel/src/typestore.cpp b/src/olympic/keel/src/typestore.cpp index b5a79c7..f171400 100644 --- a/src/olympic/keel/src/typestore.cpp +++ b/src/olympic/keel/src/typestore.cpp @@ -13,9 +13,9 @@ TypeStore::TypeStore(ox::FileSystem &fs, ox::StringView descPath) noexcept: ox::Result> TypeStore::loadDescriptor(ox::StringView const typeId) noexcept { auto const path = ox::sfmt("{}/{}", m_descPath, typeId); - oxRequire(buff, m_fs.read(path)); + OX_REQUIRE(buff, m_fs.read(path)); auto dt = ox::make_unique(); - oxReturnError(ox::readClaw(buff, *dt)); + OX_RETURN_ERROR(ox::readClaw(buff, *dt)); return dt; } diff --git a/src/olympic/keel/test/tests.cpp b/src/olympic/keel/test/tests.cpp index f6768a3..c3ee316 100644 --- a/src/olympic/keel/test/tests.cpp +++ b/src/olympic/keel/test/tests.cpp @@ -15,10 +15,10 @@ static std::map tests = { []() -> ox::Error { constexpr ox::StringView uuidStr = "8d814442-f46e-4cc3-8edc-ca3c01cc86db"; constexpr ox::StringView hdr = "K1;8d814442-f46e-4cc3-8edc-ca3c01cc86db;"; - oxRequire(uuid, ox::UUID::fromString(uuidStr)); + OX_REQUIRE(uuid, ox::UUID::fromString(uuidStr)); ox::Array buff; ox::CharBuffWriter bw(buff); - oxReturnError(keel::writeUuidHeader(bw, uuid)); + OX_RETURN_ERROR(keel::writeUuidHeader(bw, uuid)); oxExpect(ox::StringView(buff.data(), buff.size()), hdr); return {}; } diff --git a/src/olympic/studio/applib/src/CMakeLists.txt b/src/olympic/studio/applib/src/CMakeLists.txt index 2dfce8d..52788ec 100644 --- a/src/olympic/studio/applib/src/CMakeLists.txt +++ b/src/olympic/studio/applib/src/CMakeLists.txt @@ -12,6 +12,7 @@ add_library( ) target_compile_definitions( StudioAppLib PUBLIC + OLYMPIC_GUI_APP=1 OLYMPIC_LOAD_STUDIO_MODULES=1 OLYMPIC_APP_NAME="Studio" ) diff --git a/src/olympic/studio/applib/src/main.cpp b/src/olympic/studio/applib/src/main.cpp index b257450..6b229ce 100644 --- a/src/olympic/studio/applib/src/main.cpp +++ b/src/olympic/studio/applib/src/main.cpp @@ -37,7 +37,7 @@ static ox::Error runApp( ox::StringViewCR appName, ox::StringViewCR projectDataDir, ox::UPtr &&fs) noexcept { - oxRequireM(ctx, turbine::init(std::move(fs), appName)); + OX_REQUIRE_M(ctx, turbine::init(std::move(fs), appName)); turbine::setWindowTitle(*ctx, keelCtx(*ctx).appName); turbine::setKeyEventHandler(*ctx, keyEventHandler); turbine::setRefreshWithin(*ctx, 0); @@ -67,14 +67,10 @@ static ox::Error run( } -namespace olympic { - ox::Error run( ox::StringView project, ox::StringView appName, ox::StringView projectDataDir, - ox::SpanView args) noexcept { + ox::SpanView args) noexcept { return studio::run(ox::sfmt("{} {}", project, appName), projectDataDir, args); } - -} diff --git a/src/olympic/studio/applib/src/newmenu.cpp b/src/olympic/studio/applib/src/newmenu.cpp index 2b297f6..e8e8c53 100644 --- a/src/olympic/studio/applib/src/newmenu.cpp +++ b/src/olympic/studio/applib/src/newmenu.cpp @@ -118,12 +118,12 @@ void NewMenu::drawLastPageButtons(studio::StudioContext &sctx) noexcept { void NewMenu::finish(studio::StudioContext &sctx) noexcept { if (m_itemName.len() == 0) { - oxLogError(OxError(1, "New file error: no file name")); + oxLogError(ox::Error(1, "New file error: no file name")); return; } auto const&typeMaker = *m_types[static_cast(m_selectedType)]; if (sctx.project->exists(typeMaker.itemPath(m_itemName))) { - oxLogError(OxError(1, "New file error: file already exists")); + oxLogError(ox::Error(1, "New file error: file already exists")); return; } auto const [path, err] = typeMaker.write(sctx, m_itemName); diff --git a/src/olympic/studio/applib/src/projectexplorer.cpp b/src/olympic/studio/applib/src/projectexplorer.cpp index 56b1d2b..76ed4dc 100644 --- a/src/olympic/studio/applib/src/projectexplorer.cpp +++ b/src/olympic/studio/applib/src/projectexplorer.cpp @@ -16,16 +16,16 @@ static ox::Result> buildProjectTreeModel( ox::StringView path, ProjectTreeModel *parent) noexcept { auto const fs = explorer.romFs(); - oxRequire(stat, fs->stat(path)); + OX_REQUIRE(stat, fs->stat(path)); auto out = ox::make_unique(explorer, ox::String(name), parent); if (stat.fileType == ox::FileType::Directory) { - oxRequireM(children, fs->ls(path)); + OX_REQUIRE_M(children, fs->ls(path)); std::sort(children.begin(), children.end()); ox::Vector> outChildren; for (auto const&childName : children) { if (childName[0] != '.') { auto const childPath = ox::sfmt("{}/{}", path, childName); - oxRequireM(child, buildProjectTreeModel(explorer, childName, childPath, out.get())); + OX_REQUIRE_M(child, buildProjectTreeModel(explorer, childName, childPath, out.get())); outChildren.emplace_back(std::move(child)); } } @@ -52,9 +52,9 @@ void ProjectExplorer::setModel(ox::UPtr &&model) noexcept { } ox::Error ProjectExplorer::refreshProjectTreeModel(ox::StringViewCR) noexcept { - oxRequireM(model, buildProjectTreeModel(*this, "Project", "/", nullptr)); + OX_REQUIRE_M(model, buildProjectTreeModel(*this, "Project", "/", nullptr)); setModel(std::move(model)); - return OxError(0); + return ox::Error(0); } } diff --git a/src/olympic/studio/applib/src/studioapp.cpp b/src/olympic/studio/applib/src/studioapp.cpp index 001d054..466518e 100644 --- a/src/olympic/studio/applib/src/studioapp.cpp +++ b/src/olympic/studio/applib/src/studioapp.cpp @@ -36,12 +36,12 @@ struct StudioConfig { bool showProjectExplorer = true; }; -oxModelBegin(StudioConfig) - oxModelFieldRename(activeTabItemName, active_tab_item_name) - oxModelFieldRename(projectPath, project_path) - oxModelFieldRename(openFiles, open_files) - oxModelFieldRename(showProjectExplorer, show_project_explorer) -oxModelEnd() +OX_MODEL_BEGIN(StudioConfig) + OX_MODEL_FIELD_RENAME(activeTabItemName, active_tab_item_name) + OX_MODEL_FIELD_RENAME(projectPath, project_path) + OX_MODEL_FIELD_RENAME(openFiles, open_files) + OX_MODEL_FIELD_RENAME(showProjectExplorer, show_project_explorer) +OX_MODEL_END() StudioUI::StudioUI(turbine::Context &ctx, ox::StringParam projectDataDir) noexcept: m_sctx(*this, ctx), @@ -222,7 +222,7 @@ void StudioUI::drawTabs() noexcept { m_activeEditor = nullptr; } try { - oxThrowError(m_editors.erase(it).moveTo(it)); + 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); } catch (std::exception const&ex) { @@ -323,15 +323,15 @@ void StudioUI::handleKeyInput() noexcept { ox::Error StudioUI::createOpenProject(ox::StringViewCR path) noexcept { std::error_code ec; std::filesystem::create_directories(toStdStringView(path), ec); - oxReturnError(OxError(ec.value() != 0, "Could not create project directory")); - oxReturnError(openProjectPath(path)); + OX_RETURN_ERROR(ox::Error(ec.value() != 0, "Could not create project directory")); + OX_RETURN_ERROR(openProjectPath(path)); return m_project->writeTypeStore(); } ox::Error StudioUI::openProjectPath(ox::StringParam path) noexcept { - oxRequireM(fs, keel::loadRomFs(path.view())); - oxReturnError(keel::setRomFs(keelCtx(m_ctx), std::move(fs))); - oxReturnError( + OX_REQUIRE_M(fs, keel::loadRomFs(path.view())); + OX_RETURN_ERROR(keel::setRomFs(keelCtx(m_ctx), std::move(fs))); + OX_RETURN_ERROR( ox::make_unique_catch(keelCtx(m_ctx), std::move(path), m_projectDataDir) .moveTo(m_project)); auto const sctx = applicationData(m_ctx); @@ -354,7 +354,7 @@ ox::Error StudioUI::openFile(ox::StringViewCR path) noexcept { ox::Error StudioUI::openFileActiveTab(ox::StringViewCR path, bool makeActiveTab) noexcept { if (!m_project) { - return OxError(1, "No project open to open a file from"); + return ox::Error(1, "No project open to open a file from"); } if (m_openFiles.contains(path)) { for (auto &e : m_editors) { @@ -366,7 +366,7 @@ ox::Error StudioUI::openFileActiveTab(ox::StringViewCR path, bool makeActiveTab) } return {}; } - oxRequire(ext, studio::fileExt(path)); + OX_REQUIRE(ext, studio::fileExt(path)); // create Editor BaseEditor *editor = nullptr; auto const err = m_editorMakers.contains(ext) ? diff --git a/src/olympic/studio/modlib/include/studio/configio.hpp b/src/olympic/studio/modlib/include/studio/configio.hpp index 711bbcb..edf4dd8 100644 --- a/src/olympic/studio/modlib/include/studio/configio.hpp +++ b/src/olympic/studio/modlib/include/studio/configio.hpp @@ -60,11 +60,11 @@ ox::Error writeConfig(keel::Context &ctx, ox::StringViewCR name, T const&data) n //oxErrf("Could not create config directory: {} - {}\n", path, toStr(err)); return err; } - oxRequireM(buff, ox::writeOC(data)); + OX_REQUIRE_M(buff, ox::writeOC(data)); *buff.back().value = '\n'; if (auto const err = fs.write(path, buff.data(), buff.size())) { //oxErrf("Could not read config file: {} - {}\n", path, toStr(err)); - return OxError(2, "Could not read config file"); + return ox::Error(2, "Could not read config file"); } return {}; } diff --git a/src/olympic/studio/modlib/include/studio/imguiutil.hpp b/src/olympic/studio/modlib/include/studio/imguiutil.hpp index 0577269..00f0ad9 100644 --- a/src/olympic/studio/modlib/include/studio/imguiutil.hpp +++ b/src/olympic/studio/modlib/include/studio/imguiutil.hpp @@ -24,18 +24,18 @@ constexpr ImTextureID toImTextureID(ox::Unsigned_c auto id) noexcept } template -ox::Result getDragDropPayload(ox::CStringView name) noexcept { +ox::Result getDragDropPayload(ox::CStringViewCR name) noexcept { auto const payload = ImGui::AcceptDragDropPayload(name.c_str()); if (!payload) { - return OxError(1, "No drag/drop payload"); + return ox::Error(1, "No drag/drop payload"); } return ox::readClaw({ reinterpret_cast(payload->Data), static_cast(payload->DataSize)}); } -ox::Error setDragDropPayload(ox::CStringView name, auto const&obj) noexcept { - oxRequire(buff, ox::writeClaw(obj, ox::ClawFormat::Metal)); +ox::Error setDragDropPayload(ox::CStringViewCR name, auto const&obj) noexcept { + OX_REQUIRE(buff, ox::writeClaw(obj, ox::ClawFormat::Metal)); ImGui::SetDragDropPayload(name.c_str(), buff.data(), buff.size()); return {}; } @@ -88,7 +88,7 @@ class DragDropTarget { } }; -inline auto dragDropTarget(auto const&cb) noexcept { +auto dragDropTarget(auto const&cb) noexcept { if constexpr(ox::is_same_v) { if (ig::DragDropTarget const tgt; tgt) [[unlikely]] { return cb(); @@ -104,7 +104,7 @@ inline auto dragDropTarget(auto const&cb) noexcept { class ChildStackItem { public: - explicit ChildStackItem(ox::CStringView id, ImVec2 const&sz = {}) noexcept; + explicit ChildStackItem(ox::CStringViewCR id, ImVec2 const&sz = {}) noexcept; ~ChildStackItem() noexcept; }; @@ -112,7 +112,7 @@ class IDStackItem { public: explicit IDStackItem(int id) noexcept; explicit IDStackItem(const char *id) noexcept; - explicit IDStackItem(ox::CStringView id) noexcept; + explicit IDStackItem(ox::CStringViewCR id) noexcept; ~IDStackItem() noexcept; }; @@ -126,7 +126,7 @@ class IndentStackItem { void centerNextWindow(turbine::Context &ctx) noexcept; -bool PushButton(ox::CStringView lbl, ImVec2 const&btnSz = BtnSz) noexcept; +bool PushButton(ox::CStringViewCR lbl, ImVec2 const&btnSz = BtnSz) noexcept; template struct TextInput { @@ -180,7 +180,7 @@ PopupResponse PopupControlsOkCancel(float popupWidth, bool &popupOpen); PopupResponse PopupControlsOkCancel(bool &popupOpen); [[nodiscard]] -bool BeginPopup(turbine::Context &ctx, ox::CStringView popupName, bool &show, ImVec2 const&sz = {285, 0}); +bool BeginPopup(turbine::Context &ctx, ox::CStringViewCR popupName, bool &show, ImVec2 const&sz = {285, 0}); /** * @@ -199,19 +199,19 @@ bool ComboBox(ox::CStringView lbl, ox::Span list, size_t &sele * @return true if new value selected, false otherwise */ bool ComboBox( - ox::CStringView lbl, + ox::CStringViewCR lbl, std::function const&f, size_t strCnt, size_t &selectedIdx) noexcept; bool FileComboBox( - ox::CStringView lbl, - studio::StudioContext &sctx, - ox::StringView fileExt, + ox::CStringViewCR lbl, + StudioContext &sctx, + ox::StringViewCR fileExt, size_t &selectedIdx) noexcept; bool ListBox( - ox::CStringView name, + ox::CStringViewCR name, std::function const&f, size_t strCnt, size_t &selIdx) noexcept; @@ -223,7 +223,7 @@ bool ListBox( * @param selIdx * @return true if new value selected, false otherwise */ -bool ListBox(ox::CStringView name, ox::Span const&list, size_t &selIdx) noexcept; +bool ListBox(ox::CStringViewCR name, ox::SpanView const&list, size_t &selIdx) noexcept; class FilePicker { private: @@ -237,8 +237,8 @@ class FilePicker { FilePicker( studio::StudioContext &sctx, - ox::String title, - ox::String fileExt, + ox::StringParam title, + ox::StringParam fileExt, ImVec2 const&size = {}) noexcept; void draw() noexcept; diff --git a/src/olympic/studio/modlib/include/studio/itemmaker.hpp b/src/olympic/studio/modlib/include/studio/itemmaker.hpp index d386bfb..e1647be 100644 --- a/src/olympic/studio/modlib/include/studio/itemmaker.hpp +++ b/src/olympic/studio/modlib/include/studio/itemmaker.hpp @@ -79,7 +79,7 @@ class ItemMakerT: public ItemMaker { ox::Result write(studio::StudioContext &sctx, ox::StringView const pName) const noexcept override { auto const path = itemPath(pName); createUuidMapping(keelCtx(sctx.tctx), path, ox::UUID::generate().unwrap()); - oxReturnError(sctx.project->writeObj(path, m_item, m_fmt)); + OX_RETURN_ERROR(sctx.project->writeObj(path, m_item, m_fmt)); return path; } }; diff --git a/src/olympic/studio/modlib/include/studio/project.hpp b/src/olympic/studio/modlib/include/studio/project.hpp index 203cf1d..f2f88fb 100644 --- a/src/olympic/studio/modlib/include/studio/project.hpp +++ b/src/olympic/studio/modlib/include/studio/project.hpp @@ -31,7 +31,7 @@ enum class ProjectEvent { constexpr ox::Result fileExt(ox::StringViewCR path) noexcept { auto const extStart = ox::find(path.crbegin(), path.crend(), '.').offset(); if (!extStart) { - return OxError(1, "file path does not have valid extension"); + return ox::Error(1, "file path does not have valid extension"); } return substr(path, extStart + 1); } @@ -130,39 +130,39 @@ class Project { template ox::Error Project::writeObj(ox::StringViewCR path, T const&obj, ox::ClawFormat fmt) noexcept { - oxRequireM(buff, ox::writeClaw(obj, fmt)); + OX_REQUIRE_M(buff, ox::writeClaw(obj, fmt)); if (fmt == ox::ClawFormat::Organic) { buff.pop_back(); } // write to FS - oxReturnError(mkdir(parentDir(path))); - oxReturnError(writeBuff(path, buff)); + OX_RETURN_ERROR(mkdir(parentDir(path))); + OX_RETURN_ERROR(writeBuff(path, buff)); // write type descriptor if (m_typeStore.get().error) { - oxReturnError(ox::buildTypeDef(m_typeStore, obj)); + OX_RETURN_ERROR(ox::buildTypeDef(m_typeStore, obj)); } - oxRequire(desc, m_typeStore.get()); + OX_REQUIRE(desc, m_typeStore.get()); auto const descPath = ox::sfmt("{}/{}", m_typeDescPath, buildTypeId(*desc)); auto const descExists = m_fs.exists(descPath); if (!descExists) { - oxReturnError(writeTypeStore()); + OX_RETURN_ERROR(writeTypeStore()); } - oxReturnError(keel::reloadAsset(m_ctx, path)); - oxRequire(uuid, pathToUuid(m_ctx, path)); + OX_RETURN_ERROR(keel::reloadAsset(m_ctx, path)); + OX_REQUIRE(uuid, pathToUuid(m_ctx, path)); fileUpdated.emit(path, uuid); return {}; } template ox::Error Project::writeObj(ox::StringViewCR path, T const&obj) noexcept { - oxRequire(ext, fileExt(path)); + OX_REQUIRE(ext, fileExt(path)); auto const fmt = m_typeFmt[ext].or_value(ox::ClawFormat::Metal); return writeObj(path, obj, fmt); } template ox::Result Project::loadObj(ox::StringViewCR path) const noexcept { - oxRequire(buff, loadBuff(path)); + OX_REQUIRE(buff, loadBuff(path)); if constexpr(ox::is_same_v) { return keel::readAsset(m_typeStore, buff); } else { @@ -180,7 +180,7 @@ ox::Error Project::subscribe(ProjectEvent e, ox::SignalHandler *tgt, Functor &&s break; case ProjectEvent::FileRecognized: { - oxRequire(files, listFiles()); + OX_REQUIRE(files, listFiles()); for (auto const&f : files) { slot(f); } diff --git a/src/olympic/studio/modlib/include/studio/selectiontracker.hpp b/src/olympic/studio/modlib/include/studio/selectiontracker.hpp index 776b6b9..53f2d5f 100644 --- a/src/olympic/studio/modlib/include/studio/selectiontracker.hpp +++ b/src/olympic/studio/modlib/include/studio/selectiontracker.hpp @@ -1,3 +1,6 @@ +/* + * Copyright 2016 - 2024 Gary Talent (gary@drinkingtea.net). All rights reserved. + */ #pragma once @@ -30,7 +33,7 @@ constexpr auto iterateSelection(studio::Selection const&sel, auto const&cb) { for (auto x = sel.a.x; x <= sel.b.x; ++x) { for (auto y = sel.a.y; y <= sel.b.y; ++y) { if constexpr(retErr) { - oxReturnError(cb(x, y)); + OX_RETURN_ERROR(cb(x, y)); } else { cb(x, y); } @@ -46,7 +49,7 @@ constexpr auto iterateSelectionRows(studio::Selection const&sel, auto const&cb) for (auto y = sel.a.y; y <= sel.b.y; ++y) { for (auto x = sel.a.x; x <= sel.b.x; ++x) { if constexpr(retErr) { - oxReturnError(cb(x, y)); + OX_RETURN_ERROR(cb(x, y)); } else { cb(x, y); } diff --git a/src/olympic/studio/modlib/src/filedialog_nfd.cpp b/src/olympic/studio/modlib/src/filedialog_nfd.cpp index 4bf1163..38744ae 100644 --- a/src/olympic/studio/modlib/src/filedialog_nfd.cpp +++ b/src/olympic/studio/modlib/src/filedialog_nfd.cpp @@ -31,9 +31,9 @@ OX_ALLOW_UNSAFE_BUFFERS_END return out; } case NFD_CANCEL: - return OxError(1, "Operation cancelled"); + return ox::Error(1, "Operation cancelled"); default: - return OxError(2, NFD::GetError()); + return ox::Error(2, NFD::GetError()); } } diff --git a/src/olympic/studio/modlib/src/imguiutil.cpp b/src/olympic/studio/modlib/src/imguiutil.cpp index 7650550..b24fab7 100644 --- a/src/olympic/studio/modlib/src/imguiutil.cpp +++ b/src/olympic/studio/modlib/src/imguiutil.cpp @@ -10,7 +10,7 @@ namespace studio::ig { -ChildStackItem::ChildStackItem(ox::CStringView id, ImVec2 const&sz) noexcept { +ChildStackItem::ChildStackItem(ox::CStringViewCR id, ImVec2 const&sz) noexcept { ImGui::BeginChild(id.c_str(), sz); } @@ -26,7 +26,7 @@ IDStackItem::IDStackItem(const char *id) noexcept { ImGui::PushID(id); } -IDStackItem::IDStackItem(ox::CStringView id) noexcept: IDStackItem(id.c_str()) {} +IDStackItem::IDStackItem(ox::CStringViewCR id) noexcept: IDStackItem(id.c_str()) {} IDStackItem::~IDStackItem() noexcept { ImGui::PopID(); @@ -50,7 +50,7 @@ void centerNextWindow(turbine::Context &ctx) noexcept { ImGui::SetNextWindowPos(ImVec2(screenW / mod, screenH / mod), ImGuiCond_Always, ImVec2(0.5f, 0.5f)); } -bool PushButton(ox::CStringView lbl, ImVec2 const&btnSz) noexcept { +bool PushButton(ox::CStringViewCR lbl, ImVec2 const&btnSz) noexcept { return ImGui::Button(lbl.c_str(), btnSz); } @@ -77,7 +77,7 @@ PopupResponse PopupControlsOkCancel(bool &popupOpen) { return PopupControlsOkCancel(ImGui::GetContentRegionAvail().x + 17, popupOpen); } -bool BeginPopup(turbine::Context &ctx, ox::CStringView popupName, bool &show, ImVec2 const&sz) { +bool BeginPopup(turbine::Context &ctx, ox::CStringViewCR popupName, bool &show, ImVec2 const&sz) { constexpr auto modalFlags = ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize; centerNextWindow(ctx); ImGui::OpenPopup(popupName.c_str()); @@ -105,7 +105,7 @@ bool ComboBox( } bool ComboBox( - ox::CStringView lbl, + ox::CStringViewCR lbl, std::function const&f, size_t strCnt, size_t &selectedIdx) noexcept { @@ -125,16 +125,16 @@ bool ComboBox( } bool FileComboBox( - ox::CStringView lbl, + ox::CStringViewCR lbl, StudioContext &sctx, - ox::StringView fileExt, + ox::StringViewCR fileExt, size_t &selectedIdx) noexcept { auto const&list = sctx.project->fileList(fileExt); return ComboBox(lbl, list, selectedIdx); } bool ListBox( - ox::CStringView name, + ox::CStringViewCR name, std::function const&f, size_t strCnt, size_t &selIdx) noexcept { @@ -155,7 +155,7 @@ bool ListBox( return out; } -bool ListBox(ox::CStringView name, ox::Span const&list, size_t &selIdx) noexcept { +bool ListBox(ox::CStringViewCR name, ox::SpanView const&list, size_t &selIdx) noexcept { return ListBox(name, [list](size_t i) -> ox::CStringView { return list[i]; }, list.size(), selIdx); @@ -164,8 +164,8 @@ bool ListBox(ox::CStringView name, ox::Span const&list, size_t FilePicker::FilePicker( StudioContext &sctx, - ox::String title, - ox::String fileExt, + ox::StringParam title, + ox::StringParam fileExt, ImVec2 const&size) noexcept: m_sctx(sctx), m_title(std::move(title)), diff --git a/src/olympic/studio/modlib/src/project.cpp b/src/olympic/studio/modlib/src/project.cpp index 2975dbb..15525c3 100644 --- a/src/olympic/studio/modlib/src/project.cpp +++ b/src/olympic/studio/modlib/src/project.cpp @@ -36,7 +36,7 @@ Project::Project(keel::Context &ctx, ox::String path, ox::StringViewCR projectDa oxTracef("studio", "Project: {}", m_path); generateTypes(m_typeStore); if (ox::defines::Debug) { - oxThrowError(writeTypeStore()); + OX_THROW_ERROR(writeTypeStore()); } buildFileIndex(); } @@ -44,7 +44,7 @@ Project::Project(keel::Context &ctx, ox::String path, ox::StringViewCR projectDa ox::Error Project::create() noexcept { std::error_code ec; std::filesystem::create_directory(m_path.toStdString(), ec); - return OxError(static_cast(ec.value()), "PassThroughFS: mkdir failed"); + return ox::Error(static_cast(ec.value()), "PassThroughFS: mkdir failed"); } ox::String const&Project::projectPath() const noexcept { @@ -58,11 +58,11 @@ ox::FileSystem &Project::romFs() noexcept { ox::Error Project::mkdir(ox::StringViewCR path) const noexcept { auto const [stat, err] = m_fs.stat(path); if (err) { - oxReturnError(m_fs.mkdir(path, true)); + OX_RETURN_ERROR(m_fs.mkdir(path, true)); fileUpdated.emit(path, {}); } return stat.fileType == ox::FileType::Directory ? - ox::Error{} : OxError(1, "path exists as normal file"); + ox::Error{} : ox::Error(1, "path exists as normal file"); } ox::Result Project::stat(ox::StringViewCR path) const noexcept { @@ -79,12 +79,12 @@ ox::Vector const&Project::fileList(ox::StringViewCR ext) noexcept { ox::Error Project::writeTypeStore() noexcept { // write all descriptors because we don't know which types T depends on - oxReturnError(mkdir(m_typeDescPath)); + OX_RETURN_ERROR(mkdir(m_typeDescPath)); for (auto const &t: m_typeStore.typeList()) { - oxRequire(typeOut, ox::writeClaw(*t, ox::ClawFormat::Organic)); + OX_REQUIRE(typeOut, ox::writeClaw(*t, ox::ClawFormat::Organic)); // write to FS auto const typePath = ox::sfmt("{}/{}", m_typeDescPath, buildTypeId(*t)); - oxReturnError(writeBuff(typePath, {typeOut.data(), typeOut.size() - 1})); + OX_RETURN_ERROR(writeBuff(typePath, {typeOut.data(), typeOut.size() - 1})); } return {}; } @@ -119,11 +119,11 @@ ox::Error Project::writeBuff(ox::StringViewCR path, ox::BufferView const&buff) n ox::BufferWriter writer(&outBuff); auto const [uuid, err] = pathToUuid(m_ctx, path); if (!err) { - oxReturnError(keel::writeUuidHeader(writer, uuid)); + OX_RETURN_ERROR(keel::writeUuidHeader(writer, uuid)); } - oxReturnError(writer.write(buff.data(), buff.size())); + OX_RETURN_ERROR(writer.write(buff.data(), buff.size())); auto const newFile = m_fs.stat(path).error != 0; - oxReturnError(m_fs.write(path, outBuff.data(), outBuff.size(), ox::FileType::NormalFile)); + OX_RETURN_ERROR(m_fs.write(path, outBuff.data(), outBuff.size(), ox::FileType::NormalFile)); if (newFile) { fileAdded.emit(path); indexFile(path); @@ -138,16 +138,16 @@ ox::Result Project::loadBuff(ox::StringViewCR path) const noexcept { } ox::Error Project::lsProcDir(ox::Vector *paths, ox::StringViewCR path) const noexcept { - oxRequire(files, m_fs.ls(path)); + OX_REQUIRE(files, m_fs.ls(path)); for (auto const&name : files) { auto fullPath = ox::sfmt("{}/{}", path, name); - oxRequire(stat, m_fs.stat(ox::StringView(fullPath))); + OX_REQUIRE(stat, m_fs.stat(ox::StringView(fullPath))); switch (stat.fileType) { case ox::FileType::NormalFile: paths->emplace_back(std::move(fullPath)); break; case ox::FileType::Directory: - oxReturnError(lsProcDir(paths, fullPath)); + OX_RETURN_ERROR(lsProcDir(paths, fullPath)); break; case ox::FileType::None: break; @@ -158,7 +158,7 @@ ox::Error Project::lsProcDir(ox::Vector *paths, ox::StringViewCR pat ox::Result> Project::listFiles(ox::StringViewCR path) const noexcept { ox::Vector paths; - oxReturnError(lsProcDir(&paths, path)); + OX_RETURN_ERROR(lsProcDir(&paths, path)); return paths; } diff --git a/src/olympic/studio/modlib/src/undocommand.cpp b/src/olympic/studio/modlib/src/undocommand.cpp index 96dec70..2f60ad1 100644 --- a/src/olympic/studio/modlib/src/undocommand.cpp +++ b/src/olympic/studio/modlib/src/undocommand.cpp @@ -1,3 +1,6 @@ +/* + * Copyright 2016 - 2024 Gary Talent (gary@drinkingtea.net). All rights reserved. + */ #include diff --git a/src/olympic/studio/modlib/src/undostack.cpp b/src/olympic/studio/modlib/src/undostack.cpp index 1bcf209..dc51354 100644 --- a/src/olympic/studio/modlib/src/undostack.cpp +++ b/src/olympic/studio/modlib/src/undostack.cpp @@ -10,7 +10,7 @@ ox::Error UndoStack::push(ox::UPtr &&cmd) noexcept { for (auto const i = m_stackIdx; i < m_stack.size();) { std::ignore = m_stack.erase(i); } - oxReturnError(cmd->redo()); + OX_RETURN_ERROR(cmd->redo()); redoTriggered.emit(cmd.get()); changeTriggered.emit(cmd.get()); if (m_stack.empty() || !(*m_stack.back().value)->mergeWith(*cmd)) { @@ -27,7 +27,7 @@ ox::Error UndoStack::push(ox::UPtr &&cmd) noexcept { ox::Error UndoStack::redo() noexcept { if (m_stackIdx < m_stack.size()) { auto &c = m_stack[m_stackIdx]; - oxReturnError(c->redo()); + OX_RETURN_ERROR(c->redo()); ++m_stackIdx; redoTriggered.emit(c.get()); changeTriggered.emit(c.get()); @@ -38,7 +38,7 @@ ox::Error UndoStack::redo() noexcept { ox::Error UndoStack::undo() noexcept { if (m_stackIdx) { auto &c = m_stack[--m_stackIdx]; - oxReturnError(c->undo()); + OX_RETURN_ERROR(c->undo()); undoTriggered.emit(c.get()); changeTriggered.emit(c.get()); } diff --git a/src/olympic/turbine/include/turbine/clipboard.hpp b/src/olympic/turbine/include/turbine/clipboard.hpp index 2044515..2b88d86 100644 --- a/src/olympic/turbine/include/turbine/clipboard.hpp +++ b/src/olympic/turbine/include/turbine/clipboard.hpp @@ -38,7 +38,7 @@ ox::Result getClipboardData(Context &ctx, ox::StringView t template ox::Result getClipboardObject(Context &ctx) noexcept { - oxRequire(p, getClipboardData(ctx, ox::ModelTypeId_v)); + OX_REQUIRE(p, getClipboardData(ctx, ox::ModelTypeId_v)); return dynamic_cast(p); } diff --git a/src/olympic/turbine/include/turbine/turbine.hpp b/src/olympic/turbine/include/turbine/turbine.hpp index e27341d..aa6cfc6 100644 --- a/src/olympic/turbine/include/turbine/turbine.hpp +++ b/src/olympic/turbine/include/turbine/turbine.hpp @@ -18,6 +18,8 @@ using TimeMs = uint64_t; ox::Result init(ox::UPtr &&fs, ox::StringViewCR appName) noexcept; +ox::Result init(ox::StringViewCR fsPath, ox::StringViewCR appName) noexcept; + ox::Error run(Context &ctx) noexcept; // Returns the number of milliseconds that have passed since the start of the diff --git a/src/olympic/turbine/src/CMakeLists.txt b/src/olympic/turbine/src/CMakeLists.txt index 1e647f7..c8b08b8 100644 --- a/src/olympic/turbine/src/CMakeLists.txt +++ b/src/olympic/turbine/src/CMakeLists.txt @@ -18,6 +18,11 @@ target_include_directories( ../include ) +target_sources( + Turbine PUBLIC + turbine.cpp +) + target_link_libraries( Turbine PUBLIC Keel diff --git a/src/olympic/turbine/src/gba/gfx.cpp b/src/olympic/turbine/src/gba/gfx.cpp index a777074..f9591c8 100644 --- a/src/olympic/turbine/src/gba/gfx.cpp +++ b/src/olympic/turbine/src/gba/gfx.cpp @@ -44,7 +44,7 @@ ox::Bounds getWindowBounds(Context&) noexcept { } ox::Error setWindowBounds(Context&, ox::Bounds const&) noexcept { - return OxError(1, "setWindowBounds not supported on GBA"); + return ox::Error(1, "setWindowBounds not supported on GBA"); } } diff --git a/src/olympic/turbine/src/gba/turbine.cpp b/src/olympic/turbine/src/gba/turbine.cpp index 873ecc7..068ae4e 100644 --- a/src/olympic/turbine/src/gba/turbine.cpp +++ b/src/olympic/turbine/src/gba/turbine.cpp @@ -55,17 +55,17 @@ OX_ALLOW_UNSAFE_BUFFERS_BEGIN } } OX_ALLOW_UNSAFE_BUFFERS_END - return OxError(1); + return ox::Error(1); } ox::Result init( ox::UPtr &&fs, ox::StringViewCR appName) noexcept { auto ctx = ox::make_unique(); - oxReturnError(keel::init(ctx->keelCtx, std::move(fs), appName)); + OX_RETURN_ERROR(keel::init(ctx->keelCtx, std::move(fs), appName)); #ifdef OX_BARE_METAL - oxReturnError(findPreloadSection().moveTo(ctx->keelCtx.preloadSectionOffset)); + OX_RETURN_ERROR(findPreloadSection().moveTo(ctx->keelCtx.preloadSectionOffset)); #endif - oxReturnError(initGfx(*ctx)); + OX_RETURN_ERROR(initGfx(*ctx)); initTimer(); initIrq(); return ox::UPtr(std::move(ctx)); diff --git a/src/olympic/turbine/src/glfw/clipboard.cpp b/src/olympic/turbine/src/glfw/clipboard.cpp index fa9a6a0..65a81ae 100644 --- a/src/olympic/turbine/src/glfw/clipboard.cpp +++ b/src/olympic/turbine/src/glfw/clipboard.cpp @@ -30,7 +30,7 @@ ox::Result getClipboardData(Context &ctx, ox::StringView t if (ctx.clipboard && ctx.clipboard->typeId() == typeId) { return ctx.clipboard.get(); } - return OxError(1); + return ox::Error(1); } } diff --git a/src/olympic/turbine/src/glfw/config.hpp b/src/olympic/turbine/src/glfw/config.hpp index 550e5b5..7f84f85 100644 --- a/src/olympic/turbine/src/glfw/config.hpp +++ b/src/olympic/turbine/src/glfw/config.hpp @@ -4,8 +4,11 @@ #pragma once +#include + namespace turbine::config { -constexpr bool GlFpsPrint = TURBINE_GL_FPS_PRINT; +inline constexpr bool GlFpsPrint = TURBINE_GL_FPS_PRINT; +inline constexpr TimeMs MandatoryRefreshPeriod = 168; } diff --git a/src/olympic/turbine/src/glfw/context.hpp b/src/olympic/turbine/src/glfw/context.hpp index 522e3c1..de760da 100644 --- a/src/olympic/turbine/src/glfw/context.hpp +++ b/src/olympic/turbine/src/glfw/context.hpp @@ -20,7 +20,7 @@ class Context { ox::AnyPtr applicationData; // GLFW impl data //////////////////////////////////////////////////////// - int uninterruptedRefreshes = 3; + TimeMs mandatoryRefreshPeriodEnd{}; ox::UPtr clipboard; struct GLFWwindow *window = nullptr; int refreshWithinMs = 0; diff --git a/src/olympic/turbine/src/glfw/gfx.cpp b/src/olympic/turbine/src/glfw/gfx.cpp index 0b34516..a5445a8 100644 --- a/src/olympic/turbine/src/glfw/gfx.cpp +++ b/src/olympic/turbine/src/glfw/gfx.cpp @@ -9,6 +9,8 @@ #include #endif +#include "config.hpp" + #include #include "context.hpp" @@ -62,10 +64,13 @@ static void handleKeyPress(Context &ctx, int key, bool down) noexcept { return map; }(); auto const eventHandler = keyEventHandler(ctx); - auto const k = keyMap[static_cast(key)]; - setKeyDownStatus(ctx, k, down); - if (eventHandler) { - eventHandler(ctx, k, down); + auto const keyIdx = static_cast(key); + if (keyIdx < keyMap.size()) { + auto const k = keyMap[keyIdx]; + setKeyDownStatus(ctx, k, down); + if (eventHandler) { + eventHandler(ctx, k, down); + } } } @@ -73,17 +78,17 @@ static void handleGlfwCursorPosEvent(GLFWwindow*, double, double) noexcept { } static void handleGlfwMouseButtonEvent(GLFWwindow *window, int, int, int) noexcept { - auto const ctx = static_cast(glfwGetWindowUserPointer(window)); - ctx->uninterruptedRefreshes = 25; + auto &ctx = *static_cast(glfwGetWindowUserPointer(window)); + ctx.mandatoryRefreshPeriodEnd = ticksMs(ctx) + config::MandatoryRefreshPeriod; } static void handleGlfwKeyEvent(GLFWwindow *window, int key, int, int action, int) noexcept { - auto const ctx = static_cast(glfwGetWindowUserPointer(window)); - ctx->uninterruptedRefreshes = 25; + auto &ctx = *static_cast(glfwGetWindowUserPointer(window)); + ctx.mandatoryRefreshPeriodEnd = ticksMs(ctx) + config::MandatoryRefreshPeriod; if (action == GLFW_PRESS) { - handleKeyPress(*ctx, key, true); + handleKeyPress(ctx, key, true); } else if (action == GLFW_RELEASE) { - handleKeyPress(*ctx, key, false); + handleKeyPress(ctx, key, false); } } @@ -199,7 +204,7 @@ ox::Error initGfx(Context &ctx) noexcept { ctx.window = glfwCreateWindow(240 * Scale, 160 * Scale, ctx.keelCtx.appName.c_str(), nullptr, nullptr); //ctx.window = glfwCreateWindow(876, 743, ctx.keelCtx.appName.c_str(), nullptr, nullptr); if (ctx.window == nullptr) { - return OxError(1, "Could not open GLFW window"); + return ox::Error(1, "Could not open GLFW window"); } glfwSetCursorPosCallback(ctx.window, handleGlfwCursorPosEvent); glfwSetMouseButtonCallback(ctx.window, handleGlfwMouseButtonEvent); @@ -207,7 +212,7 @@ ox::Error initGfx(Context &ctx) noexcept { glfwSetWindowUserPointer(ctx.window, &ctx); glfwMakeContextCurrent(ctx.window); if (!gladLoadGLES2Loader(reinterpret_cast(glfwGetProcAddress))) { - return OxError(2, "Could not init Glad"); + return ox::Error(2, "Could not init Glad"); } #if TURBINE_USE_IMGUI IMGUI_CHECKVERSION(); diff --git a/src/olympic/turbine/src/glfw/turbine.cpp b/src/olympic/turbine/src/glfw/turbine.cpp index d844606..91147c2 100644 --- a/src/olympic/turbine/src/glfw/turbine.cpp +++ b/src/olympic/turbine/src/glfw/turbine.cpp @@ -43,12 +43,12 @@ static void draw(GLFWwindow *window, int, int) noexcept { ox::Result init( ox::UPtr &&fs, ox::StringViewCR appName) noexcept { auto ctx = ox::make_unique(); - oxReturnError(keel::init(ctx->keelCtx, std::move(fs), appName)); + OX_RETURN_ERROR(keel::init(ctx->keelCtx, std::move(fs), appName)); using namespace std::chrono; ctx->startTime = static_cast( duration_cast(system_clock::now().time_since_epoch()).count()); glfwInit(); - oxReturnError(initGfx(*ctx)); + OX_RETURN_ERROR(initGfx(*ctx)); glfwSetWindowSizeCallback(ctx->window, draw); return ox::UPtr(ctx.release()); } @@ -88,12 +88,8 @@ ox::Error run(Context &ctx) noexcept { tickFps(ctx, ticks); draw(ctx); auto const realSleepTime = ox::min(static_cast(ctx.refreshWithinMs), sleepTime); - if (realSleepTime) { - if (ctx.uninterruptedRefreshes) { - --ctx.uninterruptedRefreshes; - } else { - glfwWaitEventsTimeout(static_cast(realSleepTime) / 1000); - } + if (realSleepTime && ctx.mandatoryRefreshPeriodEnd <= ticks) { + glfwWaitEventsTimeout(static_cast(realSleepTime) / 1000); } } shutdown(ctx); diff --git a/src/olympic/turbine/src/turbine.cpp b/src/olympic/turbine/src/turbine.cpp new file mode 100644 index 0000000..56b2499 --- /dev/null +++ b/src/olympic/turbine/src/turbine.cpp @@ -0,0 +1,16 @@ +/* + * Copyright 2016 - 2024 Gary Talent (gary@drinkingtea.net). All rights reserved. + */ + +#include + +#include + +namespace turbine { + +ox::Result init(ox::StringViewCR fsPath, ox::StringViewCR appName) noexcept { + OX_REQUIRE_M(fs, keel::loadRomFs(fsPath)); + return init(std::move(fs), appName); +} + +} \ No newline at end of file