#pragma once #include namespace utils::concurrency { template class container { public: template R access(F&& accessor) const { std::lock_guard _{mutex_}; return accessor(object_); } template R access(F&& accessor) { std::lock_guard _{mutex_}; return accessor(object_); } template R access_with_lock(F&& accessor) const { std::unique_lock lock{mutex_}; return accessor(object_, lock); } template R access_with_lock(F&& accessor) { std::unique_lock lock{mutex_}; return accessor(object_, lock); } T& get_raw() { return object_; } const T& get_raw() const { return object_; } T copy() const { std::unique_lock lock{mutex_}; return object_; } std::unique_lock acquire_lock() { return std::unique_lock{mutex_}; } private: mutable MutexType mutex_{}; T object_{}; }; }