3 #include <geneial/namespaces.h>
5 #include <unordered_map>
15 geneial_private_namespace(geneial)
17 geneial_private_namespace(population)
19 geneial_private_namespace(management)
22 geneial_export_namespace
27 virtual ~ScopedTrace()
42 virtual ~BaseBookkeeper()
46 virtual std::unique_ptr<ScopedTrace> scopedEventTrace(
const char* traceName) = 0;
48 virtual void traceEvent(
const char* traceName) = 0;
50 virtual void traceEvent(
const char* traceName, EventData* data) = 0;
54 class EventValueData :
public EventData
58 EventValueData(
const T value) :
64 virtual ~EventValueData()
68 static inline void create(BaseBookkeeper &bookkeeper,
const char* name,
const T value)
70 EventValueData * evd =
new EventValueData(value);
71 bookkeeper.traceEvent(name,evd);
80 class DefaultBookkeeper:
public BaseBookkeeper
83 virtual ~DefaultBookkeeper()
87 virtual std::unique_ptr<ScopedTrace> scopedEventTrace(
const char*)
override
89 return std::unique_ptr<ScopedTrace>(
nullptr);
92 virtual void traceEvent(
const char*)
override
96 virtual void traceEvent(
const char*, EventData* evd)
override
102 class ScopedTimeTrace;
105 class StatisticBookkeeper:
public BaseBookkeeper
108 friend ScopedTimeTrace;
112 std::unordered_multimap<std::string,
113 std::unique_ptr<EventData>> _events;
115 StatisticBookkeeper& operator= (
const StatisticBookkeeper & ) =
delete;
116 StatisticBookkeeper(StatisticBookkeeper
const&) =
delete;
118 void traceTime(
const char* name,
const double duration)
120 EventValueData<double>::create(*
this,name,duration);
125 StatisticBookkeeper()
128 virtual std::unique_ptr<ScopedTrace> scopedEventTrace(
const char* traceName)
override;
130 virtual void traceEvent(
const char* traceName)
override
132 _events.insert(std::make_pair(std::string(traceName),std::unique_ptr<EventData>(
new EventData())));
135 virtual void traceEvent(
const char* traceName, EventData* data)
override
137 _events.insert(std::make_pair(std::string(traceName),std::unique_ptr<EventData>(data)));
140 virtual ~StatisticBookkeeper()
144 std::unordered_multimap<std::string, std::unique_ptr<EventData> >& getEvents()
150 class ScopedTimeTrace:
public ScopedTrace
153 std::chrono::high_resolution_clock::time_point _start;
154 StatisticBookkeeper* _bookKeeper;
157 friend StatisticBookkeeper;
160 ScopedTimeTrace(StatisticBookkeeper *bookKeeper,
const char* traceName) :
161 _start(std::chrono::high_resolution_clock::now()),
162 _bookKeeper(bookKeeper),
168 virtual ~ScopedTimeTrace()
170 const std::chrono::high_resolution_clock::time_point end = std::chrono::high_resolution_clock::now();
171 const auto duration = std::chrono::duration_cast<std::chrono::duration<double,std::milli>>(end - _start).count();
173 _bookKeeper->traceTime(_name.c_str(), duration);
180 std::unique_ptr<ScopedTrace> _trace;
182 ScopedEvent(
const char* name,BaseBookkeeper &bookkeeper):
183 _trace(bookkeeper.scopedEventTrace(name))