2#ifndef __ASE_CALLBACK_HH__
3#define __ASE_CALLBACK_HH__
21 bool del (
size_t id) {
return del_id (
id); }
30 const size_t id = add_id (f);
31 auto destroy_callback = [id, callbacklistp] () { callbacklistp->del (
id); };
32 return destroy_callback;
40 while (next < funcs_.
size())
43 const size_t old_size = iters_.
size();
45 [&next] (
const size_t *p) { return p == &next; }),
57 struct Entry { Callback func;
size_t id = 0; };
63 static size_t counter = 0;
67 add_id (
const Callback &f)
69 const size_t id = newid();
70 funcs_.push_back ({ f,
id });
74 del_id (
const size_t id)
76 for (
size_t j = 0; j < funcs_.size(); j++)
77 if (funcs_[j].
id ==
id) {
78 funcs_.erase (funcs_.begin() + j);
79 for (
size_t i = 0; i < iters_.size(); i++)
93 template<
typename T>
RtCall (T &o,
void (T::*f) ());
95 template<
typename T>
RtCall (
void (*f) (T*), T *d);
105 static constexpr int pdsize = 4;
106 ptrdiff_t mem_[pdsize] = { 0, 0, 0, 0 };
108 virtual void call ()
const = 0;
110 const Callable* callable ()
const;
118 inline operator+= (
const F &job);
127 struct Wrapper : Callable {
128 Wrapper (T &o,
void (T::*f) ()) : f_ (f), o_ (&o) {}
129 void call()
const override {
return (o_->*f_)(); }
130 void (T::*f_) (); T *o_;
132 static_assert (
sizeof (mem_) >=
sizeof (Wrapper));
133 Wrapper *w =
new (mem_) Wrapper { o, f };
140 struct Wrapper : Callable {
141 Wrapper (
void (*f) (T*), T *d) : f_ (f), d_ (d) {}
142 void call()
const override {
return f_ (d_); }
143 void (*f_) (T*); T *d_;
145 static_assert (
sizeof (mem_) >=
sizeof (Wrapper));
146 Wrapper *w =
new (mem_) Wrapper { f, d };
151JobQueue::operator+= (
const F &job)
Reentrant callback list with configurable arguments.
void call(const std::function< void(const Callback &, const A &...)> &wrapper, const A &...args)
Call all callbacks in the order they were added via wrapper function.
void operator()(const A &...args)
Call all callbacks in the order they were added.
size_t add(const Callback &f)
Add a callback, returns an id that can be used for deletion.
bool del(size_t id)
Delete a previously added callback via its id, returns if any was found.
std::function< void()> add_delcb(const Callback &f)
Add a callback and return a deleter that removes the callback when invoked.
bool empty() const
Check if the callback list is empty, i.e. invocation will not call any callbacks.
#define ASE_ASSERT_RETURN(expr,...)
Return from the current function if expr evaluates to false and issue an assertion warning.
#define ASE_DEFINE_MAKE_SHARED(CLASS)
#define ASE_CLASS_NON_COPYABLE(ClassName)
Delete copy ctor and assignment operator.
The Anklang C++ API namespace.
T shared_from_this(T... args)
Wrap simple callback pointers, without using malloc (obstruction free).
void invoke()
Invoke the wrapped function call.
~RtCall()
Clear function pointers.
RtCall(T &o, void(T::*f)())
Wrap a simple void func() object member function call.