[turbine] Replace WrapPtr with ox::AnyPtr
All checks were successful
Build / build (push) Successful in 2m33s

This commit is contained in:
Gary Talent 2024-03-23 16:53:04 -05:00
parent 3fa247e3d4
commit 1616ca7018
5 changed files with 13 additions and 70 deletions

View File

@ -37,78 +37,21 @@ inline ox::FileSystem *rom(Context &ctx) noexcept {
return keelCtx(ctx).rom.get(); return keelCtx(ctx).rom.get();
} }
struct WrapBase { void setApplicationDataRaw(Context &ctx, ox::AnyPtr const&applicationData) noexcept;
virtual ~WrapBase() = default;
virtual WrapBase *copyTo(ox::Span<char> s) noexcept = 0;
virtual operator bool() const noexcept = 0;
};
template<typename T>
struct Wrap: public WrapBase {
T *data{};
Wrap(T *pData) noexcept: data(pData) {
}
WrapBase *copyTo(ox::Span<char> 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<char, sizeof(Wrap<void*>)> m_wrapData;
public:
template<typename T>
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;
template<typename T> template<typename T>
void setApplicationData(Context &ctx, T *applicationData) noexcept { void setApplicationData(Context &ctx, T *applicationData) noexcept {
Wrap w(applicationData); setApplicationDataRaw(ctx, applicationData);
setApplicationDataRaw(ctx, w);
} }
[[nodiscard]] [[nodiscard]]
WrapBase *applicationDataRaw(Context &ctx) noexcept; ox::AnyPtr &applicationDataRaw(Context &ctx) noexcept;
template<typename T> template<typename T>
[[nodiscard]] [[nodiscard]]
T *applicationData(Context &ctx) noexcept { T *applicationData(Context &ctx) noexcept {
auto const raw = applicationDataRaw(ctx); auto const ptr = applicationDataRaw(ctx);
if (!raw) [[unlikely]] { return ptr.get<T>();
return nullptr;
}
#ifdef OX_BARE_METAL
auto const out = static_cast<Wrap<T>*>(raw);
#else
auto const out = dynamic_cast<Wrap<T>*>(raw);
#endif
oxAssert(out, "Cast failed - wrong type");
return out->data;
} }
void setKeyEventHandler(Context &ctx, KeyEventHandler h) noexcept; void setKeyEventHandler(Context &ctx, KeyEventHandler h) noexcept;

View File

@ -18,12 +18,12 @@ keel::Context &keelCtx(Context &ctx) noexcept {
return ctx.keelCtx; return ctx.keelCtx;
} }
void setApplicationDataRaw(Context &ctx, WrapBase &applicationData) noexcept { void setApplicationDataRaw(Context &ctx, ox::AnyPtr const&applicationData) noexcept {
ctx.applicationData = applicationData; ctx.applicationData = applicationData;
} }
WrapBase *applicationDataRaw(Context &ctx) noexcept { ox::AnyPtr &applicationDataRaw(Context &ctx) noexcept {
return ctx.applicationData.getWrapBase(); return ctx.applicationData;
} }
} }

View File

@ -17,7 +17,7 @@ class Context {
UpdateHandler updateHandler = [](Context&) -> int {return 0;}; UpdateHandler updateHandler = [](Context&) -> int {return 0;};
keel::Context keelCtx; keel::Context keelCtx;
KeyEventHandler keyEventHandler = nullptr; KeyEventHandler keyEventHandler = nullptr;
WrapPtr applicationData; ox::AnyPtr applicationData;
// GBA impl data ///////////////////////////////////////////////////////// // GBA impl data /////////////////////////////////////////////////////////
bool running = true; bool running = true;

View File

@ -20,12 +20,12 @@ keel::Context &keelCtx(Context &ctx) noexcept {
return ctx.keelCtx; return ctx.keelCtx;
} }
void setApplicationDataRaw(Context &ctx, WrapBase &applicationData) noexcept { void setApplicationDataRaw(Context &ctx, ox::AnyPtr const&applicationData) noexcept {
ctx.applicationData = applicationData; ctx.applicationData = applicationData;
} }
WrapBase *applicationDataRaw(Context &ctx) noexcept { ox::AnyPtr &applicationDataRaw(Context &ctx) noexcept {
return ctx.applicationData.getWrapBase(); return ctx.applicationData;
} }
} }

View File

@ -16,7 +16,7 @@ class Context {
UpdateHandler updateHandler = [](Context&) -> int {return 0;}; UpdateHandler updateHandler = [](Context&) -> int {return 0;};
keel::Context keelCtx; keel::Context keelCtx;
KeyEventHandler keyEventHandler = nullptr; KeyEventHandler keyEventHandler = nullptr;
WrapPtr applicationData; ox::AnyPtr applicationData;
// GLFW impl data //////////////////////////////////////////////////////// // GLFW impl data ////////////////////////////////////////////////////////
int uninterruptedRefreshes = 3; int uninterruptedRefreshes = 3;