#pragma once #include #include #include #include #include #include #include namespace hex { class SharedData; } namespace hex::plugin::internal { void initializePlugin(SharedData &sharedData); } namespace hex { namespace prv { class Provider; } class SharedData { SharedData() = default; public: SharedData(const SharedData&) = delete; SharedData(SharedData&&) = delete; static auto& get() { static SharedData instance; return instance; } friend void hex::plugin::internal::initializePlugin(SharedData &sharedData); friend class Window; template T& getVariable(std::string variableName) { return std::any_cast((*this->sharedVariables)[variableName]); } template void setVariable(std::string variableName, T value) { (*this->sharedVariables)[variableName] = value; } private: void initializeData() { static std::vector eventHandlersStorage; static std::vector> deferredCallsStorage; static prv::Provider *currentProviderStorage; static std::map> settingsEntriesStorage; static std::map sharedVariablesStorage; static ImVec2 windowPosStorage, windowSizeStorage; static nlohmann::json settingsJsonStorage; this->imguiContext = ImGui::GetCurrentContext(); this->eventHandlers = &eventHandlersStorage; this->deferredCalls = &deferredCallsStorage; this->currentProvider = ¤tProviderStorage; this->settingsEntries = &settingsEntriesStorage; this->sharedVariables = &sharedVariablesStorage; this->settingsJson = &settingsJsonStorage; this->windowPos = &windowPosStorage; this->windowSize = &windowSizeStorage; } void initializeData(const SharedData &other) { this->imguiContext = other.imguiContext; this->eventHandlers = other.eventHandlers; this->deferredCalls = other.deferredCalls; this->currentProvider = other.currentProvider; this->settingsEntries = other.settingsEntries; this->sharedVariables = other.sharedVariables; this->settingsJson = other.settingsJson; this->windowPos = other.windowPos; this->windowSize = other.windowSize; } public: ImGuiContext *imguiContext; std::vector *eventHandlers; std::vector> *deferredCalls; prv::Provider **currentProvider; std::map> *settingsEntries; nlohmann::json *settingsJson; ImVec2 *windowPos; ImVec2 *windowSize; private: std::map *sharedVariables; }; }