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.