66 template <
typename... Arg>
67 Variable(Arg&&... arg)
68 : data_(std::forward<Arg>(arg)...)
71 LockedPtr<std::unique_lock<Mutex>, Data> UniqueLock() {
return {mutex_, data_}; }
73 LockedPtr<std::unique_lock<Mutex>,
const Data> UniqueLock()
const {
return {mutex_, data_}; }
75 std::optional<LockedPtr<std::unique_lock<Mutex>,
const Data>> UniqueLock(std::try_to_lock_t)
const {
76 return DoUniqueLock(*
this, std::try_to_lock);
79 std::optional<LockedPtr<std::unique_lock<Mutex>, Data>> UniqueLock(std::try_to_lock_t) {
80 return DoUniqueLock(*
this, std::try_to_lock);
83 std::optional<LockedPtr<std::unique_lock<Mutex>,
const Data>> UniqueLock(std::chrono::milliseconds try_duration
85 return DoUniqueLock(*
this, try_duration);
88 std::optional<LockedPtr<std::unique_lock<Mutex>, Data>> UniqueLock(std::chrono::milliseconds try_duration) {
89 return DoUniqueLock(*
this, try_duration);
92 LockedPtr<std::shared_lock<Mutex>,
const Data> SharedLock()
const {
return {mutex_, data_}; }
98 LockedPtr<std::lock_guard<Mutex>, Data> Lock() {
return {mutex_, data_}; }
100 LockedPtr<std::lock_guard<Mutex>,
const Data> Lock()
const {
return {mutex_, data_}; }
112 const Data& GetDataUnsafe()
const {
return data_; }
115 mutable Mutex mutex_;
122 template <
typename VariableType,
typename... StdUniqueLockArgs>
123 static auto DoUniqueLock(VariableType& concurrent_variable, StdUniqueLockArgs&&... args) {
124 std::unique_lock<Mutex> lock(concurrent_variable.mutex_, std::forward<StdUniqueLockArgs>(args)...);
125 return lock ? std::optional{LockedPtr{std::move(lock), concurrent_variable.data_}} : std::nullopt;