From aaaca447cc3b4471bf6f3d6cd3fe35fbb341dbb4 Mon Sep 17 00:00:00 2001 From: alexrp Date: Sun, 13 May 2012 23:12:56 +0200 Subject: [PATCH] Make generated accessor for bitfields @safe pure nothrow. --- std/bitmanip.d | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/std/bitmanip.d b/std/bitmanip.d index 358a98777..6c44aa173 100644 --- a/std/bitmanip.d +++ b/std/bitmanip.d @@ -80,17 +80,17 @@ private template createAccessors( static assert(len == 1); enum result = // getter - "@property bool " ~ name ~ "() const { return " + "@property @safe bool " ~ name ~ "() pure nothrow const { return " ~"("~store~" & "~myToString(maskAllElse)~") != 0;}\n" // setter - ~"@property void " ~ name ~ "(bool v){" + ~"@property @safe void " ~ name ~ "(bool v) pure nothrow {" ~"if (v) "~store~" |= "~myToString(maskAllElse)~";" ~"else "~store~" &= ~"~myToString(maskAllElse)~";}\n"; } else { // getter - enum result = "@property "~T.stringof~" "~name~"() const { auto result = " + enum result = "@property @safe "~T.stringof~" "~name~"() pure nothrow const { auto result = " "("~store~" & " ~ myToString(maskAllElse) ~ ") >>" ~ myToString(offset) ~ ";" @@ -100,7 +100,7 @@ private template createAccessors( : "") ~ " return cast("~T.stringof~") result;}\n" // setter - ~"@property void "~name~"("~T.stringof~" v){ " + ~"@property @safe void "~name~"("~T.stringof~" v) pure nothrow { " ~"assert(v >= "~name~"_min); " ~"assert(v <= "~name~"_max); " ~store~" = cast(typeof("~store~"))" @@ -203,6 +203,31 @@ template bitfields(T...) enum { bitfields = createFields!(createStoreName!(T), 0, T).result } } +unittest +{ + struct Test + { + mixin(bitfields!(bool, "a", 1, + uint, "b", 3, + short, "c", 4)); + } + + @safe void test() pure nothrow + { + Test t; + + t.a = true; + t.b = 5; + t.c = 2; + + assert(t.a); + assert(t.b == 5); + assert(t.c == 2); + } + + test(); +} + unittest { static struct Integrals {