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 }