From 7b6123f6a60e0d041aa7673c6077a254656c6c08 Mon Sep 17 00:00:00 2001 From: jmdavis Date: Sat, 21 Jun 2014 21:30:11 -0700 Subject: [PATCH] Slight improvement to enforceEx's constraints and its documentation. --- std/exception.d | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/std/exception.d b/std/exception.d index 2908b9c80..382ea7ed3 100644 --- a/std/exception.d +++ b/std/exception.d @@ -520,9 +520,10 @@ T errnoEnforce(T, string file = __FILE__, size_t line = __LINE__) enforceEx!DataCorruptionException(line.length); -------------------- +/ -template enforceEx(E) +template enforceEx(E : Throwable) if (is(typeof(new E("", __FILE__, __LINE__)))) { + /++ Ditto +/ T enforceEx(T)(T value, lazy string msg = "", string file = __FILE__, size_t line = __LINE__) { if (!value) throw new E(msg, file, line); @@ -530,9 +531,11 @@ template enforceEx(E) } } -template enforceEx(E) +/++ Ditto +/ +template enforceEx(E : Throwable) if (is(typeof(new E(__FILE__, __LINE__))) && !is(typeof(new E("", __FILE__, __LINE__)))) { + /++ Ditto +/ T enforceEx(T)(T value, string file = __FILE__, size_t line = __LINE__) { if (!value) throw new E(file, line); @@ -561,6 +564,24 @@ unittest assert(e.file == "file"); assert(e.line == 42); } + + { + auto e = collectException!Error(enforceEx!OutOfMemoryError(false)); + assert(e !is null); + assert(e.msg == "Memory allocation failed"); + assert(e.file == __FILE__); + assert(e.line == __LINE__ - 4); + } + + { + auto e = collectException!Error(enforceEx!OutOfMemoryError(false, "file", 42)); + assert(e !is null); + assert(e.msg == "Memory allocation failed"); + assert(e.file == "file"); + assert(e.line == 42); + } + + static assert(!is(typeof(enforceEx!int(true)))); } unittest