From: Christos Zoulas <christos%zoulas.com@localhost>
Subject: Re: EV_SET() better C++ compat with alternative implementations
Date: Sun, 11 Aug 2019 20:08:56 +0300
> Now you get warnings with -Wold-style-cast (which is the reason for __CAST() in the first place).
>
> christos
In the C++ case, we could use template specialization. This is quick and dirty,
but something to consider.
Aran
--- /usr/include/sys/event.h 2019-08-09 13:07:39.000000000 -0700
+++ event.h 2019-08-11 10:14:58.638460454 -0700
@@ -36,6 +36,10 @@
#include <sys/inttypes.h> /* for uintptr_t */
#include <sys/null.h> /* for NULL */
+#ifdef __cplusplus
+#include <cstddef>
+#endif
+
#define EVFILT_READ 0U
#define EVFILT_WRITE 1U
#define EVFILT_AIO 2U /* attached to aio requests */
@@ -56,7 +60,7 @@
};
static __inline void
-_EV_SET(struct kevent *_kevp, uintptr_t _ident, uint32_t _filter,
+__EV_SET(struct kevent *_kevp, uintptr_t _ident, uint32_t _filter,
uint32_t _flags, uint32_t _fflags, int64_t _data, intptr_t _udata)
{
_kevp->ident = _ident;
@@ -72,17 +76,32 @@
_EV_SET((kevp), __CAST(uintptr_t, (ident)), (filter), (flags), \
(fflags), (data), (udata))
-static __inline void
+template<class T> __inline void
+_EV_SET(struct kevent *_kevp, uintptr_t _ident, uint32_t _filter,
+ uint32_t _flags, uint32_t _fflags, int64_t _data, T* _udata)
+{
+ __EV_SET(_kevp, _ident, _filter, _flags, _fflags, _data,
+ reinterpret_cast<intptr_t>(_udata));
+}
+
+template<class T> __inline void
_EV_SET(struct kevent *_kevp, uintptr_t _ident, uint32_t _filter,
- uint32_t _flags, uint32_t _fflags, int64_t _data, void *_udata)
+ uint32_t _flags, uint32_t _fflags, int64_t _data, T _udata)
{
- _EV_SET(_kevp, _ident, _filter, _flags, _fflags, _data,
- reinterpret_cast<intptr_t>(_udata));
+ __EV_SET(_kevp, _ident, _filter, _flags, _fflags, _data, _udata);
}
+
+template<> __inline void
+_EV_SET(struct kevent *_kevp, uintptr_t _ident, uint32_t _filter,
+ uint32_t _flags, uint32_t _fflags, int64_t _data, std::nullptr_t _udata)
+{
+ __EV_SET(_kevp, _ident, _filter, _flags, _fflags, _data, 0);
+}
+
#else
#define EV_SET(kevp, ident, filter, flags, fflags, data, udata) \
- _EV_SET((kevp), __CAST(uintptr_t, (ident)), (filter), (flags), \
- (fflags), (data), __CAST(intptr_t, (udata)))
+ __EV_SET((kevp), __CAST(uintptr_t, (ident)), (filter), (flags), \
+ (fflags), (data), __CAST(intptr_t, (udata)))
#endif
/* actions */
Attachment:
pgpGIPwvveqKq.pgp
Description: PGP signature