1 module profdump; 2 3 import containers; 4 5 alias HASH = ubyte[4]; 6 7 import std.typecons : RefCounted; 8 9 alias String = RefCounted!(DynamicArray!char); 10 11 struct Function { 12 private { 13 String m_name; 14 ulong m_calls; 15 } 16 17 this(string name, ulong calls = 0) { 18 m_name.reserve(name.length); 19 foreach(ref c; name) 20 m_name ~= c; 21 m_calls = calls; 22 } 23 24 this(String name, ulong calls = 0) { 25 m_name = name; 26 m_calls = calls; 27 } 28 29 @property: 30 auto name() { return m_name; } 31 void name(String m) { m_name = m; } 32 33 auto calls() { return m_calls; } 34 void calls(ulong c) { m_calls = c; } 35 36 HASH hashOf() { 37 import std.digest.murmurhash : MurmurHash3; 38 import std.digest : digest; 39 40 return m_name[].digest!(MurmurHash3!32); 41 } 42 } 43 44 @("Function is alrighty") 45 unittest { 46 Function("_Dmain", 1).hashOf; 47 } 48 49 alias FuncMap = RefCounted!(HashMap!(HASH, Function)); 50 51 struct Entity { 52 private { 53 Function m_function; 54 FuncMap m_callsTo; 55 FuncMap m_calledBy; 56 ulong m_time; 57 ulong m_total_time; 58 } 59 60 alias m_function this; 61 62 @property: 63 auto callsTo() { return m_callsTo; } 64 void callsTo(typeof(m_callsTo) t) { m_callsTo = t; } 65 void callsTo(Function f) 66 in(f.hashOf !in m_callsTo) { 67 m_callsTo[f.hashOf] = f; 68 } 69 70 auto calledBy() { return m_calledBy; } 71 void calledBy(typeof(m_callsTo) t) { m_calledBy = t; } 72 void calledBy(Function f) 73 in(f.hashOf !in m_calledBy) { 74 m_calledBy[f.hashOf] = f; 75 } 76 77 auto time() { return m_time; } 78 void time(ulong t) { m_time = t; } 79 80 auto totalTime() { return m_total_time; } 81 void totalTime(ulong t) { m_total_time = t; } 82 }