Merge pull request #16 from thaven/fix/dictionary

Dictionary related improvements
This commit is contained in:
Tristan Hume 2017-06-20 19:57:15 -07:00 committed by GitHub
commit 56f90644ce
2 changed files with 59 additions and 23 deletions

View file

@ -59,11 +59,13 @@ template canDBus(T) {
} else static if(isTuple!T) {
enum canDBus = allCanDBus!(T.Types);
} else static if(isInputRange!T) {
enum canDBus = canDBus!(ElementType!T);
static if(is(ElementType!T == DictionaryEntry!(K, V), K, V)) {
enum canDBus = basicDBus!K && canDBus!V;
} else {
enum canDBus = canDBus!(ElementType!T);
}
} else static if(isAssociativeArray!T) {
enum canDBus = canDBus!(KeyType!T) && canDBus!(ValueType!T);
} else static if(is(T == DictionaryEntry!(K, V), K, V)) {
enum canDBus = canDBus!K && canDBus!V;
enum canDBus = basicDBus!(KeyType!T) && canDBus!(ValueType!T);
} else {
enum canDBus = false;
}
@ -110,8 +112,6 @@ string typeSig(T)() if(canDBus!T) {
}
sig ~= ")";
return sig;
} else static if(is(T == DictionaryEntry!(K, V), K, V)) {
return '{' ~ typeSig!K ~ typeSig!V ~ '}';
} else static if(isInputRange!T) {
return "a" ~ typeSig!(ElementType!T)();
} else static if(isAssociativeArray!T) {
@ -119,6 +119,12 @@ string typeSig(T)() if(canDBus!T) {
}
}
string typeSig(T)() if(isInstanceOf!(DictionaryEntry, T)) {
alias typeof(T.key) K;
alias typeof(T.value) V;
return "{" ~ typeSig!K ~ typeSig!V ~ '}';
}
string[] typeSigReturn(T)() if(canDBus!T) {
static if(is(T == Tuple!TS, TS...))
return typeSigArr!TS;
@ -149,6 +155,10 @@ int typeCode(T)() if(canDBus!T) {
return typeSig!T()[0];
}
int typeCode(T)() if(isInstanceOf!(DictionaryEntry, T) && canDBus!(T[])) {
return 'e';
}
unittest {
import dunit.toolkit;
// basics
@ -165,7 +175,7 @@ unittest {
typeSig!(Tuple!(byte)[][]).assertEqual("aa(y)");
// dictionaries
typeSig!(int[string]).assertEqual("a{si}");
typeSig!(DictionaryEntry!(string, int)).assertEqual("{si}");
typeSig!(DictionaryEntry!(string, int)[]).assertEqual("a{si}");
// multiple arguments
typeSigAll!(int,bool).assertEqual("ib");
// type codes