#ifndef MM_STACK_H_
#define MM_STACK_H_
#include "utils/vector.h"
#define MM_STACK_ALIGNMENT 8
typedef struct {
uint64_t segment_size; vector_t* segments; uint64_t current_segment_idx; vector_t* malloc_requests; vector_t* states; } mm_stack_t;
mm_stack_t* mm_stack_new(
const uint64_t segment_size);
void mm_stack_clear(
mm_stack_t* const mm_stack);
void mm_stack_delete(
mm_stack_t* const mm_stack);
void* mm_stack_allocate(
mm_stack_t* const mm_stack,
const uint64_t num_bytes,
const bool zero_mem,
const uint64_t align_bytes);
#define mm_stack_alloc(mm_stack,type) \
((type*)mm_stack_allocate(mm_stack,sizeof(type),false,MM_STACK_ALIGNMENT))
#define mm_stack_malloc(mm_stack,num_bytes) \
(mm_stack_allocate(mm_stack,num_bytes,false,MM_STACK_ALIGNMENT))
#define mm_stack_calloc(mm_stack,num_elements,type,clear_mem) \
((type*)mm_stack_allocate(mm_stack,(num_elements)*sizeof(type),clear_mem,MM_STACK_ALIGNMENT))
#define mm_stack_uint64(mm_stack) mm_stack_malloc(mm_stack,sizeof(uint64_t))
#define mm_stack_uint32(mm_stack) mm_stack_malloc(mm_stack,sizeof(uint32_t))
#define mm_stack_uint16(mm_stack) mm_stack_malloc(mm_stack,sizeof(uint16_t))
#define mm_stack_uint8(mm_stack) mm_stack_malloc(mm_stack,sizeof(uint8_t))
void mm_stack_push(
mm_stack_t* const mm_stack);
void mm_stack_pop(
mm_stack_t* const mm_stack);
void mm_stack_print(
FILE* const stream,
mm_stack_t* const mm_stack);
#endif