Merge commit 'c0baf7efca0e4c3a86a018ad2564d9df7b07c133'
This commit is contained in:
@ -37,82 +37,25 @@ inline ox::FileSystem *rom(Context &ctx) noexcept {
|
||||
return keelCtx(ctx).rom.get();
|
||||
}
|
||||
|
||||
struct WrapBase {
|
||||
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;
|
||||
void setApplicationDataRaw(Context &ctx, ox::AnyPtr const&applicationData) noexcept;
|
||||
|
||||
template<typename T>
|
||||
void setApplicationData(Context &ctx, T *applicationData) noexcept {
|
||||
Wrap w(applicationData);
|
||||
setApplicationDataRaw(ctx, w);
|
||||
setApplicationDataRaw(ctx, applicationData);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
WrapBase *applicationDataRaw(Context &ctx) noexcept;
|
||||
ox::AnyPtr const&applicationDataRaw(Context &ctx) noexcept;
|
||||
|
||||
template<typename T>
|
||||
[[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<Wrap<T>*>(raw);
|
||||
#else
|
||||
auto const out = dynamic_cast<Wrap<T>*>(raw);
|
||||
#endif
|
||||
oxAssert(out, "Cast failed - wrong type");
|
||||
return out->data;
|
||||
return applicationDataRaw(ctx).get<T>();
|
||||
}
|
||||
|
||||
void setKeyEventHandler(Context &ctx, KeyEventHandler h) noexcept;
|
||||
|
||||
[[nodiscard]]
|
||||
KeyEventHandler keyEventHandler(Context &ctx) noexcept;
|
||||
|
||||
}
|
||||
|
@ -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 const&applicationDataRaw(Context &ctx) noexcept {
|
||||
return ctx.applicationData;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -43,8 +43,8 @@ static ox::Result<std::size_t> findPreloadSection() noexcept {
|
||||
// media section
|
||||
constexpr auto headerP2 = "DER_____________";
|
||||
constexpr auto headerP1 = "KEEL_PRELOAD_HEA";
|
||||
constexpr auto headerP1Len = ox_strlen(headerP2);
|
||||
constexpr auto headerP2Len = ox_strlen(headerP1);
|
||||
constexpr auto headerP1Len = ox::strlen(headerP2);
|
||||
constexpr auto headerP2Len = ox::strlen(headerP1);
|
||||
constexpr auto headerLen = headerP1Len + headerP2Len;
|
||||
for (auto current = MEM_ROM; current < reinterpret_cast<char*>(0x0a000000); current += headerLen) {
|
||||
if (memcmp(current, headerP1, headerP1Len) == 0 &&
|
||||
|
@ -18,7 +18,7 @@ ox::String getClipboardText(Context &ctx) noexcept {
|
||||
|
||||
void setClipboardText(Context &ctx, ox::CRStringView text) noexcept {
|
||||
auto cstr = ox_malloca(text.bytes() + 1, char);
|
||||
ox_strncpy(cstr.get(), text.data(), text.bytes());
|
||||
ox::strncpy(cstr.get(), text.data(), text.bytes());
|
||||
glfwSetClipboardString(ctx.window, cstr.get());
|
||||
}
|
||||
|
||||
|
@ -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 const&applicationDataRaw(Context &ctx) noexcept {
|
||||
return ctx.applicationData;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -221,7 +221,7 @@ ox::Error initGfx(Context &ctx) noexcept {
|
||||
|
||||
void setWindowTitle(Context &ctx, ox::CRStringView title) noexcept {
|
||||
auto cstr = ox_malloca(title.bytes() + 1, char);
|
||||
ox_strncpy(cstr.get(), title.data(), title.bytes());
|
||||
ox::strncpy(cstr.get(), title.data(), title.bytes());
|
||||
glfwSetWindowTitle(ctx.window, cstr.get());
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user