#ifndef KIT_ALLOCATOR_H
#define KIT_ALLOCATOR_H

#include "types.h"

#ifdef __cplusplus
extern "C" {
#endif

enum {
  KIT_ALLOC_TYPE_NONE,
  KIT_ALLOC_TYPE_DEFAULT,
  KIT_ALLOC_TYPE_BUFFER
};

enum {
  KIT_ALLOCATE,
  KIT_ALLOCATE_ZERO,
  KIT_DEALLOCATE,
  KIT_REALLOCATE,
  KIT_REALLOCATE_ZERO,
  KIT_DEALLOCATE_ALL
};

typedef struct {
  i32 type;
  i64 size;
  union {
    u8   *bytes;
    void *data;
  };
} kit_allocator_t;

//  Application should implement this function if custom allocator
//  dispatch is enabled.
//
//  See KIT_ENABLE_CUSTOM_ALLOC_DISPATCH macro.
//
void *kit_alloc_dispatch(kit_allocator_t *alloc, i32 request,
                         i64 size, i64 previous_size, void *pointer);

kit_allocator_t kit_alloc_default(void);

kit_allocator_t kit_alloc_buffer(i64 size, void *buffer);

#ifdef __cplusplus
}
#endif

#endif