2#include <engine/engine_export.h>
10#include <hpp/string_view.hpp>
19 std::is_same_v<std::remove_extent_t<std::remove_reference_t<T>>,
const char>;
34 operator float()
const
55 "ERROR: add_record() only accepts string literals for memory safety. "
56 "Use: add_record(\"literal_name\", time) instead of add_record(variable_name, time)");
57 add_record_internal(
name, time);
62 current_ = get_next_index();
68 return per_frame_data_[get_next_index()];
73 return per_frame_data_[current_];
79 void add_record_internal(
const char*
name,
float time)
83 auto& data = per_frame[
name];
88 auto get_next_index() const ->
int
90 return (current_ + 1) % per_frame_data_.size();
93 std::array<record_data_t, 2> per_frame_data_;
103 using clock_t = std::chrono::high_resolution_clock;
113 : name_(
name), profiler_(profiler)
116 "ERROR: scope_perf_timer only accepts string literals for memory safety. "
117 "Use: scope_perf_timer(\"literal_name\", profiler) instead of scope_perf_timer(variable_name, profiler)");
122 auto end = clock_t::now();
123 auto time = std::chrono::duration_cast<duration_t>(end - start_);
125 profiler_->add_record_internal(name_, time.count());
138#define APP_SCOPE_PERF_CONCATENATE_DETAIL(x, y) x##y
139#define APP_SCOPE_PERF_CONCATENATE(x, y) APP_SCOPE_PERF_CONCATENATE_DETAIL(x, y)
142#define APP_SCOPE_PERF_UNIQUE_VAR(prefix) APP_SCOPE_PERF_CONCATENATE(prefix, __LINE__)
160#define APP_SCOPE_PERF(name) const scope_perf_timer APP_SCOPE_PERF_UNIQUE_VAR(timer)(name, get_app_profiler())
std::chrono::high_resolution_clock clock_t
scope_perf_timer(T &&name, performance_profiler *profiler)
Constructor that only accepts string literals for safety.
std::chrono::duration< float, std::milli > duration_t
clock_t::time_point timepoint_t
Concept to ensure only string literals are accepted.
auto get_app_profiler() -> performance_profiler *