#ifndef REPTESTER_H
#define REPTESTER_H

#include "aliases.h"

struct reptest_params {
  const char *filename;
  char *buffer;
  u64 read_size;
  u64 read_count;
};

struct reptest_results {
  u64 bytes_read;
  u64 read_time;
};

struct reptester {
  reptest_params params;

  const u64 cpu_freq;

  f64 wait_time_secs;
  f64 test_time_secs;
  u64 test_start_time;

  u64 current_run;
  u64 min;
  u64 max;
  u64 avg;
  u64 total;

  reptest_results results;
};

enum alloc_type {
  ALLOC_TYPE_WITHOUT_MALLOC,
  ALLOC_TYPE_WITH_MALLOC,

  COUNT_ALLOC_TYPE,
};

typedef void (*reptest_func)(reptester *tester, alloc_type type);

struct func_data {
  const char *names[COUNT_ALLOC_TYPE];
  reptest_func func;
};

void handle_alloc(reptester *tester, alloc_type type);
void handle_free(reptester *tester, alloc_type type);
void run_func_test(reptester *tester, reptest_func func, const char *func_name,
                   alloc_type type);
void print_results(reptester *tester, const char *name);

#endif // !REPTESTER_H