From 8205258ee9569fb1ffdc6c1991c68131e43d33bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6nke=20Ludwig?= Date: Fri, 28 Dec 2018 00:41:18 +0100 Subject: [PATCH] Define handles as properly named structs. Greatly enhances the readability of compiler error messages, as well as sometimes considerably reducing the size of symbol bloat. --- source/eventcore/driver.d | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/source/eventcore/driver.d b/source/eventcore/driver.d index 66481e8..5ba4669 100644 --- a/source/eventcore/driver.d +++ b/source/eventcore/driver.d @@ -789,14 +789,15 @@ struct FileChange { bool isDirectory; } -struct Handle(string NAME, T, T invalid_value = T.init) { - import std.traits : isInstanceOf; - static if (isInstanceOf!(.Handle, T)) alias BaseType = T.BaseType; +mixin template Handle(string NAME, T, T invalid_value = T.init) { + static if (is(T.BaseType)) alias BaseType = T.BaseType; else alias BaseType = T; alias name = NAME; - enum invalid = Handle.init; + enum invalid = typeof(this).init; + + nothrow @nogc @safe: T value = invalid_value; @@ -817,15 +818,15 @@ struct Handle(string NAME, T, T invalid_value = T.init) { alias ThreadCallback = void function(intptr_t param) @safe nothrow; -alias FD = Handle!("fd", size_t, size_t.max); -alias SocketFD = Handle!("socket", FD); -alias StreamSocketFD = Handle!("streamSocket", SocketFD); -alias StreamListenSocketFD = Handle!("streamListen", SocketFD); -alias DatagramSocketFD = Handle!("datagramSocket", SocketFD); -alias FileFD = Handle!("file", FD); -alias EventID = Handle!("event", FD); -alias TimerID = Handle!("timer", size_t, size_t.max); -alias WatcherID = Handle!("watcher", size_t, size_t.max); -alias EventWaitID = Handle!("eventWait", size_t, size_t.max); -alias SignalListenID = Handle!("signal", size_t, size_t.max); -alias DNSLookupID = Handle!("dns", size_t, size_t.max); +struct FD { mixin Handle!("fd", size_t, size_t.max); } +struct SocketFD { mixin Handle!("socket", FD); } +struct StreamSocketFD { mixin Handle!("streamSocket", SocketFD); } +struct StreamListenSocketFD { mixin Handle!("streamListen", SocketFD); } +struct DatagramSocketFD { mixin Handle!("datagramSocket", SocketFD); } +struct FileFD { mixin Handle!("file", FD); } +struct EventID { mixin Handle!("event", FD); } +struct TimerID { mixin Handle!("timer", size_t, size_t.max); } +struct WatcherID { mixin Handle!("watcher", size_t, size_t.max); } +struct EventWaitID { mixin Handle!("eventWait", size_t, size_t.max); } +struct SignalListenID { mixin Handle!("signal", size_t, size_t.max); } +struct DNSLookupID { mixin Handle!("dns", size_t, size_t.max); }