digitalmars.D.bugs - [Issue 9206] New: std.exception.isValidEnumValue
- d-bugmail puremagic.com (70/70) Dec 25 2012 http://d.puremagic.com/issues/show_bug.cgi?id=9206
- d-bugmail puremagic.com (10/10) Jan 20 2013 http://d.puremagic.com/issues/show_bug.cgi?id=9206
- d-bugmail puremagic.com (13/14) Jan 20 2013 http://d.puremagic.com/issues/show_bug.cgi?id=9206
- d-bugmail puremagic.com (10/26) Jan 25 2013 http://d.puremagic.com/issues/show_bug.cgi?id=9206
http://d.puremagic.com/issues/show_bug.cgi?id=9206
Summary: std.exception.isValidEnumValue
Product: D
Version: D2
Platform: All
OS/Version: All
Status: NEW
Severity: enhancement
Priority: P2
Component: Phobos
AssignedTo: nobody puremagic.com
ReportedBy: bearophile_hugs eml.cc
Sometimes in a program instances of enumerates values contain a value that's
not one of the allowed ones, because of missed initialization ("= void"), data
corruption, badly done casts of integral values to enum instance values, and so
on.
So I sometimes validate an enum instance in function pre-conditions. Below
there is a first implementation of such isValidEnumValue() validating function,
meant to be used mostly in pre-conditions. I suggest to add something similar
to this to std.exception:
//------------------------------------------
import std.traits: EnumMembers, isIntegral, isSomeChar;
import std.algorithm: canFind;
property bool isCompleteIntervalEnum(E)()
pure nothrow if (is(E == enum)) {
static if (isIntegral!E || isSomeChar!E) {
return EnumMembers!E.length == (E.max - E.min + 1);
} else {
return false;
}
} unittest { // isCompleteIntervalEnum tests
enum E01 : string { S1="abb", S2="booh", S3="zum" }
static assert(!isCompleteIntervalEnum!E01);
enum E02 : byte { A=-3, S2=4 }
static assert(!isCompleteIntervalEnum!E02);
enum E03: byte { A=0, B=1, C=2 }
static assert(isCompleteIntervalEnum!E03);
enum E04: char { A, B, C }
static assert(isCompleteIntervalEnum!E04);
enum E05: ulong { A=ulong.max, B=ulong.min }
static assert(!isCompleteIntervalEnum!E05);
enum E06: ulong { A=ulong.max, B=ulong.max-1 }
static assert(isCompleteIntervalEnum!E06);
enum E07: char { A='a', B='b', C='c' }
static assert(isCompleteIntervalEnum!E07);
}
bool isValidEnumValue(E)(E e)
pure nothrow if (is(E == enum)) {
static if (isCompleteIntervalEnum!E) {
return e >= E.min && e <= E.max; // Optimization.
} else {
return [EnumMembers!Foo].canFind(e);
}
}
enum Foo { A, B, C=10 }
void bar(Foo f)
in {
assert(isValidEnumValue(f));
} body {
}
void main() {
//Foo f;
Foo f = void;
bar(f);
}
//------------------------------------------
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Dec 25 2012
http://d.puremagic.com/issues/show_bug.cgi?id=9206
Andrej Mitrovic <andrej.mitrovich gmail.com> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |andrej.mitrovich gmail.com
13:55:08 PST ---
Is this a duplicate or just related to Issue 8594?
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jan 20 2013
http://d.puremagic.com/issues/show_bug.cgi?id=9206Is this a duplicate or just related to Issue 8594?This enhancement request is for a function to be used mostly at run-time, like inside pre-conditions, to validate single enum arguments. Issue 8597 is meant to be used mostly at compile-time to validate array literals of enums (like strings literals of enum chars). So they are related but they are not the same thing, they aren't a duplicate of each other. (Maybe it's possible to implement part of one using the other, but not fully). So I think they should be kept separated. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Jan 20 2013
http://d.puremagic.com/issues/show_bug.cgi?id=9206 15:53:47 PST ---property bool isCompleteIntervalEnum(E)() pure nothrow if (is(E == enum)) { static if (isIntegral!E || isSomeChar!E) { return EnumMembers!E.length == (E.max - E.min + 1); } else { return false; } }That's an interesting optimization.bool isValidEnumValue(E)(E e) pure nothrow if (is(E == enum)) { static if (isCompleteIntervalEnum!E) { return e >= E.min && e <= E.max; // Optimization. } else { return [EnumMembers!Foo].canFind(e); } }A mixed-in switch will be slightly faster in the else clause, except in the case of floating-point which can't be used with switches. Anyway I think it's worth adding. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Jan 25 2013









d-bugmail puremagic.com 