diff --git a/src/olympic/turbine/include/turbine/context.hpp b/src/olympic/turbine/include/turbine/context.hpp index 45cc5d0d..8f84e765 100644 --- a/src/olympic/turbine/include/turbine/context.hpp +++ b/src/olympic/turbine/include/turbine/context.hpp @@ -37,78 +37,21 @@ inline ox::FileSystem *rom(Context &ctx) noexcept { return keelCtx(ctx).rom.get(); } -struct WrapBase { - virtual ~WrapBase() = default; - virtual WrapBase *copyTo(ox::Span s) noexcept = 0; - virtual operator bool() const noexcept = 0; -}; - -template -struct Wrap: public WrapBase { - T *data{}; - Wrap(T *pData) noexcept: data(pData) { - } - WrapBase *copyTo(ox::Span s) noexcept override { - oxAssert(s.size() >= sizeof(Wrap), "too small buffer"); - return new(s.data()) Wrap{data}; - } - operator bool() const noexcept override { - return data != nullptr; - } -}; - -class WrapPtr { - private: - WrapBase *m_wrapPtr{}; - ox::Array)> m_wrapData; - public: - template - inline WrapPtr &operator=(T *ptr) noexcept { - m_wrapPtr = new(m_wrapData.data()) Wrap(ptr); - return *this; - } - inline WrapPtr &operator=(WrapBase &ptr) noexcept { - if (ptr) { - m_wrapPtr = ptr.copyTo(m_wrapData); - } else { - m_wrapPtr = nullptr; - } - return *this; - } - inline operator bool() const noexcept { - return m_wrapPtr && *m_wrapPtr; - } - [[nodiscard]] - inline WrapBase *getWrapBase() const noexcept { - return m_wrapPtr; - } -}; - -void setApplicationDataRaw(Context &ctx, WrapBase &applicationData) noexcept; +void setApplicationDataRaw(Context &ctx, ox::AnyPtr const&applicationData) noexcept; template void setApplicationData(Context &ctx, T *applicationData) noexcept { - Wrap w(applicationData); - setApplicationDataRaw(ctx, w); + setApplicationDataRaw(ctx, applicationData); } [[nodiscard]] -WrapBase *applicationDataRaw(Context &ctx) noexcept; +ox::AnyPtr &applicationDataRaw(Context &ctx) noexcept; template [[nodiscard]] T *applicationData(Context &ctx) noexcept { - auto const raw = applicationDataRaw(ctx); - if (!raw) [[unlikely]] { - return nullptr; - } -#ifdef OX_BARE_METAL - auto const out = static_cast*>(raw); -#else - auto const out = dynamic_cast*>(raw); -#endif - oxAssert(out, "Cast failed - wrong type"); - return out->data; + auto const ptr = applicationDataRaw(ctx); + return ptr.get(); } void setKeyEventHandler(Context &ctx, KeyEventHandler h) noexcept; diff --git a/src/olympic/turbine/src/gba/context.cpp b/src/olympic/turbine/src/gba/context.cpp index 5b5f1330..389e04c2 100644 --- a/src/olympic/turbine/src/gba/context.cpp +++ b/src/olympic/turbine/src/gba/context.cpp @@ -18,12 +18,12 @@ keel::Context &keelCtx(Context &ctx) noexcept { return ctx.keelCtx; } -void setApplicationDataRaw(Context &ctx, WrapBase &applicationData) noexcept { +void setApplicationDataRaw(Context &ctx, ox::AnyPtr const&applicationData) noexcept { ctx.applicationData = applicationData; } -WrapBase *applicationDataRaw(Context &ctx) noexcept { - return ctx.applicationData.getWrapBase(); +ox::AnyPtr &applicationDataRaw(Context &ctx) noexcept { + return ctx.applicationData; } } diff --git a/src/olympic/turbine/src/gba/context.hpp b/src/olympic/turbine/src/gba/context.hpp index 02b05209..36d0fc10 100644 --- a/src/olympic/turbine/src/gba/context.hpp +++ b/src/olympic/turbine/src/gba/context.hpp @@ -17,7 +17,7 @@ class Context { UpdateHandler updateHandler = [](Context&) -> int {return 0;}; keel::Context keelCtx; KeyEventHandler keyEventHandler = nullptr; - WrapPtr applicationData; + ox::AnyPtr applicationData; // GBA impl data ///////////////////////////////////////////////////////// bool running = true; diff --git a/src/olympic/turbine/src/glfw/context.cpp b/src/olympic/turbine/src/glfw/context.cpp index 30db3183..73775482 100644 --- a/src/olympic/turbine/src/glfw/context.cpp +++ b/src/olympic/turbine/src/glfw/context.cpp @@ -20,12 +20,12 @@ keel::Context &keelCtx(Context &ctx) noexcept { return ctx.keelCtx; } -void setApplicationDataRaw(Context &ctx, WrapBase &applicationData) noexcept { +void setApplicationDataRaw(Context &ctx, ox::AnyPtr const&applicationData) noexcept { ctx.applicationData = applicationData; } -WrapBase *applicationDataRaw(Context &ctx) noexcept { - return ctx.applicationData.getWrapBase(); +ox::AnyPtr &applicationDataRaw(Context &ctx) noexcept { + return ctx.applicationData; } } diff --git a/src/olympic/turbine/src/glfw/context.hpp b/src/olympic/turbine/src/glfw/context.hpp index 21d420ec..6a08a7db 100644 --- a/src/olympic/turbine/src/glfw/context.hpp +++ b/src/olympic/turbine/src/glfw/context.hpp @@ -16,7 +16,7 @@ class Context { UpdateHandler updateHandler = [](Context&) -> int {return 0;}; keel::Context keelCtx; KeyEventHandler keyEventHandler = nullptr; - WrapPtr applicationData; + ox::AnyPtr applicationData; // GLFW impl data //////////////////////////////////////////////////////// int uninterruptedRefreshes = 3;