From: llucax Date: Fri, 18 Jan 2008 18:15:35 +0000 (+0000) Subject: Add exceptions support to C++ interface. X-Git-Url: https://git.llucax.com/software/libev.git/commitdiff_plain/c12d1228a8089ed701ce994c8e2d9858d906a29d?ds=inline Add exceptions support to C++ interface. Add exception specification and a ev::bad_loop exception that is thrown when a loop can't be initialized. --- diff --git a/ev++.h b/ev++.h index 889603a..f62aac4 100644 --- a/ev++.h +++ b/ev++.h @@ -46,6 +46,18 @@ # include "ev.h" #endif +#ifndef EV_CXX_EXCEPTIONS +#define EV_CXX_EXCEPTIONS 1 +#endif + +#undef EV_THROW +#if EV_CXX_EXCEPTIONS +# include +# define EV_THROW(exception) throw (exception) +#else +# define EV_THROW(exception) +#endif + namespace ev { typedef ev_tstamp tstamp; @@ -93,6 +105,14 @@ namespace ev { ALL = EVUNLOOP_ALL }; +#if EV_CXX_EXCEPTIONS + struct bad_loop: std::runtime_error + { + bad_loop() + : std::runtime_error("loop can't be initialized") {} + }; +#endif + #ifdef EV_AX # undef EV_AX #endif @@ -114,12 +134,16 @@ namespace ev { loop_ref (EV_P) #if EV_MULTIPLICITY - : EV_AX (EV_A) + EV_THROW (bad_loop) : EV_AX (EV_A) #endif { +#if EV_MULTIPLICIY && EV_CXX_EXCEPTIONS + if (!EV_A) + throw bad_loop (); +#endif } - bool operator== (const loop_ref &other) const + bool operator== (const loop_ref &other) const EV_THROW () { #if EV_MULTIPLICITY return this->EV_AX == other.EV_AX; @@ -128,7 +152,7 @@ namespace ev { #endif } - bool operator!= (const loop_ref &other) const + bool operator!= (const loop_ref &other) const EV_THROW () { #if EV_MULTIPLICITY return ! (*this == other); @@ -138,37 +162,37 @@ namespace ev { } #if EV_MULTIPLICITY - bool operator== (struct ev_loop *other) const + bool operator== (struct ev_loop *other) const EV_THROW () { return this->EV_AX == other; } - bool operator!= (struct ev_loop *other) const + bool operator!= (struct ev_loop *other) const EV_THROW () { return ! (*this == other); } - bool operator== (const struct ev_loop *other) const + bool operator== (const struct ev_loop *other) const EV_THROW () { return this->EV_AX == other; } - bool operator!= (const struct ev_loop *other) const + bool operator!= (const struct ev_loop *other) const EV_THROW () { return (*this == other); } - operator struct ev_loop * () const + operator struct ev_loop * () const EV_THROW () { return EV_AX; } - operator const struct ev_loop * () const + operator const struct ev_loop * () const EV_THROW () { return EV_AX; } - bool is_default () const + bool is_default () const EV_THROW () { return EV_AX == ev_default_loop (0); } @@ -179,12 +203,12 @@ namespace ev { ev_loop (EV_AX_ flags); } - void unloop (how_t how = ONE) + void unloop (how_t how = ONE) EV_THROW () { ev_unloop (EV_AX_ how); } - void post_fork () + void post_fork () EV_THROW () { #if EV_MULTIPLICITY ev_loop_fork (EV_AX); @@ -193,50 +217,50 @@ namespace ev { #endif } - unsigned int count () const + unsigned int count () const EV_THROW () { return ev_loop_count (EV_AX); } - unsigned int backend () const + unsigned int backend () const EV_THROW () { return ev_backend (EV_AX); } - tstamp now () const + tstamp now () const EV_THROW () { return ev_now (EV_AX); } - void ref () + void ref () EV_THROW () { ev_ref (EV_AX); } - void unref () + void unref () EV_THROW () { ev_unref (EV_AX); } - void set_io_collect_interval (tstamp interval) + void set_io_collect_interval (tstamp interval) EV_THROW () { ev_set_io_collect_interval (EV_AX_ interval); } - void set_timeout_collect_interval (tstamp interval) + void set_timeout_collect_interval (tstamp interval) EV_THROW () { ev_set_timeout_collect_interval (EV_AX_ interval); } // function callback - void once (int fd, int events, tstamp timeout, void (*cb)(int, void *), void* arg = 0) + void once (int fd, int events, tstamp timeout, void (*cb)(int, void *), void* arg = 0) EV_THROW () { ev_once (EV_AX_ fd, events, timeout, cb, arg); } // method callback template - void once (int fd, int events, tstamp timeout, K *object) + void once (int fd, int events, tstamp timeout, K *object) EV_THROW () { once (fd, events, timeout, method_thunk, object); } @@ -250,7 +274,7 @@ namespace ev { // const method callback template - void once (int fd, int events, tstamp timeout, const K *object) + void once (int fd, int events, tstamp timeout, const K *object) EV_THROW () { once (fd, events, timeout, const_method_thunk, object); } @@ -264,7 +288,7 @@ namespace ev { // simple method callback template - void once (int fd, int events, tstamp timeout, K *object) + void once (int fd, int events, tstamp timeout, K *object) EV_THROW () { once (fd, events, timeout, method_noargs_thunk, object); } @@ -278,7 +302,7 @@ namespace ev { // simpler function callback template - void once (int fd, int events, tstamp timeout) + void once (int fd, int events, tstamp timeout) EV_THROW () { once (fd, events, timeout, simpler_func_thunk); } @@ -291,7 +315,7 @@ namespace ev { // simplest function callback template - void once (int fd, int events, tstamp timeout) + void once (int fd, int events, tstamp timeout) EV_THROW () { once (fd, events, timeout, simplest_func_thunk); } @@ -302,12 +326,12 @@ namespace ev { (*cb) (); } - void feed_fd_event (int fd, int revents) + void feed_fd_event (int fd, int revents) EV_THROW () { ev_feed_fd_event (EV_AX_ fd, revents); } - void feed_signal_event (int signum) + void feed_signal_event (int signum) EV_THROW () { ev_feed_signal_event (EV_AX_ signum); } @@ -322,12 +346,12 @@ namespace ev { struct dynamic_loop: loop_ref { - dynamic_loop (unsigned int flags = AUTO) + dynamic_loop (unsigned int flags = AUTO) EV_THROW (bad_loop) : loop_ref (ev_loop_new (flags)) { } - ~dynamic_loop () + ~dynamic_loop () EV_THROW () { ev_loop_destroy (EV_AX); EV_AX = 0; @@ -345,18 +369,25 @@ namespace ev { struct default_loop: loop_ref { - default_loop (unsigned int flags = AUTO) + default_loop (unsigned int flags = AUTO) EV_THROW (bad_loop) #if EV_MULTIPLICITY : loop_ref (ev_default_loop (flags)) { } #else { - ev_default_loop (flags); + #if EV_CXX_EXCEPTIONS + int r = + #endif + ev_default_loop (flags); + #if EV_CXX_EXCEPTIONS + if (!r) + throw bad_loop (); + #endif } #endif - ~default_loop () + ~default_loop () EV_THROW () { ev_default_destroy (); #if EV_MULTIPLICITY @@ -372,7 +403,7 @@ namespace ev { }; - inline loop_ref get_default_loop () + inline loop_ref get_default_loop () EV_THROW () { #if EV_MULTIPLICITY return ev_default_loop (0); @@ -400,13 +431,13 @@ namespace ev { #if EV_MULTIPLICITY EV_PX; - void set (EV_PX) + void set (EV_PX) EV_THROW () { this->EV_A = EV_A; } #endif - base (EV_PX) + base (EV_PX) EV_THROW () #if EV_MULTIPLICITY : EV_A (EV_A) #endif @@ -414,7 +445,7 @@ namespace ev { ev_init (this, 0); } - void set_ (void *data, void (*cb)(EV_P_ ev_watcher *w, int revents)) + void set_ (void *data, void (*cb)(EV_P_ ev_watcher *w, int revents)) EV_THROW () { this->data = data; ev_set_cb (static_cast(this), cb); @@ -422,7 +453,7 @@ namespace ev { // method callback template - void set (K *object) + void set (K *object) EV_THROW () { set_ (object, method_thunk); } @@ -436,7 +467,7 @@ namespace ev { // const method callback template - void set (const K *object) + void set (const K *object) EV_THROW () { set_ (object, const_method_thunk); } @@ -450,7 +481,7 @@ namespace ev { // function callback template - void set (void *data = 0) + void set (void *data = 0) EV_THROW () { set_ (data, function_thunk); } @@ -463,7 +494,7 @@ namespace ev { // simple callback template - void set (K *object) + void set (K *object) EV_THROW () { set_ (object, method_noargs_thunk); } @@ -481,76 +512,76 @@ namespace ev { (static_cast(this), events); } - bool is_active () const + bool is_active () const EV_THROW () { return ev_is_active (static_cast(this)); } - bool is_pending () const + bool is_pending () const EV_THROW () { return ev_is_pending (static_cast(this)); } - void feed_event (int revents) + void feed_event (int revents) EV_THROW () { ev_feed_event (EV_A_ static_cast(this), revents); } }; - inline tstamp now () + inline tstamp now () EV_THROW () { return ev_time (); } - inline void delay (tstamp interval) + inline void delay (tstamp interval) EV_THROW () { ev_sleep (interval); } - inline int version_major () + inline int version_major () EV_THROW () { return ev_version_major (); } - inline int version_minor () + inline int version_minor () EV_THROW () { return ev_version_minor (); } - inline unsigned int supported_backends () + inline unsigned int supported_backends () EV_THROW () { return ev_supported_backends (); } - inline unsigned int recommended_backends () + inline unsigned int recommended_backends () EV_THROW () { return ev_recommended_backends (); } - inline unsigned int embeddable_backends () + inline unsigned int embeddable_backends () EV_THROW () { return ev_embeddable_backends (); } - inline void set_allocator (void *(*cb)(void *ptr, long size)) + inline void set_allocator (void *(*cb)(void *ptr, long size)) EV_THROW () { ev_set_allocator (cb); } - inline void set_syserr_cb (void (*cb)(const char *msg)) + inline void set_syserr_cb (void (*cb)(const char *msg)) EV_THROW () { ev_set_syserr_cb (cb); } #if EV_MULTIPLICITY #define EV_CONSTRUCT(cppstem,cstem) \ - (EV_PX = get_default_loop ()) \ + (EV_PX = get_default_loop ()) EV_THROW () \ : base (EV_A) \ { \ } #else #define EV_CONSTRUCT(cppstem,cstem) \ - () \ + () EV_THROW () \ { \ } #endif @@ -561,19 +592,19 @@ namespace ev { \ struct cppstem : base \ { \ - void start () \ + void start () EV_THROW () \ { \ ev_ ## cstem ## _start (EV_A_ static_cast(this)); \ } \ \ - void stop () \ + void stop () EV_THROW () \ { \ ev_ ## cstem ## _stop (EV_A_ static_cast(this)); \ } \ \ cppstem EV_CONSTRUCT(cppstem,cstem) \ \ - ~cppstem () \ + ~cppstem () EV_THROW () \ { \ stop (); \ } \ @@ -592,7 +623,7 @@ namespace ev { }; EV_BEGIN_WATCHER (io, io) - void set (int fd, int events) + void set (int fd, int events) EV_THROW () { int active = is_active (); if (active) stop (); @@ -600,7 +631,7 @@ namespace ev { if (active) start (); } - void set (int events) + void set (int events) EV_THROW () { int active = is_active (); if (active) stop (); @@ -608,7 +639,7 @@ namespace ev { if (active) start (); } - void start (int fd, int events) + void start (int fd, int events) EV_THROW () { set (fd, events); start (); @@ -616,7 +647,7 @@ namespace ev { EV_END_WATCHER (io, io) EV_BEGIN_WATCHER (timer, timer) - void set (ev_tstamp after, ev_tstamp repeat = 0.) + void set (ev_tstamp after, ev_tstamp repeat = 0.) EV_THROW () { int active = is_active (); if (active) stop (); @@ -624,13 +655,13 @@ namespace ev { if (active) start (); } - void start (ev_tstamp after, ev_tstamp repeat = 0.) + void start (ev_tstamp after, ev_tstamp repeat = 0.) EV_THROW () { set (after, repeat); start (); } - void again () + void again () EV_THROW () { ev_timer_again (EV_A_ static_cast(this)); } @@ -638,7 +669,7 @@ namespace ev { #if EV_PERIODIC_ENABLE EV_BEGIN_WATCHER (periodic, periodic) - void set (ev_tstamp at, ev_tstamp interval = 0.) + void set (ev_tstamp at, ev_tstamp interval = 0.) EV_THROW () { int active = is_active (); if (active) stop (); @@ -646,13 +677,13 @@ namespace ev { if (active) start (); } - void start (ev_tstamp at, ev_tstamp interval = 0.) + void start (ev_tstamp at, ev_tstamp interval = 0.) EV_THROW () { set (at, interval); start (); } - void again () + void again () EV_THROW () { ev_periodic_again (EV_A_ static_cast(this)); } @@ -660,7 +691,7 @@ namespace ev { #endif EV_BEGIN_WATCHER (sig, signal) - void set (int signum) + void set (int signum) EV_THROW () { int active = is_active (); if (active) stop (); @@ -668,7 +699,7 @@ namespace ev { if (active) start (); } - void start (int signum) + void start (int signum) EV_THROW () { set (signum); start (); @@ -676,7 +707,7 @@ namespace ev { EV_END_WATCHER (sig, signal) EV_BEGIN_WATCHER (child, child) - void set (int pid) + void set (int pid) EV_THROW () { int active = is_active (); if (active) stop (); @@ -684,7 +715,7 @@ namespace ev { if (active) start (); } - void start (int pid) + void start (int pid) EV_THROW () { set (pid); start (); @@ -693,7 +724,7 @@ namespace ev { #if EV_STAT_ENABLE EV_BEGIN_WATCHER (stat, stat) - void set (const char *path, ev_tstamp interval = 0.) + void set (const char *path, ev_tstamp interval = 0.) EV_THROW () { int active = is_active (); if (active) stop (); @@ -701,14 +732,14 @@ namespace ev { if (active) start (); } - void start (const char *path, ev_tstamp interval = 0.) + void start (const char *path, ev_tstamp interval = 0.) EV_THROW () { stop (); set (path, interval); start (); } - void update () + void update () EV_THROW () { ev_stat_stat (EV_A_ static_cast(this)); } @@ -716,20 +747,20 @@ namespace ev { #endif EV_BEGIN_WATCHER (idle, idle) - void set () { } + void set () EV_THROW () { } EV_END_WATCHER (idle, idle) EV_BEGIN_WATCHER (prepare, prepare) - void set () { } + void set () EV_THROW () { } EV_END_WATCHER (prepare, prepare) EV_BEGIN_WATCHER (check, check) - void set () { } + void set () EV_THROW () { } EV_END_WATCHER (check, check) #if EV_EMBED_ENABLE EV_BEGIN_WATCHER (embed, embed) - void start (struct ev_loop *embedded_loop) + void start (struct ev_loop *embedded_loop) EV_THROW () { stop (); ev_embed_set (static_cast(this), embedded_loop); @@ -745,7 +776,7 @@ namespace ev { #if EV_FORK_ENABLE EV_BEGIN_WATCHER (fork, fork) - void set () { } + void set () EV_THROW () { } EV_END_WATCHER (fork, fork) #endif @@ -757,5 +788,7 @@ namespace ev { } +#undef EV_THROW + #endif