From 5627a6357219246db3b23ca420360d3c8a77faa5 Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Wed, 20 Mar 2024 21:37:42 -0500 Subject: [PATCH] Squashed 'deps/nostalgia/' changes from 04f3d6b4..6a523191 6a523191 [turbine] Cleanup applicationData 205f2a69 [turbine] Fix applicationData to properly return null 82f02896 [turbine] Cleanup type safety code for application data aa43cb3d [turbine] Add some type safety to application data 05d08a76 Merge commit 'd6403991d49292d4f2b7d441636949472ca2b249' c6750d50 [studio/modlib] Add ig::ChildStackItem dade484d [olympic/studio] Make StudioContext::ui a ref instead of ptr b015fe88 [ox/std] Make ranges predicates const refs git-subtree-dir: deps/nostalgia git-subtree-split: 6a523191561cf76db3d734e42199aaae0af7d21b --- deps/ox/src/ox/std/ranges.hpp | 4 +- src/olympic/studio/applib/src/main.cpp | 9 +-- .../studio/applib/src/projectexplorer.cpp | 7 +- src/olympic/studio/applib/src/studioapp.cpp | 7 +- src/olympic/studio/applib/src/studioapp.hpp | 4 +- .../studio/modlib/include/studio/context.hpp | 7 +- .../modlib/include/studio/imguiutil.hpp | 8 ++- src/olympic/studio/modlib/src/imguiutil.cpp | 8 +++ .../turbine/include/turbine/context.hpp | 69 ++++++++++++++++++- src/olympic/turbine/src/gba/context.cpp | 6 +- src/olympic/turbine/src/gba/context.hpp | 2 +- src/olympic/turbine/src/glfw/context.cpp | 6 +- src/olympic/turbine/src/glfw/context.hpp | 2 +- 13 files changed, 110 insertions(+), 29 deletions(-) diff --git a/deps/ox/src/ox/std/ranges.hpp b/deps/ox/src/ox/std/ranges.hpp index dfab656..1f2fc26 100644 --- a/deps/ox/src/ox/std/ranges.hpp +++ b/deps/ox/src/ox/std/ranges.hpp @@ -11,7 +11,7 @@ namespace ox { [[nodiscard]] -constexpr bool all_of(auto begin, auto end, auto pred) noexcept { +constexpr bool all_of(auto begin, auto end, auto const&pred) noexcept { while (begin != end) { if (!pred(*begin)) { return false; @@ -22,7 +22,7 @@ constexpr bool all_of(auto begin, auto end, auto pred) noexcept { } [[nodiscard]] -constexpr bool any_of(auto begin, auto end, auto pred) noexcept { +constexpr bool any_of(auto begin, auto end, auto const&pred) noexcept { while (begin != end) { if (pred(*begin)) { return true; diff --git a/src/olympic/studio/applib/src/main.cpp b/src/olympic/studio/applib/src/main.cpp index fd4bb60..8548220 100644 --- a/src/olympic/studio/applib/src/main.cpp +++ b/src/olympic/studio/applib/src/main.cpp @@ -30,13 +30,13 @@ class StudioUIDrawer: public turbine::gl::Drawer { static int updateHandler(turbine::Context &ctx) noexcept { auto sctx = turbine::applicationData(ctx); - sctx->ui->update(); + sctx->ui.update(); return 16; } static void keyEventHandler(turbine::Context &ctx, turbine::Key key, bool down) noexcept { auto sctx = turbine::applicationData(ctx); - sctx->ui->handleKeyEvent(key, down); + sctx->ui.handleKeyEvent(key, down); } static ox::Error runApp( @@ -48,10 +48,7 @@ static ox::Error runApp( turbine::setUpdateHandler(*ctx, updateHandler); turbine::setKeyEventHandler(*ctx, keyEventHandler); turbine::setConstantRefresh(*ctx, false); - studio::StudioContext studioCtx(*ctx); - turbine::setApplicationData(*ctx, &studioCtx); - StudioUI ui(studioCtx, projectDataDir); - studioCtx.ui = &ui; + StudioUI ui(*ctx, projectDataDir); StudioUIDrawer drawer(ui); turbine::gl::addDrawer(*ctx, &drawer); auto const err = turbine::run(*ctx); diff --git a/src/olympic/studio/applib/src/projectexplorer.cpp b/src/olympic/studio/applib/src/projectexplorer.cpp index 2ff1a2d..3cc779e 100644 --- a/src/olympic/studio/applib/src/projectexplorer.cpp +++ b/src/olympic/studio/applib/src/projectexplorer.cpp @@ -10,8 +10,11 @@ namespace studio { -static ox::Result> -buildProjectTreeModel(ProjectExplorer &explorer, ox::StringView name, ox::CRStringView path, ProjectTreeModel *parent) noexcept { +static ox::Result> buildProjectTreeModel( + ProjectExplorer &explorer, + ox::StringView name, + ox::StringView path, + ProjectTreeModel *parent) noexcept { auto const fs = explorer.romFs(); oxRequire(stat, fs->stat(path)); auto out = ox::make_unique(explorer, ox::String(name), parent); diff --git a/src/olympic/studio/applib/src/studioapp.cpp b/src/olympic/studio/applib/src/studioapp.cpp index 984be43..790e994 100644 --- a/src/olympic/studio/applib/src/studioapp.cpp +++ b/src/olympic/studio/applib/src/studioapp.cpp @@ -40,13 +40,14 @@ oxModelBegin(StudioConfig) oxModelFieldRename(showProjectExplorer, show_project_explorer) oxModelEnd() -StudioUI::StudioUI(studio::StudioContext &ctx, ox::StringView projectDataDir) noexcept: - m_sctx(ctx), - m_ctx(ctx.tctx), +StudioUI::StudioUI(turbine::Context &ctx, ox::StringView projectDataDir) noexcept: + m_sctx(*this, ctx), + m_ctx(ctx), m_projectDataDir(projectDataDir), m_projectExplorer(m_ctx), m_newProject(ox::String(projectDataDir)), m_aboutPopup(m_ctx) { + turbine::setApplicationData(m_ctx, &m_sctx); m_projectExplorer.fileChosen.connect(this, &StudioUI::openFile); m_newProject.finished.connect(this, &StudioUI::createOpenProject); m_newMenu.finished.connect(this, &StudioUI::openFile); diff --git a/src/olympic/studio/applib/src/studioapp.hpp b/src/olympic/studio/applib/src/studioapp.hpp index 25d3c74..74e24a7 100644 --- a/src/olympic/studio/applib/src/studioapp.hpp +++ b/src/olympic/studio/applib/src/studioapp.hpp @@ -24,7 +24,7 @@ class StudioUI: public ox::SignalHandler { friend class StudioUIDrawer; private: - studio::StudioContext &m_sctx; + studio::StudioContext m_sctx; turbine::Context &m_ctx; ox::String m_projectDataDir; ox::UPtr m_project; @@ -48,7 +48,7 @@ class StudioUI: public ox::SignalHandler { bool m_showProjectExplorer = true; public: - explicit StudioUI(studio::StudioContext &ctx, ox::StringView projectDataDir) noexcept; + explicit StudioUI(turbine::Context &ctx, ox::StringView projectDataDir) noexcept; void update() noexcept; diff --git a/src/olympic/studio/modlib/include/studio/context.hpp b/src/olympic/studio/modlib/include/studio/context.hpp index c7101ba..de15c8c 100644 --- a/src/olympic/studio/modlib/include/studio/context.hpp +++ b/src/olympic/studio/modlib/include/studio/context.hpp @@ -12,11 +12,14 @@ namespace studio { +class StudioUI; + struct StudioContext { - class StudioUI *ui = nullptr; + StudioUI &ui; Project *project = nullptr; turbine::Context &tctx; - inline explicit StudioContext(turbine::Context &pTctx) noexcept: tctx(pTctx) {} + inline StudioContext(StudioUI &pUi, turbine::Context &pTctx) noexcept: + ui(pUi), tctx(pTctx) {} }; } diff --git a/src/olympic/studio/modlib/include/studio/imguiutil.hpp b/src/olympic/studio/modlib/include/studio/imguiutil.hpp index 312ea0f..aff6db8 100644 --- a/src/olympic/studio/modlib/include/studio/imguiutil.hpp +++ b/src/olympic/studio/modlib/include/studio/imguiutil.hpp @@ -15,6 +15,12 @@ namespace studio::ig { inline constexpr auto BtnSz = ImVec2{52, 22}; +class ChildStackItem { + public: + explicit ChildStackItem(ox::CStringView id, ImVec2 const&sz = {}) noexcept; + ~ChildStackItem() noexcept; +}; + class IDStackItem { public: explicit IDStackItem(int id) noexcept; @@ -98,4 +104,4 @@ class FilePicker { }; -} \ No newline at end of file +} diff --git a/src/olympic/studio/modlib/src/imguiutil.cpp b/src/olympic/studio/modlib/src/imguiutil.cpp index 5b1765c..a90f7c2 100644 --- a/src/olympic/studio/modlib/src/imguiutil.cpp +++ b/src/olympic/studio/modlib/src/imguiutil.cpp @@ -10,6 +10,14 @@ namespace studio::ig { +ChildStackItem::ChildStackItem(ox::CStringView id, ImVec2 const&sz) noexcept { + ImGui::BeginChild(id.c_str(), sz); +} + +ChildStackItem::~ChildStackItem() noexcept { + ImGui::EndChild(); +} + IDStackItem::IDStackItem(int id) noexcept { ImGui::PushID(id); } diff --git a/src/olympic/turbine/include/turbine/context.hpp b/src/olympic/turbine/include/turbine/context.hpp index 557e7b9..45cc5d0 100644 --- a/src/olympic/turbine/include/turbine/context.hpp +++ b/src/olympic/turbine/include/turbine/context.hpp @@ -37,15 +37,78 @@ inline ox::FileSystem *rom(Context &ctx) noexcept { return keelCtx(ctx).rom.get(); } -void setApplicationData(Context &ctx, void *applicationData) noexcept; +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; + +template +void setApplicationData(Context &ctx, T *applicationData) noexcept { + Wrap w(applicationData); + setApplicationDataRaw(ctx, w); +} [[nodiscard]] -void *applicationDataRaw(Context &ctx) noexcept; +WrapBase *applicationDataRaw(Context &ctx) noexcept; template [[nodiscard]] T *applicationData(Context &ctx) noexcept { - return static_cast(applicationDataRaw(ctx)); + 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; } 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 c1ce23c..5b5f133 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 setApplicationData(Context &ctx, void *applicationData) noexcept { +void setApplicationDataRaw(Context &ctx, WrapBase &applicationData) noexcept { ctx.applicationData = applicationData; } -void *applicationDataRaw(Context &ctx) noexcept { - return ctx.applicationData; +WrapBase *applicationDataRaw(Context &ctx) noexcept { + return ctx.applicationData.getWrapBase(); } } diff --git a/src/olympic/turbine/src/gba/context.hpp b/src/olympic/turbine/src/gba/context.hpp index 64a1caa..02b0520 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; - void *applicationData = nullptr; + WrapPtr 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 ded5388..30db318 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 setApplicationData(Context &ctx, void *applicationData) noexcept { +void setApplicationDataRaw(Context &ctx, WrapBase &applicationData) noexcept { ctx.applicationData = applicationData; } -void *applicationDataRaw(Context &ctx) noexcept { - return ctx.applicationData; +WrapBase *applicationDataRaw(Context &ctx) noexcept { + return ctx.applicationData.getWrapBase(); } } diff --git a/src/olympic/turbine/src/glfw/context.hpp b/src/olympic/turbine/src/glfw/context.hpp index 6075cf8..21d420e 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; - void *applicationData = nullptr; + WrapPtr applicationData; // GLFW impl data //////////////////////////////////////////////////////// int uninterruptedRefreshes = 3;