20 bool del (
size_t id) {
return del_id (
id); }
29 const size_t id = add_id (f);
30 auto destroy_callback = [id, callbacklistp] () { callbacklistp->del (
id); };
31 return destroy_callback;
39 while (next < funcs_.
size())
42 const size_t old_size = iters_.
size();
44 [&next] (
const size_t *p) { return p == &next; }),
56 struct Entry { Callback func;
size_t id = 0; };
62 static size_t counter = 0;
66 add_id (
const Callback &f)
68 const size_t id = newid();
69 funcs_.push_back ({ f,
id });
73 del_id (
const size_t id)
75 for (
size_t j = 0; j < funcs_.size(); j++)
76 if (funcs_[j].
id ==
id) {
77 funcs_.erase (funcs_.begin() + j);
78 for (
size_t i = 0; i < iters_.size(); i++)
92 template<
typename T>
RtCall (T &o,
void (T::*f) ());
94 template<
typename T>
RtCall (
void (*f) (T*), T *d);
104 static constexpr int pdsize = 4;
105 ptrdiff_t mem_[pdsize] = { 0, 0, 0, 0 };
107 virtual void call ()
const = 0;
109 const Callable* callable ()
const;
117 inline operator+= (
const F &job);
126 struct Wrapper : Callable {
127 Wrapper (T &o,
void (T::*f) ()) : f_ (f), o_ (&o) {}
128 void call()
const override {
return (o_->*f_)(); }
129 void (T::*f_) (); T *o_;
131 static_assert (
sizeof (mem_) >=
sizeof (Wrapper));
132 Wrapper *w =
new (mem_) Wrapper { o, f };
139 struct Wrapper : Callable {
140 Wrapper (
void (*f) (T*), T *d) : f_ (f), d_ (d) {}
141 void call()
const override {
return f_ (d_); }
142 void (*f_) (T*); T *d_;
144 static_assert (
sizeof (mem_) >=
sizeof (Wrapper));
145 Wrapper *w =
new (mem_) Wrapper { f, d };
150JobQueue::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 a member function static shared_ptr<CLASS> make_shared(ctorargs...);.
#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.