#ifndef MEM_ALLOCATOR_H
#define MEM_ALLOCATOR_H

#include "aliases.h"

#ifdef __cplusplus
extern "C" {
#endif // __cplusplus

typedef void *(MemAllocFunc)(u64 size, void *alloc_obj);
typedef void *(MemAllocAlignedFunc)(u64 size, u64 alignment, void *alloc_obj);
typedef void *(MemReallocFunc)(void *ptr, u64 size, void *alloc_obj);
typedef void *(MemReallocAlignedFunc)(void *ptr, u64 size, u64 alignment,
                                      void *alloc_obj);
typedef void(MemFreeFunc)(void **ptr, void *alloc_obj);

typedef struct allocator Allocator;
struct allocator {
  void *obj;
  MemAllocFunc *alloc;
  MemAllocAlignedFunc *alloc_aligned;
  MemReallocFunc *realloc;
  MemReallocAlignedFunc *realloc_aligned;
  MemFreeFunc *free;
};

void *wapp_mem_allocator_alloc(const Allocator *allocator, u64 size);
void *wapp_mem_allocator_alloc_aligned(const Allocator *allocator, u64 size,
                                       u64 alignment);
void *wapp_mem_allocator_realloc(const Allocator *allocator, void *ptr,
                                 u64 size);
void *wapp_mem_allocator_realloc_aligned(const Allocator *allocator, void *ptr,
                                         u64 size, u64 alignment);
void wapp_mem_allocator_free(const Allocator *allocator, void **ptr);

#ifdef __cplusplus
}
#endif // __cplusplus

#endif // !MEM_ALLOCATOR_H