Bug 4582 – distinct field names constraint for std.typecons.Tuple
Status
RESOLVED
Resolution
FIXED
Severity
enhancement
Priority
P2
Component
phobos
Product
D
Version
D2
Platform
All
OS
All
Creation time
2010-08-04T17:21:25Z
Last change time
2017-10-16T09:58:08Z
Keywords
bootcamp, patch
Assigned to
No Owner
Creator
bearophile_hugs
Comments
Comment #0 by bearophile_hugs — 2010-08-04T17:21:25Z
It's better to put guards as template constraints at the std.typecons.Tuple, so erroneous Tuple template instantiations fail at the instantiation point, giving a more useful error message in the user code instead giving an error inside the std.typecons module (this is one of the main purposes of template constraints).
This code guards against duplicated field names:
private template Iota(int stop) { // this is useful in general
static if (stop <= 0)
alias TypeTuple!() Iota;
else
alias TypeTuple!(Iota!(stop-1), stop-1) Iota;
}
private bool distinctFieldNames(T...)() {
enum int tlen = T.length; // can't move this below, probably DMD bug
foreach (i1; Iota!(tlen))
static if (is(typeof(T[i1]) : string))
foreach (i2; Iota!(tlen))
static if (i1 != i2 && is(typeof(T[i2]) : string))
if (T[i1] == T[i2])
return false;
return true;
}
// ...............
struct Tuple(T...) if (distinctFieldNames!(T)())
{
Comment #1 by andrei — 2010-10-07T08:02:31Z
Excellent.
Comment #2 by bearophile_hugs — 2010-10-07T13:25:43Z
Thank you. But I think some tests/benchmarks may be done to make sure this extra test doesn't slow down too much the compilation of programs that define many tuple types.
Comment #3 by github-bugzilla — 2017-10-12T13:20:35Z