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"
34template <
typename GuardedType,
36 typename LockInterface = Lock>
38 public Borrowable<GuardedType, LockInterface> {
39 using Storage = internal::BorrowableStorage<GuardedType, Lock>;
45 : 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_) {}
81 template <
typename... ObjectArgs,
typename... LockArgs>
83 std::tuple<ObjectArgs...>&& object_args,
84 std::tuple<LockArgs...>&& lock_args = std::make_tuple())
85 : Storage(std::forward<std::tuple<ObjectArgs...>>(object_args),
86 std::forward<std::tuple<LockArgs...>>(lock_args)),
87 Base(Storage::object_, Storage::lock_) {}
103 typename ObjectConstructor,
104 typename LockConstructor = Lock (*)(),
105 typename = std::enable_if_t<
106 std::is_invocable_r_v<GuardedType, ObjectConstructor>>,
107 typename = std::enable_if_t<std::is_invocable_r_v<Lock, LockConstructor>>>
109 const ObjectConstructor& object_ctor,
110 const LockConstructor& lock_ctor = internal::DefaultConstruct<Lock>)
111 : Storage(object_ctor, lock_ctor),
112 Base(Storage::object_, Storage::lock_) {}
115 typename ObjectConstructor,
116 typename LockConstructor = Lock (*)(),
117 typename = std::enable_if_t<
118 std::is_invocable_r_v<GuardedType, ObjectConstructor>>,
119 typename = std::enable_if_t<std::is_invocable_r_v<Lock, LockConstructor>>>
121 ObjectConstructor& object_ctor,
122 const LockConstructor& lock_ctor = internal::DefaultConstruct<Lock>)
123 : Storage(object_ctor, lock_ctor),
124 Base(Storage::object_, Storage::lock_) {}
127 typename ObjectConstructor,
128 typename LockConstructor = Lock (*)(),
129 typename = std::enable_if_t<
130 std::is_invocable_r_v<GuardedType, ObjectConstructor>>,
131 typename = std::enable_if_t<std::is_invocable_r_v<Lock, LockConstructor>>>
133 LockConstructor& lock_ctor)
134 : Storage(object_ctor, lock_ctor),
135 Base(Storage::object_, Storage::lock_) {}
138 typename ObjectConstructor,
139 typename LockConstructor = Lock (*)(),
140 typename = std::enable_if_t<
141 std::is_invocable_r_v<GuardedType, ObjectConstructor>>,
142 typename = std::enable_if_t<std::is_invocable_r_v<Lock, LockConstructor>>>
144 LockConstructor& lock_ctor)
145 : Storage(object_ctor, lock_ctor),
146 Base(Storage::object_, Storage::lock_) {}
Definition: inline_borrowable.h:38
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:82
constexpr InlineBorrowable(const ObjectConstructor &object_ctor, const LockConstructor &lock_ctor=internal::DefaultConstruct< Lock >)
Definition: inline_borrowable.h:108
constexpr InlineBorrowable()
Constructs the guarded object and lock using their default constructors.
Definition: inline_borrowable.h:44
Definition: binary_semaphore.h:26