#pragma once #include #include #include #include #include #include namespace hex { template class PerProvider { public: PerProvider() { this->onCreate(); } PerProvider(const PerProvider&) = delete; PerProvider(PerProvider&&) = delete; PerProvider& operator=(const PerProvider&) = delete; PerProvider& operator=(PerProvider&&) = delete; PerProvider(T data) : m_data({ { ImHexApi::Provider::get(), std::move(data) } }) { this->onCreate(); } ~PerProvider() = default; T* operator->() { return &this->get(); } const T* operator->() const { return &this->get(); } T& get(prv::Provider *provider = ImHexApi::Provider::get()) { return this->m_data[provider]; } const T& get(prv::Provider *provider = ImHexApi::Provider::get()) const { return this->m_data[provider]; } T& operator*() { return this->get(); } const T& operator*() const { return this->get(); } PerProvider& operator=(T data) { this->m_data = std::move(data); return *this; } operator T&() { return this->get(); } private: void onCreate() { (void)EventManager::subscribe([this](prv::Provider *provider) { this->m_data.emplace(provider, T()); }); (void)EventManager::subscribe([this](prv::Provider *provider){ this->m_data.erase(provider); }); EventManager::subscribe([this] { this->m_data.clear(); }); } private: std::map m_data; }; }