#pragma once

#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>

typedef struct JSMallocFunctions JSMallocFunctions;

void tf_mem_startup(bool tracking);
void tf_mem_shutdown();

void tf_mem_replace_uv_allocator();
size_t tf_mem_get_uv_malloc_size();

void tf_mem_replace_tls_allocator();
size_t tf_mem_get_tls_malloc_size();

void tf_mem_replace_sqlite_allocator();
size_t tf_mem_get_sqlite_malloc_size();

size_t tf_mem_get_tf_malloc_size();

void* tf_malloc(size_t size);
void* tf_realloc(void* ptr, size_t size);
void tf_free(void* ptr);
char* tf_strdup(const char* string);

void* tf_resize_vec(void* ptr, size_t size);

void tf_get_js_malloc_functions(JSMallocFunctions* out);
size_t tf_mem_get_js_malloc_size();

void tf_mem_walk_allocations(void (*callback)(void* ptr, size_t size, int frames_count, void* const* frames, void* user_data), void* user_data);

typedef struct _tf_mem_allocation_t
{
	uint32_t stack_hash;
	int count;
	size_t size;
	void* frames[32];
	int frames_count;
} tf_mem_allocation_t;

tf_mem_allocation_t* tf_mem_summarize_allocations(int* out_count);
