
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stddef.h>

#define MALLOC_ALIGN		sizeof(size_t)
#define MALLOC_ALIGN_TYPE	size_t
#define MEMMNGR_INIT_MIN_SIZE	0x1000
#define MEMMNGR_INIT_MAX_SIZE	0x10000000

typedef enum Color {RED = 0, BLACK = 1} Color;

typedef struct RBNode RBNode;

struct RBNode
{
	size_t key;
	RBNode *parent;
	RBNode *left;
	RBNode *right;
	RBNode *next;
	Color color;
};


#define MALLOC_MIN_ALLOC_SIZE (sizeof(RBNode) - sizeof(size_t))


typedef struct RBTree RBTree;

struct RBTree
{
	RBNode * root;
	RBNode tempnode;
};

typedef struct header{
	void * p;
	size_t size;
} Header;

typedef struct memmngr{
	void * end_ptr;
	void * beg_ptr;
	Header *fh;
	RBTree tree;
	void * bp;
} Memmngr;

void * mem_alloc(size_t size);
void * mem_realloc(void * addr, size_t size);
void mem_free(void * addr);
void mem_dump(void);

int memmngr_init(void * start, size_t size);

/* Return 0 if pointer is not in memmgr range*/
int is_ptr_in_memmngr_range(const void* ptr);


