/**
* =========================================================================
* File        : mem.h
* Project     : 0 A.D.
* Description : wrapper that treats memory as a "resource", i.e.
*             : guarantees its lifetime and automatic release.
*
* @author Jan.Wassenberg@stud.uni-karlsruhe.de
* =========================================================================
*/

/*
* Copyright (c) 2003 Jan Wassenberg
*
* Redistribution and/or modification are also permitted under the
* terms of the GNU General Public License as published by the
* Free Software Foundation (version 2 or later, at your option).
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/

#ifndef MEM_H__
#define MEM_H__

#include "handle.h"


#ifdef __cplusplus
extern "C" {
#endif

typedef void (*MEM_DTOR)(void* p, size_t size, uintptr_t ctx);

// mem_alloc flags
enum
{
	// RES_*

	MEM_ZERO = 0x1000
};

extern void* mem_alloc(size_t size, size_t align = 1, uint flags = 0, Handle* ph = 0);

#define mem_free(p) mem_free_p((void*&)p)
extern LibError mem_free_p(void*& p);

extern LibError mem_free_h(Handle& hm);

// returns 0 if the handle is invalid
extern void* mem_get_ptr(Handle h, size_t* size = 0);

extern LibError mem_get(Handle hm, u8** pp, size_t* psize);


extern Handle mem_wrap(void* p, size_t size, uint flags, void* raw_p, size_t raw_size, MEM_DTOR dtor, uintptr_t ctx, void* owner);

// exception to normal resource shutdown: must not be called before
// h_mgr_shutdown! (this is because h_mgr calls us to free memory, which
// requires the pointer -> Handle index still be in place)
extern void mem_shutdown(void);





#ifdef __cplusplus
}
#endif

#endif	// #ifndef MEM_H__
