#ifndef EVPP_H__
#define EVPP_H__
-#include "ev.h"
+#ifdef EV_H
+# include EV_H
+#else
+# include <ev.h>
+#endif
namespace ev {
ev_init (this, 0);
}
- void set_ (void *object, void (*cb)(ev_watcher *w, int revents))
+ void set_ (void *data, void (*cb)(EV_P_ ev_watcher *w, int revents))
{
- this->data = object;
+ this->data = data;
ev_set_cb (static_cast<ev_watcher *>(this), cb);
}
+ // method callback
template<class K, void (K::*method)(watcher &w, int)>
void set (K *object)
{
}
template<class K, void (K::*method)(watcher &w, int)>
- static void method_thunk (ev_watcher *w, int revents)
+ static void method_thunk (EV_P_ ev_watcher *w, int revents)
{
- watcher *self = static_cast<watcher *>(w);
- K *obj = static_cast<K *>(self->data);
- (obj->*method) (*self, revents);
+ K *obj = static_cast<K *>(w->data);
+ (obj->*method) (*static_cast<watcher *>(w), revents);
}
+ // const method callback
template<class K, void (K::*method)(watcher &w, int) const>
void set (const K *object)
{
}
template<class K, void (K::*method)(watcher &w, int) const>
- static void const_method_thunk (ev_watcher *w, int revents)
+ static void const_method_thunk (EV_P_ ev_watcher *w, int revents)
{
- watcher *self = static_cast<watcher *>(w);
- K *obj = static_cast<K *>(self->data);
- (obj->*method) (*self, revents);
+ K *obj = static_cast<K *>(w->data);
+ (static_cast<K *>(w->data)->*method) (*static_cast<watcher *>(w), revents);
}
+ // function callback
template<void (*function)(watcher &w, int)>
- void set ()
+ void set (void *data = 0)
{
- set_ (0, function_thunk<function>);
+ set_ (data, function_thunk<function>);
}
template<void (*function)(watcher &w, int)>
- static void function_thunk (ev_watcher *w, int revents)
+ static void function_thunk (EV_P_ ev_watcher *w, int revents)
+ {
+ function (*static_cast<watcher *>(w), revents);
+ }
+
+ // simple callback
+ template<class K, void (K::*method)()>
+ void set (K *object)
+ {
+ set_ (object, method_noargs_thunk<K, method>);
+ }
+
+ template<class K, void (K::*method)()>
+ static void method_noargs_thunk (EV_P_ ev_watcher *w, int revents)
{
- watcher *self = static_cast<watcher *>(w);
- function (*self, revents);
+ K *obj = static_cast<K *>(w->data);
+ (obj->*method) ();
}
void operator ()(int events = EV_UNDEF)
{
- return e_cb (static_cast<ev_watcher *>(this)) (events);
+ return ev_cb (static_cast<ev_watcher *>(this))
+ (static_cast<ev_watcher *>(this), events);
}
bool is_active () const