1 2 module dquery.d; 3 4 import std.traits; 5 import std.typetuple; 6 7 public import dquery.attribute; 8 public import dquery.attributes; 9 public import dquery.element; 10 public import dquery.helper; 11 public import dquery.overload; 12 public import dquery.query; 13 14 /++ 15 + Produces a query over the given type. 16 + 17 + Returns: 18 + A query over the supplied type. 19 ++/ 20 auto query(QueryType, bool Safe = false)() 21 { 22 template MapToElement(string Name) 23 { 24 // Check for functions; each overload is kept as an element. 25 static if(is(typeof(GetMember!(QueryType, Name)) == function)) 26 { 27 alias MapToOverload(alias Overload) = Alias!( 28 DQueryElement!( 29 QueryType, Name, DQueryOverload!( 30 arity!Overload, ReturnType!Overload, ParameterTypeTuple!Overload 31 )() 32 )() 33 ); 34 35 alias MapToElement = staticMap!( 36 MapToOverload, __traits(getOverloads, QueryType, Name) 37 ); 38 } 39 // Normal members. 40 else 41 { 42 alias MapToElement = Alias!(DQueryElement!(QueryType, Name)()); 43 } 44 } 45 46 template SafeMap(string Name) 47 { 48 static if(__traits(compiles, MapToElement!Name) || Safe) 49 { 50 alias SafeMap = MapToElement!Name; 51 } 52 else 53 { 54 alias SafeMap = TypeTuple!(); 55 } 56 } 57 58 enum Elements = __traits(allMembers, QueryType); 59 return DQuery!(QueryType, staticMap!(SafeMap, Elements))(); 60 } 61 62 /++ 63 + Produces a query over the type of the supplied parameter. 64 + 65 + Params: 66 + value = A parameter to type query. 67 + 68 + Returns: 69 + A query over the parameter's type. 70 ++/ 71 auto query(QueryType)(QueryType value) 72 { 73 return query!QueryType; 74 }