#ifndef TIMER_H
#define TIMER_H

#include "aliases.h"

#ifndef MAX_PROFILE_SAMPLES
#define MAX_PROFILE_SAMPLES 1024
#endif // !MAX_PROFILE_SAMPLES

#ifdef ENABLE_PROFILING
#define PROFILE_START(COUNT) profile_start(COUNT)
#define PROFILE_END profile_end()
#define SAMPLE_START(ID, TITLE) sample_start(ID, TITLE)
#define SAMPLE_END(ID) sample_end(ID)
#else
#define PROFILE_START(COUNT)
#define PROFILE_END
#define SAMPLE_START(ID, TITLE)
#define SAMPLE_END(ID)
#endif // ENABLE_PROFILING

#ifdef __cplusplus
extern "C" {
#endif

typedef struct sample profiler_sample_t;

struct sample {
  const char *title;
  u64 first_start;
  u64 start;
  u64 exclusive_time;
  u64 children_time;
  u64 hit_count;
  profiler_sample_t *parent;
};

u64 get_os_frequency();

// Time in nanoseconds
u64 get_os_time(void);

// CPU timer using rdtsc
u64 read_cpu_timer(void);

// CPU frequency in hz/sec
u64 get_cpu_freq(u64 milliseconds);

void profile_start(u64 count);
void profile_end();

void sample_start(u64 id, const char *title);
void sample_end(u64 id);

#ifdef __cplusplus
}
#endif

#endif // !TIMER_H