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 }