diff --git a/src/nostalgia/modules/gfx/src/keel/keelmodule.cpp b/src/nostalgia/modules/gfx/src/keel/keelmodule.cpp index 4fa04d2d5..a52363484 100644 --- a/src/nostalgia/modules/gfx/src/keel/keelmodule.cpp +++ b/src/nostalgia/modules/gfx/src/keel/keelmodule.cpp @@ -14,19 +14,6 @@ namespace nostalgia::gfx { static class: public keel::Module { - private: - keel::ConverterFunc m_nostalgiaPaletteToPaletteV1Converter; - keel::ConverterFunc m_paletteV1ToPaletteV2Converter; - keel::ConverterFunc m_paletteV2ToPaletteV3Converter; - keel::ConverterFunc m_paletteV3ToPaletteV4Converter; - keel::ConverterFunc m_paletteV4ToPaletteV5Converter; - keel::ConverterFunc m_paletteToCompactPaletteConverter; - keel::ConverterFunc m_tileSheetV1ToTileSheetV2Converter; - keel::ConverterFunc m_tileSheetV2ToTileSheetV3Converter; - keel::ConverterFunc m_tileSheetV3ToTileSheetV4Converter; - keel::ConverterFunc m_tileSheetV4ToTileSheetV5Converter; - keel::ConverterFuncm_tileSheetToCompactTileSheetConverter; - public: [[nodiscard]] ox::String id() const noexcept override { @@ -52,19 +39,19 @@ static class: public keel::Module { } [[nodiscard]] - ox::Vector converters() const noexcept final { + ox::Vector converters() const noexcept final { return { - &m_nostalgiaPaletteToPaletteV1Converter, - &m_paletteV1ToPaletteV2Converter, - &m_paletteV2ToPaletteV3Converter, - &m_paletteV3ToPaletteV4Converter, - &m_paletteV4ToPaletteV5Converter, - &m_paletteToCompactPaletteConverter, - &m_tileSheetV1ToTileSheetV2Converter, - &m_tileSheetV2ToTileSheetV3Converter, - &m_tileSheetV3ToTileSheetV4Converter, - &m_tileSheetV4ToTileSheetV5Converter, - &m_tileSheetToCompactTileSheetConverter, + keel::ConverterWrap::make(), + keel::ConverterWrap::make(), + keel::ConverterWrap::make(), + keel::ConverterWrap::make(), + keel::ConverterWrap::make(), + keel::ConverterWrap::make(), + keel::ConverterWrap::make(), + keel::ConverterWrap::make(), + keel::ConverterWrap::make(), + keel::ConverterWrap::make(), + keel::ConverterWrap::make(), }; } diff --git a/src/nostalgia/modules/gfx/src/keel/typeconv.hpp b/src/nostalgia/modules/gfx/src/keel/typeconv.hpp index c5b05819d..64bb5c42d 100644 --- a/src/nostalgia/modules/gfx/src/keel/typeconv.hpp +++ b/src/nostalgia/modules/gfx/src/keel/typeconv.hpp @@ -16,10 +16,7 @@ namespace nostalgia::gfx { // Type converters -ox::Error ConvertNostalgiaPaletteToPaletteV1( - keel::Context&, - NostalgiaPalette &src, - PaletteV1 &dst) noexcept; +ox::Error ConvertNostalgiaPaletteToPaletteV1(keel::Context&, NostalgiaPalette &src, PaletteV1 &dst) noexcept; ox::Error ConvertPaletteV1ToPaletteV2(keel::Context&, PaletteV1 &src, PaletteV2 &dst) noexcept; diff --git a/src/nostalgia/modules/sound/src/keel/keelmodule.cpp b/src/nostalgia/modules/sound/src/keel/keelmodule.cpp index c1cb6f6ed..780862e9a 100644 --- a/src/nostalgia/modules/sound/src/keel/keelmodule.cpp +++ b/src/nostalgia/modules/sound/src/keel/keelmodule.cpp @@ -26,7 +26,7 @@ static class: public keel::Module { } [[nodiscard]] - ox::Vector converters() const noexcept final { + ox::Vector converters() const noexcept final { return { }; } diff --git a/src/olympic/keel/include/keel/context.hpp b/src/olympic/keel/include/keel/context.hpp index b128bbf08..0325c74e2 100644 --- a/src/olympic/keel/include/keel/context.hpp +++ b/src/olympic/keel/include/keel/context.hpp @@ -8,11 +8,11 @@ #include #include "assetmanager.hpp" +#include "typeconv.hpp" namespace keel { class Context; -using PackTransform = ox::Result(*)(Context&, ox::Buffer &clawData, ox::StringViewCR); class Context { public: @@ -22,7 +22,7 @@ class Context { AssetManager assetManager; ox::HashMap pathToUuid; ox::HashMap uuidToPath; - ox::Vector converters; + ox::Vector converters; ox::Vector packTransforms; #else std::size_t preloadSectionOffset = 0; @@ -45,7 +45,7 @@ constexpr ox::SpanView packTransforms( #endif } -constexpr ox::SpanView converters( +constexpr ox::SpanView converters( [[maybe_unused]] Context const&ctx) noexcept { #ifndef OX_BARE_METAL return ctx.converters; diff --git a/src/olympic/keel/include/keel/module.hpp b/src/olympic/keel/include/keel/module.hpp index 4dab0b28d..ed5b55b6e 100644 --- a/src/olympic/keel/include/keel/module.hpp +++ b/src/olympic/keel/include/keel/module.hpp @@ -32,7 +32,7 @@ class Module { [[nodiscard]] virtual ox::Vector types() const noexcept; [[nodiscard]] - virtual ox::Vector converters() const noexcept; + virtual ox::Vector converters() const noexcept; [[nodiscard]] virtual ox::Vector packTransforms() const noexcept; }; diff --git a/src/olympic/keel/include/keel/typeconv.hpp b/src/olympic/keel/include/keel/typeconv.hpp index 494e4c1e3..59c32184c 100644 --- a/src/olympic/keel/include/keel/typeconv.hpp +++ b/src/olympic/keel/include/keel/typeconv.hpp @@ -9,10 +9,11 @@ #include #include "asset.hpp" -#include "context.hpp" namespace keel { +class Context; + class Wrap { public: virtual ~Wrap() = default; @@ -125,58 +126,9 @@ class BaseConverter { }; -template -class Converter: public BaseConverter { - public: - [[nodiscard]] - constexpr ox::StringView srcTypeName() const noexcept final { - return ox::ModelTypeName_v; - } - - [[nodiscard]] - constexpr int srcTypeVersion() const noexcept final { - return ox::ModelTypeVersion_v; - } - - [[nodiscard]] - constexpr bool srcMatches(ox::StringViewCR pSrcTypeName, int pSrcTypeVersion) const noexcept final { - constexpr auto SrcTypeName = ox::requireModelTypeName(); - constexpr auto SrcTypeVersion = ox::requireModelTypeVersion(); - return pSrcTypeName == SrcTypeName - && pSrcTypeVersion == SrcTypeVersion; - } - - [[nodiscard]] - constexpr bool dstMatches(ox::StringViewCR dstTypeName, int dstTypeVersion) const noexcept final { - constexpr auto DstTypeName = ox::StringView{ox::requireModelTypeName()}; - constexpr auto DstTypeVersion = ox::requireModelTypeVersion(); - return dstTypeName == DstTypeName - && dstTypeVersion == DstTypeVersion; - } - - ox::Result> convertPtrToPtr( - keel::Context &ctx, Wrap &src) const noexcept final { - ox::Result> dst{makeWrap()}; - OX_RETURN_ERROR(convert(ctx, wrapCast(src), wrapCast(*dst.value))); - return dst; - } - - ox::Result> convertBuffToPtr( - keel::Context &ctx, ox::BufferView const&srcBuff) const noexcept final { - OX_REQUIRE_M(src, readAsset(srcBuff)); - ox::Result> dst{makeWrap()}; - OX_RETURN_ERROR(convert(ctx, src, wrapCast(*dst.value))); - return dst; - } - - protected: - virtual ox::Error convert(keel::Context &ctx, SrcType&, DstType&) const noexcept = 0; - -}; - template -class ConverterFunc: public BaseConverter { +class Converter: public BaseConverter { private: template struct ParamExtractor { @@ -241,20 +193,42 @@ class ConverterFunc: public BaseConverter { }; +class ConverterWrap { + private: + ox::AllocAlias m_buff{}; + BaseConverter *m_conv{}; + public: + template + static ConverterWrap make() { + ConverterWrap out; + static_assert(sizeof(Converter) <= sizeof(out.m_buff)); + out.m_conv = new (out.m_buff.data()) Converter{}; + return out; + } + constexpr ConverterWrap() {} + ConverterWrap(ConverterWrap const &other): + m_buff{other.m_buff}, + m_conv{m_buff.data()} {} + [[nodiscard]] + BaseConverter const *converter() const noexcept { + return m_conv; + } +}; + ox::Result> convert( - keel::Context &ctx, + Context &ctx, ox::BufferView const&srcBuffer, ox::StringViewCR dstTypeName, int dstTypeVersion) noexcept; ox::Result> convert( - keel::Context &ctx, + Context &ctx, Wrap &src, ox::StringViewCR dstTypeName, int dstTypeVersion) noexcept; ox::Result> convert( - keel::Context &ctx, + Context &ctx, auto &src, ox::StringViewCR dstTypeName, int const dstTypeVersion) noexcept { @@ -263,7 +237,7 @@ ox::Result> convert( } ox::Result> convert( - keel::Context &ctx, + Context &ctx, auto const&src, ox::StringViewCR dstTypeName, int const dstTypeVersion) noexcept { @@ -274,7 +248,7 @@ ox::Result> convert( template ox::Result convertObjToObj( - keel::Context &ctx, + Context &ctx, auto &src) noexcept { OX_REQUIRE_M(out, convert(ctx, WrapRef{src}, ox::ModelTypeName_v, ox::ModelTypeVersion_v)); return std::move(wrapCast(*out)); @@ -316,4 +290,6 @@ ox::Result transformRule(keel::Context &ctx, ox::Buffer &buff, ox::StringV return false; }; +using PackTransform = ox::Result(*)(Context&, ox::Buffer &clawData, ox::StringViewCR); + } diff --git a/src/olympic/keel/src/module.cpp b/src/olympic/keel/src/module.cpp index 7a0357ae5..c6ca0381c 100644 --- a/src/olympic/keel/src/module.cpp +++ b/src/olympic/keel/src/module.cpp @@ -24,7 +24,7 @@ ox::Vector Module::types() const noexcept { return {}; } -ox::Vector Module::converters() const noexcept { +ox::Vector Module::converters() const noexcept { return {}; } diff --git a/src/olympic/keel/src/typeconv.cpp b/src/olympic/keel/src/typeconv.cpp index 531e73700..505b16798 100644 --- a/src/olympic/keel/src/typeconv.cpp +++ b/src/olympic/keel/src/typeconv.cpp @@ -2,20 +2,21 @@ * Copyright 2016 - 2025 Gary Talent (gary@drinkingtea.net). All rights reserved. */ +#include #include #include namespace keel { static ox::Result findConverter( - ox::SpanView const&converters, + ox::SpanView const&converters, ox::StringViewCR srcTypeName, int const srcTypeVersion, ox::StringViewCR dstTypeName, int const dstTypeVersion) noexcept { for (auto const&c : converters) { - if (c->matches(srcTypeName, srcTypeVersion, dstTypeName, dstTypeVersion)) { - return c; + if (c.converter()->matches(srcTypeName, srcTypeVersion, dstTypeName, dstTypeVersion)) { + return c.converter(); } } return ox::Error{1, "Could not find converter"}; @@ -31,7 +32,7 @@ static ox::Result> convert(BaseConverter const&c, Context &ctx, W static ox::Result> convert( Context &ctx, - ox::SpanView const&converters, + ox::SpanView const&converters, auto &src, ox::StringViewCR srcTypeName, int const srcTypeVersion, @@ -45,14 +46,14 @@ static ox::Result> convert( } // try to chain multiple converters for (auto const&subConverter : converters) { - if (!subConverter->dstMatches(dstTypeName, dstTypeVersion)) { + if (!subConverter.converter()->dstMatches(dstTypeName, dstTypeVersion)) { continue; } const auto [intermediate, chainErr] = convert(ctx, converters, src, srcTypeName, srcTypeVersion, - subConverter->srcTypeName(), subConverter->srcTypeVersion()); + subConverter.converter()->srcTypeName(), subConverter.converter()->srcTypeVersion()); if (!chainErr) { - return subConverter->convertPtrToPtr(ctx, *intermediate); + return subConverter.converter()->convertPtrToPtr(ctx, *intermediate); } } return ox::Error{1, "Could not convert between types"};