EyeAI
Loading...
Searching...
No Matches
MutexGuard.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <mutex>
4#include <utility>
5
8template<typename T>
9class MutexGuard {
10 public:
11 explicit MutexGuard(T&& value) noexcept : value(std::move(value)) {}
12
13 template<typename... Args>
14 explicit MutexGuard(Args&&... args) noexcept
15 : value(std::forward<Args...>(args)...) {}
16
17 ~MutexGuard() = default;
18
19 MutexGuard(MutexGuard&&) noexcept = default;
20 MutexGuard(const MutexGuard&) = delete;
21 MutexGuard& operator=(MutexGuard&&) noexcept = default;
22 MutexGuard& operator=(const MutexGuard&) = delete;
23
24 struct ScopedAccess {
25 explicit ScopedAccess(T& value, std::mutex& mutex)
26 : value(value), lock(mutex) {}
27 ~ScopedAccess() = default;
28
29 ScopedAccess(ScopedAccess&&) noexcept = default;
30 ScopedAccess(const ScopedAccess&) = delete;
31 ScopedAccess& operator=(ScopedAccess&&) noexcept = default;
32 ScopedAccess& operator=(const ScopedAccess&) = delete;
33
34 T* operator->() { return &value; }
35 T& operator*() { return value; }
36
37 template<typename Index>
38 auto& operator[](Index&& index) {
39 return value[std::forward<Index>(index)];
40 }
41
42 private:
43 T& value;
44 std::lock_guard<std::mutex> lock;
45 };
46
49 ScopedAccess lock() { return ScopedAccess(value, mutex); }
50
52 explicit ConstScopedAccess(const T& value, std::mutex& mutex)
53 : value(value), lock(mutex) {}
54 ~ConstScopedAccess() = default;
55
56 ConstScopedAccess(ConstScopedAccess&&) noexcept = default;
58 ConstScopedAccess& operator=(ConstScopedAccess&&) noexcept = default;
59 ConstScopedAccess& operator=(const ConstScopedAccess&) = delete;
60
61 const T* operator->() { return &value; }
62 const T& operator*() { return value; }
63
64 template<typename Index>
65 const auto& operator[](Index&& index) {
66 return value[std::forward<Index>(index)];
67 }
68
69 private:
70 const T& value;
71 std::lock_guard<std::mutex> lock;
72 };
73
77 return ConstScopedAccess(value, mutex);
78 }
79
80 private:
81 T value;
82 mutable std::mutex mutex;
83};
MutexGuard(Args &&... args) noexcept
Definition MutexGuard.hpp:14
MutexGuard(MutexGuard &&) noexcept=default
ScopedAccess lock()
Definition MutexGuard.hpp:49
~MutexGuard()=default
MutexGuard(T &&value) noexcept
Definition MutexGuard.hpp:11
ConstScopedAccess const_lock() const
Definition MutexGuard.hpp:76
Definition MutexGuard.hpp:51
ConstScopedAccess(ConstScopedAccess &&) noexcept=default
const auto & operator[](Index &&index)
Definition MutexGuard.hpp:65
ConstScopedAccess(const T &value, std::mutex &mutex)
Definition MutexGuard.hpp:52
const T & operator*()
Definition MutexGuard.hpp:62
Definition MutexGuard.hpp:24
auto & operator[](Index &&index)
Definition MutexGuard.hpp:38
T & operator*()
Definition MutexGuard.hpp:35
ScopedAccess(ScopedAccess &&) noexcept=default
ScopedAccess(T &value, std::mutex &mutex)
Definition MutexGuard.hpp:25