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_) {}
102 template <
typename ObjectConstructor,
103 typename LockConstructor = Lock(),
104 typename = std::enable_if_t<
105 std::is_invocable_r_v<GuardedType&&, ObjectConstructor>>,
106 typename = std::enable_if_t<
107 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_) {}
114 template <
typename ObjectConstructor,
115 typename LockConstructor = Lock(),
116 typename = std::enable_if_t<
117 std::is_invocable_r_v<GuardedType&&, ObjectConstructor>>,
118 typename = std::enable_if_t<
119 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_) {}
126 template <
typename ObjectConstructor,
127 typename LockConstructor = Lock(),
128 typename = std::enable_if_t<
129 std::is_invocable_r_v<GuardedType&&, ObjectConstructor>>,
130 typename = std::enable_if_t<
131 std::is_invocable_r_v<Lock&&, LockConstructor>>>
133 LockConstructor& lock_ctor)
134 : Storage(object_ctor, lock_ctor),
135 Base(Storage::object_, Storage::lock_) {}
137 template <
typename ObjectConstructor,
138 typename LockConstructor = Lock(),
139 typename = std::enable_if_t<
140 std::is_invocable_r_v<GuardedType&&, ObjectConstructor>>,
141 typename = std::enable_if_t<
142 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