#ifndef _MEMORY_SMGR_INIT_H
	#define MEMORY_SMGR_INIT_H
	
	#include "../include/posix_types.h"
	
	#define _I	(which/8)
	
	#ifdef __cplusplus
	extern "C" {
	#endif
	
struct memory_smgr_init_t
{
	uarch_t total_kb; 			//You will get approx. 640 KB in real mode. But the BMP works with 1024.
	uarch_t total_pages;		//640KB = 160 pages. But the BMP works with 1MB, so you get 256 Pages.
	uchar8 page_map[(((1024*1024)/4096)/8)+(((1024*1024)/4096)%8)];		//1 bit per page.
	//RealMode_MAlloc is a pointer to func taking size_t and returning (void*)
	void *(*rm_malloc)(size_t, memory_smgr_init_t*);
	uarch_t (*find_free_pages)(size_t, memory_smgr_init_t*); //Same here.
	void (*set_page_used)(uarch_t which, memory_smgr_init_t*);
	void (*set_page_unused)(uarch_t which, memory_smgr_init_t*);
	uarch_t (*page_is_used)(uarch_t which, memory_smgr_init_t*);
	uarch_t (*bytes_to_pages)(size_t);
	uarch_t (*addr_to_page)(uarch_t);
	
	void (*destructor)();
};

void mem_smgr_init_constructor(memory_smgr_init_t*);
void mem_smgr_init_destructor(void);

void *rm_malloc_f(size_t, memory_smgr_init_t*);
uarch_t find_free_pages_f(size_t, memory_smgr_init_t*);
void set_page_used_f(uarch_t which, memory_smgr_init_t*);
void set_page_unused_f(uarch_t which, memory_smgr_init_t*);
uarch_t page_is_used_f(uarch_t which, memory_smgr_init_t*);
uarch_t bytes_to_pages_f(size_t);
uarch_t addr_to_page_f(uarch_t);

	#ifdef __cplusplus
	}
	#endif

#endif
