Valkyrie 2026
Loading...
Searching...
No Matches
LockedAccess.h
1#pragma once
2#include <memory>
3#include <mutex>
4#include <utility>
5
6namespace valor {
7namespace util {
8template <typename T>
9class LockedAccess {
10 public:
11 LockedAccess(T& object, std::mutex& mutex) : object{object}, lock{mutex} {}
12
13 auto operator->() {
14 if constexpr (requires(T t) { t.operator->(); })
15 return object.operator->();
16 else
17 return &object;
18 }
19
20 LockedAccess& operator=(T&& other) {
21 object = std::move(other);
22 return *this;
23 }
24
25 T& value() { return object; }
26
27 private:
28 T& object;
29 std::unique_lock<std::mutex> lock;
30};
31
32template <typename T>
33class Locked {
34 public:
35 template <typename... Args>
36 explicit Locked(Args&&... args) : object{std::forward<Args>(args)...} {}
37
38 LockedAccess<T> lock() { return {object, mutex}; }
39
40 LockedAccess<const T> lock() const { return {object, mutex}; }
41
42 LockedAccess<T> operator->() { return lock(); }
43
44 LockedAccess<const T> operator->() const { return lock(); }
45
46 private:
47 T object;
48 mutable std::mutex mutex;
49};
50} // namespace util
51} // namespace valor
Definition LockedAccess.h:9