8#ifndef SEN_CORE_OBJ_CALLBACK_H
9#define SEN_CORE_OBJ_CALLBACK_H
39[[nodiscard]]
inline WorkQueue* getWorkQueue(NativeObject*
object)
noexcept;
67 std::recursive_mutex mutex;
68 WorkQueue* queue =
nullptr;
69 std::optional<std::weak_ptr<Object>> caller;
75 SEN_NOCOPY_NOMOVE(CallbackLock)
78 ~CallbackLock() { data_->mutex.unlock(); }
82 [[nodiscard]]
bool isValid() const noexcept {
return isCallbackDataValid(*data_); }
88 void invalidate() const noexcept { data_->queue =
nullptr; }
91 [[nodiscard]]
bool isSameQueue(
const WorkQueue* queue)
const noexcept {
return queue == data_->queue; }
94 [[nodiscard]]
static bool isCallbackDataValid(
const CallbackData& data)
noexcept
96 return data.queue !=
nullptr && (!data.caller.has_value() || !data.caller.value().expired());
100 friend class CallbackBase;
101 explicit CallbackLock(std::shared_ptr<CallbackData> data): data_(std::move(data)) { data_->mutex.lock(); }
104 std::shared_ptr<CallbackData> data_;
110class CallbackBase:
public std::enable_shared_from_this<CallbackBase>
113 SEN_COPY_MOVE(CallbackBase)
116 virtual ~CallbackBase() =
default;
120 [[nodiscard]] CallbackLock lock()
const {
return CallbackLock(data_); }
124 CallbackBase() =
default;
127 explicit CallbackBase(WorkQueue* queue) { data_->queue = queue; }
131 explicit CallbackBase(NativeObject* obj);
133 [[nodiscard]] CallbackData& getData() const noexcept {
return *data_; }
136 std::shared_ptr<CallbackData> data_ = std::make_shared<CallbackData>();
144template <
typename InfoClass,
typename... Args>
160 Callback(impl::WorkQueue* queue,
CallbackFunc&& function)
noexcept: CallbackBase(queue), func_(std::move(function)) {}
168 template <
typename C>
170 : CallbackBase(obj, [obj, function](
MaybeRef<Args>... args) { ((*obj).*(function))(args...); })
176 template <
typename C>
179 , func_([obj, function](const InfoClass& info,
MaybeRef<Args>... args) { ((*obj).*(function))(info, args...); })
188 auto& data = getData();
189 std::scoped_lock<std::recursive_mutex> lock(data.mutex);
191 if (SEN_LIKELY(impl::CallbackLock::isCallbackDataValid(data)))
193 std::holds_alternative<Function>(func_) ? std::get<Function>(func_)(args...)
194 : std::get<FunctionWithCallInfo>(func_)(info, args...);
207template <
typename... Args>
The following macros implement a replacement of assert that is connected to the overall fault handlin...
Here we define a set of template meta-programming helpers to let the compiler take some decisions bas...
Base class for event or method callbacks. It stores the queue where to push the response....
Definition callback.h:146
Callback(C *obj, void(C::*function)(const EventInfo &, MaybeRef< Args >...))
Definition callback.h:177
sen::std_util::move_only_function< void(MaybeRef< Args >...)> Function
Definition callback.h:151
Callback(C *obj, void(C::*function)(MaybeRef< Args >...))
Definition callback.h:169
sen::std_util::move_only_function< void(const InfoClass &, MaybeRef< Args >...)> FunctionWithCallInfo
Definition callback.h:152
~Callback() override=default
Callback(impl::WorkQueue *queue, CallbackFunc &&function) noexcept
Definition callback.h:160
std::variant< Function, FunctionWithCallInfo > CallbackFunc
Definition callback.h:153
Callback(NativeObject *obj, CallbackFunc &&function) noexcept
Definition callback.h:164
void invoke(const EventInfo &info, MaybeRef< Args >... args) const
Definition callback.h:185
An object instantiated in this process. This is the base class for all user-implemented objects.
Definition native_object.h:63
A sen object.
Definition object.h:76
Result<T, E> is a template type that can be used to return and propagate errors. The intent is to rep...
Definition result.h:135
A point in time.
Definition timestamp.h:26
TimeStamp creationTime
When was the event created, timestamped by the source.
Definition callback.h:51
Result< R, std::exception_ptr > MethodResult
The result of a method (which can be an exception in case of error).
Definition callback.h:204
Callback< MethodCallInfo, MethodResult< R > > MethodCallback
A method callback.
Definition callback.h:212
Callback< EventInfo, Args... > EventCallback
An event callback.
Definition callback.h:208
EventCallback<> PropertyCallback
A property change callback.
Definition callback.h:215
Information about an event emission.
Definition callback.h:50
Information about a method call.
Definition callback.h:56
std::conditional_t< std::is_arithmetic_v< T >||shouldBePassedByValueV< T >, T, AddConstRef< T > > MaybeRef
returns 'const T&' or 'T' depending on the type
Definition class_helpers.h:46
@ force
Definition unit.h:40
detail::MoveOnlyFunctionImpl< FwdArgs... > move_only_function
Definition move_only_function.h:256