Skip to content

Instantly share code, notes, and snippets.

@rikkimax
Created August 27, 2014 02:55
Show Gist options
  • Save rikkimax/70f80dac035a5efb4346 to your computer and use it in GitHub Desktop.
Save rikkimax/70f80dac035a5efb4346 to your computer and use it in GitHub Desktop.
YesNoSometimes assmtfdbkParse(string text) {
string[] stes = text.split(",");
foreach(ste; stes) {
switch(ste) {
case "Yes definately":
return YesNoSometimes.Yes;
case "Depends on the student":
return YesNoSometimes.Sometimes;
default:
return YesNoSometimes.No;
}
}
return YesNoSometimes.No;
}
mixin template QParse(string name, string defaultv, RET, ARGS...) if ((EnumMembers!RET).length-1 == ARGS.length) {
mixin("""RET " ~ name ~ "(string text) {
string[] stes = text.split(\",\");
foreach(ste; stes) {
switch(ste) {
" ~ QParseGrabCases!(RET, ARGS) ~ "
default:
return RET." ~ defaultv ~ ";
}
}
return RET." ~ defaultv ~ ";
}""");
}
mixin template QParseOther(string name, RET, ARGS...) if ((EnumMembers!RET).length-1 == ARGS.length) {
mixin("""RET " ~ name ~ "(string text, ref string other) {
string[] stes = text.split(\",\");
foreach(ste; stes) {
switch(ste) {
" ~ QParseGrabCases!(RET, ARGS) ~ "
case \"Other\":
continue;
default:
other = ste;
return RET.Other;
}
}
return RET.Other;
}""");
}
pure string QParseGrabCases(RET, ARGS...)() {
string ret;
enum members = EnumMembers!RET;
foreach(i, arg; ARGS) {
ret ~= " case \"" ~ arg ~ "\":\n";
ret ~= " return " ~ members[i].stringof ~ ";\n";
}
return ret;
}
mixin template QParseOtherBitwise(string name, RET, ARGS...) if ((EnumMembers!RET).length-2 == ARGS.length) {
mixin("""size_t " ~ name ~ "(string text, ref string other) {
size_t ret;
string[] stes = text.split(\",\");
foreach(ste; stes) {
switch(ste) {
" ~ QParseGrabCasesBitwise!(RET, ARGS) ~ "
case \"Other\":
continue;
default:
other = ste;
ret |= RET.Other;
break;
}
}
return ret;
}""");
}
pure string QParseGrabCasesBitwise(RET, ARGS...)() {
string ret;
enum members = (EnumMembers!RET)[1 .. $];
foreach(i, arg; ARGS) {
ret ~= " case \"" ~ arg ~ "\":\n";
ret ~= " ret |= " ~ members[i].stringof ~ ";\n";
ret ~= " break;\n";
}
return ret;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment