#pragma once #include #include #include #include template class ConfigStorage { public: using ChangeListener = std::function; using Settings = SettingsType; ConfigStorage() : mStorage(std::make_shared()) { } void set(std::shared_ptr settings) { std::lock_guard lock { mMutex }; mStorage = settings; for (auto &listener : mListeners) { listener(*settings); } } std::shared_ptr get() { std::lock_guard lock { mMutex }; return mStorage; } void addListener(ChangeListener listener) { std::lock_guard lock { mMutex }; mListeners.emplace_back(std::move(listener)); } private: std::mutex mMutex; std::shared_ptr mStorage; std::vector mListeners; };