Skip to content

Commit b63e073

Browse files
authored
Merge pull request #78 from s-ludwig/visit_improvements
visit improvements
2 parents 1f8eaf7 + dfe7156 commit b63e073

File tree

2 files changed

+14
-11
lines changed

2 files changed

+14
-11
lines changed

source/taggedalgebraic/taggedunion.d

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,9 @@ align(commonAlignment!(UnionKindTypes!(UnionFieldEnum!U))) struct TaggedUnion
348348
import std.conv : text;
349349
import std.format : FormatSpec, formatValue;
350350

351+
enum suffix = ")";
352+
FormatSpec!char spec;
353+
351354
final switch (m_kind) {
352355
foreach (i, v; EnumMembers!Kind) {
353356
case v:
@@ -358,9 +361,7 @@ align(commonAlignment!(UnionKindTypes!(UnionFieldEnum!U))) struct TaggedUnion
358361
// because formattedWrite does not work for
359362
// non-copyable types
360363
enum prefix = "(" ~ vstr ~ ": ";
361-
enum suffix = ")";
362364
put(w, prefix);
363-
FormatSpec!char spec;
364365
formatValue(w, value!v, spec);
365366
put(w, suffix);
366367
}

source/taggedalgebraic/visit.d

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -314,15 +314,17 @@ private template selectHandler(T, VISITORS...)
314314
template genericIndex(int i, int matched_index = -1) {
315315
static if (i < VISITORS.length) {
316316
alias fun = VISITORS[i];
317-
static if (!isSomeFunction!fun) {
318-
static if (!__traits(isTemplate, fun)) enum genericIndex = "Visitor at index " ~ i.stringof ~ " is neither a function, nor a template.";
319-
else static if (__traits(compiles, fun!T) && isSomeFunction!(fun!T)) {
320-
static if (ParameterTypeTuple!(fun!T).length == 1) {
321-
static if (matched_index >= 0) enum genericIndex = "Only one generic visitor allowed";
322-
else enum genericIndex = genericIndex!(i+1, i);
323-
} else enum genericIndex = "Generic visitor at index "~i.stringof~" must have a single parameter.";
324-
} else enum genericIndex = genericIndex!(i+1, i); // let this fail within the template instantiation instead of here
325-
} else enum genericIndex = genericIndex!(i+1, matched_index);
317+
static if (isSomeFunction!fun)
318+
enum genericIndex = genericIndex!(i+1, matched_index);
319+
else static if (!__traits(isTemplate, fun))
320+
enum genericIndex = "Visitor at index " ~ i.stringof ~ " is neither a function, nor a template.";
321+
else static if (!__traits(compiles, fun!T) || !isSomeFunction!(fun!T))
322+
enum genericIndex = genericIndex!(i+1, i); // let this fail within the template instantiation instead of here
323+
else static if (ParameterTypeTuple!(fun!T).length != 1)
324+
enum genericIndex = "Generic visitor at index "~i.stringof~" must have a single parameter.";
325+
else static if (matched_index >= 0)
326+
enum genericIndex = "Only one generic visitor allowed";
327+
else enum genericIndex = genericIndex!(i+1, i);
326328
} else enum genericIndex = matched_index;
327329
}
328330

0 commit comments

Comments
 (0)