// Copyright (c) 2023 Yuki Kimoto
// MIT License

#ifndef SPVM_ALLOCATOR_H
#define SPVM_ALLOCATOR_H

#include "spvm_typedecl.h"

enum {
  SPVM_ALLOCATOR_C_ALLOC_TYPE_TMP = 0,
  SPVM_ALLOCATOR_C_ALLOC_TYPE_PERMANENT = 1,
};

struct spvm_allocator {
  void** permanent_memory_blocks;
  
  int32_t permanent_memory_blocks_length;
  
  int32_t permanent_memory_blocks_capacity;
  
  int32_t memory_blocks_count_tmp;
  
  int32_t memory_blocks_count_permanent;
};

SPVM_ALLOCATOR* SPVM_ALLOCATOR_new();

int32_t SPVM_ALLOCATOR_get_memory_blocks_count(SPVM_ALLOCATOR* allocator);

void* SPVM_ALLOCATOR_alloc_memory_block_unmanaged(size_t size);

void SPVM_ALLOCATOR_free_memory_block_unmanaged(void* block);

void* SPVM_ALLOCATOR_alloc_memory_block_tmp(SPVM_ALLOCATOR* allocator, size_t size);

void SPVM_ALLOCATOR_free_memory_block_tmp(SPVM_ALLOCATOR* allocator, void* block);

void* SPVM_ALLOCATOR_alloc_memory_block_permanent(SPVM_ALLOCATOR* allocator, size_t size);

void SPVM_ALLOCATOR_free(SPVM_ALLOCATOR* allocator);

#endif