1 module utile.binary.helpers; 2 import std.meta, std.traits, std.array, std.range, std.traits, utile.binary.attrs; 3 4 template isDataSimple(T) 5 { 6 static if (isBasicType!T) 7 { 8 enum isDataSimple = true; 9 } 10 else static if (isStaticArray!T) 11 { 12 enum isDataSimple = isDataSimple!(ElementEncodingType!T); 13 } 14 else 15 { 16 enum isDataSimple = false; 17 } 18 } 19 20 @property fieldsToProcess(T)() 21 { 22 int k, sz; 23 24 string u; 25 string[] res; 26 27 void add() 28 { 29 if (u.length) 30 { 31 res ~= u; 32 u = null; 33 } 34 } 35 36 foreach (name; __traits(allMembers, T)) 37 { 38 static if (__traits(getProtection, __traits(getMember, T, name)) == `public`) 39 { 40 alias E = Alias!(__traits(getMember, T, name)); 41 42 static if (!(is(FunctionTypeOf!E == function) || hasUDA!(E, Ignored))) 43 { 44 static if (is(typeof(E.offsetof)) && isAssignable!(typeof(E))) 45 { 46 const x = E.offsetof, s = E.sizeof; 47 48 if (k != x) 49 { 50 add; 51 u = name; 52 53 k = x; 54 sz = s; 55 } 56 else if (s > sz) 57 { 58 u = name; 59 sz = s; 60 } 61 } 62 else static if (__traits(compiles, &E) && is(typeof(E) == immutable)) 63 { 64 add; 65 res ~= name; 66 } 67 } 68 } 69 } 70 71 add; 72 return res; 73 }