diff --git a/libs/util/include/psemek/util/mutexed.hpp b/libs/util/include/psemek/util/mutexed.hpp new file mode 100644 index 00000000..9427518e --- /dev/null +++ b/libs/util/include/psemek/util/mutexed.hpp @@ -0,0 +1,53 @@ +#pragma once + +#include +#include + +namespace psemek::util +{ + + template + struct mutexed + { + mutexed() = default; + + mutexed(mutexed const &) = delete; + mutexed(mutexed &&) = delete; + + mutexed & operator = (mutexed const &) = delete; + mutexed & operator = (mutexed &&) = delete; + + mutexed(T && value) + : value_(std::move(value)) + {} + + template + mutexed(std::in_place_t, Args && ... args) + : value_(std::forward(args)...) + {} + + T load() const + { + std::lock_guard lock{mutex_}; + return value_; + } + + void store(T && new_value) + { + std::lock_guard lock{mutex_}; + value_ = std::move(new_value); + } + + T exchange(T && new_value) const + { + std::lock_guard lock{mutex_}; + std::swap(value_, new_value); + return new_value; + } + + private: + T value_; + mutable Mutex mutex_; + }; + +}