diff --git a/src/nostalgia/modules/gfx/src/keel/keelmodule.cpp b/src/nostalgia/modules/gfx/src/keel/keelmodule.cpp index 63f1fd89..fbef02ed 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: - NostalgiaPaletteToPaletteV1Converter m_nostalgiaPaletteToPaletteV1Converter; - PaletteV1ToPaletteV2Converter m_paletteV1ToPaletteV2Converter; - PaletteV2ToPaletteV3Converter m_paletteV2ToPaletteV3Converter; - PaletteV3ToPaletteV4Converter m_paletteV3ToPaletteV4Converter; - PaletteV4ToPaletteV5Converter m_paletteV4ToPaletteV5Converter; - PaletteToCompactPaletteConverter m_paletteToCompactPaletteConverter; - TileSheetV1ToTileSheetV2Converter m_tileSheetV1ToTileSheetV2Converter; - TileSheetV2ToTileSheetV3Converter m_tileSheetV2ToTileSheetV3Converter; - TileSheetV3ToTileSheetV4Converter m_tileSheetV3ToTileSheetV4Converter; - TileSheetV4ToTileSheetV5Converter m_tileSheetV4ToTileSheetV5Converter; - TileSheetToCompactTileSheetConverter m_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::Converter::make(), + keel::Converter::make(), + keel::Converter::make(), + keel::Converter::make(), + keel::Converter::make(), + keel::Converter::make(), + keel::Converter::make(), + keel::Converter::make(), + keel::Converter::make(), + keel::Converter::make(), + keel::Converter::make(), }; } diff --git a/src/nostalgia/modules/gfx/src/keel/typeconv.cpp b/src/nostalgia/modules/gfx/src/keel/typeconv.cpp index 927c1671..31d48029 100644 --- a/src/nostalgia/modules/gfx/src/keel/typeconv.cpp +++ b/src/nostalgia/modules/gfx/src/keel/typeconv.cpp @@ -6,26 +6,26 @@ namespace nostalgia::gfx { -ox::Error NostalgiaPaletteToPaletteV1Converter::convert( +ox::Error convertNostalgiaPaletteToPaletteV1( keel::Context&, NostalgiaPalette &src, - PaletteV1 &dst) const noexcept { + PaletteV1 &dst) noexcept { dst.colors = std::move(src.colors); return {}; } -ox::Error PaletteV1ToPaletteV2Converter::convert( +ox::Error convertPaletteV1ToPaletteV2( keel::Context&, PaletteV1 &src, - PaletteV2 &dst) const noexcept { + PaletteV2 &dst) noexcept { dst.pages.emplace_back(std::move(src.colors)); return {}; } -ox::Error PaletteV2ToPaletteV3Converter::convert( +ox::Error convertPaletteV2ToPaletteV3( keel::Context&, PaletteV2 &src, - PaletteV3 &dst) const noexcept { + PaletteV3 &dst) noexcept { dst.pages = std::move(src.pages); if (!dst.pages.empty()) { dst.colorInfo.reserve(dst.pages[0].size()); @@ -36,10 +36,10 @@ ox::Error PaletteV2ToPaletteV3Converter::convert( return {}; } -ox::Error PaletteV3ToPaletteV4Converter::convert( +ox::Error convertPaletteV3ToPaletteV4( keel::Context&, PaletteV3 &src, - PaletteV4 &dst) const noexcept { + PaletteV4 &dst) noexcept { dst.pages.reserve(src.pages.size()); for (auto i = 1; auto &page : src.pages) { dst.pages.emplace_back(ox::sfmt("Page {}", i), std::move(page)); @@ -52,10 +52,10 @@ ox::Error PaletteV3ToPaletteV4Converter::convert( return {}; } -ox::Error PaletteV4ToPaletteV5Converter::convert( +ox::Error convertPaletteV4ToPaletteV5( keel::Context&, PaletteV4 &src, - PaletteV5 &dst) const noexcept { + PaletteV5 &dst) noexcept { dst.colorNames = std::move(src.colorNames); dst.pages.reserve(src.pages.size()); for (auto &s : src.pages) { @@ -72,10 +72,10 @@ ox::Error PaletteV4ToPaletteV5Converter::convert( return {}; } -ox::Error PaletteToCompactPaletteConverter::convert( +ox::Error convertPaletteToCompactPalette( keel::Context&, Palette &src, - CompactPalette &dst) const noexcept { + CompactPalette &dst) noexcept { dst.pages.reserve(src.pages.size()); for (auto &page : src.pages) { auto &p = dst.pages.emplace_back(); @@ -86,10 +86,10 @@ ox::Error PaletteToCompactPaletteConverter::convert( return {}; } -ox::Error TileSheetV1ToTileSheetV2Converter::convert( +ox::Error convertTileSheetV1ToTileSheetV2( keel::Context&, TileSheetV1 &src, - TileSheetV2 &dst) const noexcept { + TileSheetV2 &dst) noexcept { dst.bpp = src.bpp; dst.defaultPalette = std::move(src.defaultPalette); dst.subsheet.name = "Root"; @@ -99,7 +99,7 @@ ox::Error TileSheetV1ToTileSheetV2Converter::convert( return {}; } -void TileSheetV2ToTileSheetV3Converter::convertSubsheet( +static void convertSubsheet( TileSheetV2::SubSheet &src, TileSheetV3::SubSheet &dst, SubSheetId &idIt) noexcept { @@ -115,10 +115,10 @@ void TileSheetV2ToTileSheetV3Converter::convertSubsheet( } } -ox::Error TileSheetV2ToTileSheetV3Converter::convert( +ox::Error convertTileSheetV2ToTileSheetV3( keel::Context&, TileSheetV2 &src, - TileSheetV3 &dst) const noexcept { + TileSheetV3 &dst) noexcept { dst.bpp = src.bpp; dst.defaultPalette = std::move(src.defaultPalette); convertSubsheet(src.subsheet, dst.subsheet, dst.idIt); @@ -126,7 +126,7 @@ ox::Error TileSheetV2ToTileSheetV3Converter::convert( } -void TileSheetV3ToTileSheetV4Converter::convertSubsheet( +static void convertSubsheet( TileSheetV3::SubSheet &src, TileSheetV4::SubSheet &dst, SubSheetId &idIt) noexcept { @@ -142,10 +142,10 @@ void TileSheetV3ToTileSheetV4Converter::convertSubsheet( } } -ox::Error TileSheetV3ToTileSheetV4Converter::convert( +ox::Error convertTileSheetV3ToTileSheetV4( keel::Context&, TileSheetV3 &src, - TileSheetV4 &dst) const noexcept { + TileSheetV4 &dst) noexcept { dst.bpp = src.bpp; dst.idIt = src.idIt; dst.defaultPalette = std::move(src.defaultPalette); @@ -154,7 +154,7 @@ ox::Error TileSheetV3ToTileSheetV4Converter::convert( } -void TileSheetV4ToTileSheetV5Converter::convertSubsheet( +static void convertSubsheet( int const bpp, TileSheetV4::SubSheet &src, TileSheetV5::SubSheet &dst) noexcept { @@ -179,10 +179,10 @@ void TileSheetV4ToTileSheetV5Converter::convertSubsheet( } } -ox::Error TileSheetV4ToTileSheetV5Converter::convert( +ox::Error convertTileSheetV4ToTileSheetV5( keel::Context&, TileSheetV4 &src, - TileSheetV5 &dst) const noexcept { + TileSheetV5 &dst) noexcept { dst.bpp = src.bpp; dst.idIt = src.idIt; OX_RETURN_ERROR(src.defaultPalette.getPath().moveTo(dst.defaultPalette)); @@ -191,10 +191,10 @@ ox::Error TileSheetV4ToTileSheetV5Converter::convert( } -ox::Error TileSheetToCompactTileSheetConverter::convert( +ox::Error convertTileSheetToCompactTileSheet( keel::Context&, TileSheet &src, - CompactTileSheet &dst) const noexcept { + CompactTileSheet &dst) noexcept { dst.bpp = src.bpp; dst.defaultPalette = ox::FileAddress{src.defaultPalette}; dst.pixels = pixels(src); diff --git a/src/nostalgia/modules/gfx/src/keel/typeconv.hpp b/src/nostalgia/modules/gfx/src/keel/typeconv.hpp index 101eafa0..bc55aa9f 100644 --- a/src/nostalgia/modules/gfx/src/keel/typeconv.hpp +++ b/src/nostalgia/modules/gfx/src/keel/typeconv.hpp @@ -16,60 +16,26 @@ namespace nostalgia::gfx { // Type converters -class NostalgiaPaletteToPaletteV1Converter: public keel::Converter { - ox::Error convert(keel::Context&, NostalgiaPalette &src, PaletteV1 &dst) const noexcept final; -}; +ox::Error convertNostalgiaPaletteToPaletteV1(keel::Context&, NostalgiaPalette &src, PaletteV1 &dst) noexcept; -class PaletteV1ToPaletteV2Converter: public keel::Converter { - ox::Error convert(keel::Context&, PaletteV1 &src, PaletteV2 &dst) const noexcept final; -}; +ox::Error convertPaletteV1ToPaletteV2(keel::Context&, PaletteV1 &src, PaletteV2 &dst) noexcept; -class PaletteV2ToPaletteV3Converter: public keel::Converter { - ox::Error convert(keel::Context&, PaletteV2 &src, PaletteV3 &dst) const noexcept final; -}; +ox::Error convertPaletteV2ToPaletteV3(keel::Context&, PaletteV2 &src, PaletteV3 &dst) noexcept; -class PaletteV3ToPaletteV4Converter: public keel::Converter { - ox::Error convert(keel::Context&, PaletteV3 &src, PaletteV4 &dst) const noexcept final; -}; +ox::Error convertPaletteV3ToPaletteV4(keel::Context&, PaletteV3 &src, PaletteV4 &dst) noexcept; -class PaletteV4ToPaletteV5Converter: public keel::Converter { - ox::Error convert(keel::Context&, PaletteV4 &src, PaletteV5 &dst) const noexcept final; -}; +ox::Error convertPaletteV4ToPaletteV5(keel::Context&, PaletteV4 &src, PaletteV5 &dst) noexcept; -class PaletteToCompactPaletteConverter: public keel::Converter { - ox::Error convert(keel::Context&, Palette &src, CompactPalette &dst) const noexcept final; -}; +ox::Error convertPaletteToCompactPalette(keel::Context&, Palette &src, CompactPalette &dst) noexcept; -class TileSheetV1ToTileSheetV2Converter: public keel::Converter { - ox::Error convert(keel::Context&, TileSheetV1 &src, TileSheetV2 &dst) const noexcept final; -}; +ox::Error convertTileSheetV1ToTileSheetV2(keel::Context&, TileSheetV1 &src, TileSheetV2 &dst) noexcept; -class TileSheetV2ToTileSheetV3Converter: public keel::Converter { - static void convertSubsheet( - TileSheetV2::SubSheet &src, - TileSheetV3::SubSheet &dst, - SubSheetId &idIt) noexcept; - ox::Error convert(keel::Context&, TileSheetV2 &src, TileSheetV3 &dst) const noexcept final; -}; +ox::Error convertTileSheetV2ToTileSheetV3(keel::Context&, TileSheetV2 &src, TileSheetV3 &dst) noexcept; -class TileSheetV3ToTileSheetV4Converter: public keel::Converter { - static void convertSubsheet( - TileSheetV3::SubSheet &src, - TileSheetV4::SubSheet &dst, - SubSheetId &idIt) noexcept; - ox::Error convert(keel::Context&, TileSheetV3 &src, TileSheetV4 &dst) const noexcept final; -}; +ox::Error convertTileSheetV3ToTileSheetV4(keel::Context&, TileSheetV3 &src, TileSheetV4 &dst) noexcept; -class TileSheetV4ToTileSheetV5Converter final: public keel::Converter { - static void convertSubsheet( - int bpp, - TileSheetV4::SubSheet &src, - TileSheetV5::SubSheet &dst) noexcept; - ox::Error convert(keel::Context&, TileSheetV4 &src, TileSheetV5 &dst) const noexcept override; -}; +ox::Error convertTileSheetV4ToTileSheetV5(keel::Context&, TileSheetV4 &src, TileSheetV5 &dst) noexcept; -class TileSheetToCompactTileSheetConverter: public keel::Converter { - ox::Error convert(keel::Context&, TileSheet &src, CompactTileSheet &dst) const noexcept final; -}; +ox::Error convertTileSheetToCompactTileSheet(keel::Context&, TileSheet &src, CompactTileSheet &dst) noexcept; } diff --git a/src/nostalgia/modules/gfx/src/studio/tilesheeteditor/tilesheeteditor-imgui.cpp b/src/nostalgia/modules/gfx/src/studio/tilesheeteditor/tilesheeteditor-imgui.cpp index de2e5984..6524b47c 100644 --- a/src/nostalgia/modules/gfx/src/studio/tilesheeteditor/tilesheeteditor-imgui.cpp +++ b/src/nostalgia/modules/gfx/src/studio/tilesheeteditor/tilesheeteditor-imgui.cpp @@ -414,7 +414,7 @@ ox::Error TileSheetEditorImGui::exportSubsheetToPng(int const scale) const noexc static_cast(width * scale), static_cast(height * scale)); if (err) { - oxErrorf("Tilesheet export failed: {}", toStr(err)); + oxErrorf("TileSheet export failed: {}", toStr(err)); } return err; } diff --git a/src/nostalgia/modules/sound/src/keel/keelmodule.cpp b/src/nostalgia/modules/sound/src/keel/keelmodule.cpp index c1cb6f6e..c703ec67 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/asset.hpp b/src/olympic/keel/include/keel/asset.hpp index 5b25a2af..dc9f3f57 100644 --- a/src/olympic/keel/include/keel/asset.hpp +++ b/src/olympic/keel/include/keel/asset.hpp @@ -4,7 +4,7 @@ #pragma once -#include +#include #include #include "validation.hpp" diff --git a/src/olympic/keel/include/keel/context.hpp b/src/olympic/keel/include/keel/context.hpp index b128bbf0..73e80876 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 4dab0b28..f0ce8bf6 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 07a238f0..44511143 100644 --- a/src/olympic/keel/include/keel/typeconv.hpp +++ b/src/olympic/keel/include/keel/typeconv.hpp @@ -4,15 +4,17 @@ #pragma once +#include #include #include #include #include "asset.hpp" -#include "context.hpp" namespace keel { +class Context; + class Wrap { public: virtual ~Wrap() = default; @@ -113,7 +115,7 @@ class BaseConverter { virtual ox::Result> convertPtrToPtr(keel::Context &ctx, Wrap &src) const noexcept = 0; virtual ox::Result> convertBuffToPtr( - keel::Context &ctx, ox::BufferView const&srcBuff) const noexcept = 0; + Context &ctx, ox::BufferView const&srcBuff) const noexcept = 0; [[nodiscard]] constexpr bool matches( @@ -125,21 +127,37 @@ class BaseConverter { }; -template -class Converter: public BaseConverter { + +template +class ConverterFunc final: public BaseConverter { + private: + template + struct ParamPack { + using Src = SrcType; + using Dst = DstType; + }; + + template + static ParamPack extractParams(ox::Error (*)(Context&, Src&, Dst&)) { + return {}; + } + public: + using SrcType = typename decltype(extractParams(Func))::Src; + using DstType = typename decltype(extractParams(Func))::Dst; + [[nodiscard]] - constexpr ox::StringView srcTypeName() const noexcept final { + constexpr ox::StringView srcTypeName() const noexcept override { return ox::ModelTypeName_v; } [[nodiscard]] - constexpr int srcTypeVersion() const noexcept final { + constexpr int srcTypeVersion() const noexcept override { return ox::ModelTypeVersion_v; } [[nodiscard]] - constexpr bool srcMatches(ox::StringViewCR pSrcTypeName, int pSrcTypeVersion) const noexcept final { + constexpr bool srcMatches(ox::StringViewCR pSrcTypeName, int pSrcTypeVersion) const noexcept override { constexpr auto SrcTypeName = ox::requireModelTypeName(); constexpr auto SrcTypeVersion = ox::requireModelTypeVersion(); return pSrcTypeName == SrcTypeName @@ -147,7 +165,7 @@ class Converter: public BaseConverter { } [[nodiscard]] - constexpr bool dstMatches(ox::StringViewCR dstTypeName, int dstTypeVersion) const noexcept final { + constexpr bool dstMatches(ox::StringViewCR dstTypeName, int dstTypeVersion) const noexcept override { constexpr auto DstTypeName = ox::StringView{ox::requireModelTypeName()}; constexpr auto DstTypeVersion = ox::requireModelTypeVersion(); return dstTypeName == DstTypeName @@ -155,14 +173,14 @@ class Converter: public BaseConverter { } ox::Result> convertPtrToPtr( - keel::Context &ctx, Wrap &src) const noexcept final { + Context &ctx, Wrap &src) const noexcept override { 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 { + Context &ctx, ox::BufferView const&srcBuff) const noexcept override { OX_REQUIRE_M(src, readAsset(srcBuff)); ox::Result> dst{makeWrap()}; OX_RETURN_ERROR(convert(ctx, src, wrapCast(*dst.value))); @@ -170,24 +188,48 @@ class Converter: public BaseConverter { } protected: - virtual ox::Error convert(keel::Context &ctx, SrcType&, DstType&) const noexcept = 0; + static ox::Error convert(Context &ctx, SrcType &src, DstType &dst) noexcept { + return Func(ctx, src, dst); + } }; +class Converter { + private: + ox::AllocAlias m_buff{}; + BaseConverter *m_conv{}; + public: + template + static Converter make() noexcept { + Converter out; + static_assert(sizeof(ConverterFunc) <= sizeof(out.m_buff)); + out.m_conv = new (out.m_buff.data()) ConverterFunc{}; + return out; + } + constexpr Converter() {} + Converter(Converter const &other) noexcept: + 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 { @@ -196,7 +238,7 @@ ox::Result> convert( } ox::Result> convert( - keel::Context &ctx, + Context &ctx, auto const&src, ox::StringViewCR dstTypeName, int const dstTypeVersion) noexcept { @@ -207,27 +249,27 @@ 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)); } template -ox::Result convert(keel::Context &ctx, ox::BufferView const&src) noexcept { +ox::Result convert(Context &ctx, ox::BufferView const&src) noexcept { OX_REQUIRE(out, convert(ctx, src, ox::ModelTypeName_v, ox::ModelTypeVersion_v)); return std::move(wrapCast(out)); } template -ox::Error convert(keel::Context &ctx, ox::BufferView const&buff, DstType &outObj) noexcept { +ox::Error convert(Context &ctx, ox::BufferView const&buff, DstType &outObj) noexcept { OX_REQUIRE(out, convert(ctx, buff, ox::ModelTypeName_v, ox::ModelTypeVersion_v)); outObj = std::move(wrapCast(*out)); return {}; } template -ox::Error convertObjToObj(keel::Context &ctx, auto &src, DstType &outObj) noexcept { +ox::Error convertObjToObj(Context &ctx, auto &src, DstType &outObj) noexcept { OX_REQUIRE(outPtr, convert(ctx, src, ox::ModelTypeName_v, ox::ModelTypeVersion_v)); outObj = std::move(wrapCast(*outPtr)); return {}; @@ -235,13 +277,13 @@ ox::Error convertObjToObj(keel::Context &ctx, auto &src, DstType &outObj) noexce template ox::Result convertBuffToBuff( - keel::Context &ctx, ox::BufferView const&src, ox::ClawFormat const fmt) noexcept { + Context &ctx, ox::BufferView const&src, ox::ClawFormat const fmt) noexcept { OX_REQUIRE(out, convert(ctx, src, ox::ModelTypeName_v, ox::ModelTypeVersion_v)); return ox::writeClaw(wrapCast(*out), fmt); } template -ox::Result transformRule(keel::Context &ctx, ox::Buffer &buff, ox::StringViewCR typeId) noexcept { +ox::Result transformRule(Context &ctx, ox::Buffer &buff, ox::StringViewCR typeId) noexcept { if (typeId == ox::ModelTypeId_v) { OX_RETURN_ERROR(keel::convertBuffToBuff(ctx, buff, fmt).moveTo(buff)); return true; @@ -249,4 +291,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 7a0357ae..38ba4ec7 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 531e7370..cb96f957 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"};