19#include "pw_sync/borrow.h"
20#include "pw_sync/internal/borrowable_storage.h"
21#include "pw_sync/mutex.h"
22#include "pw_sync/virtual_basic_lockable.h"
33template <
typename GuardedType,
37 public Borrowable<GuardedType, LockInterface> {
38 using Storage = internal::BorrowableStorage<GuardedType, Lock>;
44 : Storage(std::in_place),
Base(Storage::object_, Storage::lock_) {}
60 template <
typename... Args>
62 : Storage(std::in_place, std::forward<Args>(args)...),
63 Base(Storage::object_, Storage::lock_) {}
82 template <
typename... ObjectArgs,
typename... LockArgs>
84 std::tuple<ObjectArgs...>&& object_args,
85 std::tuple<LockArgs...>&& lock_args = std::make_tuple())
86 : Storage(std::forward<std::tuple<ObjectArgs...>>(object_args),
87 std::forward<std::tuple<LockArgs...>>(lock_args)),
88 Base(Storage::object_, Storage::lock_) {}
104 template <
typename ObjectConstructor,
105 typename LockConstructor = Lock(),
106 typename = std::enable_if_t<
107 std::is_invocable_r_v<GuardedType&&, ObjectConstructor>>,
108 typename = std::enable_if_t<
109 std::is_invocable_r_v<Lock&&, LockConstructor>>>
111 const ObjectConstructor& object_ctor,
112 const LockConstructor& lock_ctor = internal::DefaultConstruct<Lock>)
113 : Storage(object_ctor, lock_ctor),
114 Base(Storage::object_, Storage::lock_) {}
116 template <
typename ObjectConstructor,
117 typename LockConstructor = Lock(),
118 typename = std::enable_if_t<
119 std::is_invocable_r_v<GuardedType&&, ObjectConstructor>>,
120 typename = std::enable_if_t<
121 std::is_invocable_r_v<Lock&&, LockConstructor>>>
123 ObjectConstructor& object_ctor,
124 const LockConstructor& lock_ctor = internal::DefaultConstruct<Lock>)
125 : Storage(object_ctor, lock_ctor),
126 Base(Storage::object_, Storage::lock_) {}
128 template <
typename ObjectConstructor,
129 typename LockConstructor = Lock(),
130 typename = std::enable_if_t<
131 std::is_invocable_r_v<GuardedType&&, ObjectConstructor>>,
132 typename = std::enable_if_t<
133 std::is_invocable_r_v<Lock&&, LockConstructor>>>
135 LockConstructor& lock_ctor)
136 : Storage(object_ctor, lock_ctor),
137 Base(Storage::object_, Storage::lock_) {}
139 template <
typename ObjectConstructor,
140 typename LockConstructor = Lock(),
141 typename = std::enable_if_t<
142 std::is_invocable_r_v<GuardedType&&, ObjectConstructor>>,
143 typename = std::enable_if_t<
144 std::is_invocable_r_v<Lock&&, LockConstructor>>>
146 LockConstructor& lock_ctor)
147 : Storage(object_ctor, lock_ctor),
148 Base(Storage::object_, Storage::lock_) {}
Definition: inline_borrowable.h:37
constexpr InlineBorrowable(std::in_place_t, Args &&... args)
Definition: inline_borrowable.h:61
constexpr InlineBorrowable(std::tuple< ObjectArgs... > &&object_args, std::tuple< LockArgs... > &&lock_args=std::make_tuple())
Definition: inline_borrowable.h:83
constexpr InlineBorrowable(const ObjectConstructor &object_ctor, const LockConstructor &lock_ctor=internal::DefaultConstruct< Lock >)
Definition: inline_borrowable.h:110
constexpr InlineBorrowable()
Construct the guarded object and lock using their default constructors.
Definition: inline_borrowable.h:43
Definition: virtual_basic_lockable.h:29