| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 | #ifndef __API_MEMMGR_H#define __API_MEMMGR_H#include <bfc/dispatch.h>#include <bfc/platform/types.h>#include <new>class NOVTABLE api_memmgr : public Dispatchable{protected:	api_memmgr() {}	~api_memmgr() {}public:	void *sysMalloc(size_t size);	void sysFree(void *ptr);	void *sysRealloc(void *ptr, size_t newsize);	void sysMemChanged(void *ptr);	DISPATCH_CODES	{		API_MEMMGR_SYSMALLOC = 0,		API_MEMMGR_SYSFREE = 10,		API_MEMMGR_SYSREALLOC = 20,		API_MEMMGR_SYSMEMCHANGED = 30,	};	// Some helper templates to new and delete objects with the memory manager	// you need to be cautious with Delete() and inheritance, particularly if you're dealing with a base class	// as the pointer to the derived class might not equal to the pointer to the base class, particularly with multiple inheritance	// e.g. class C : public A, public B {};  C c; assert((A*)&c == (B*)&c); will likely fail	template <class Class>		void New(Class **obj)	{		size_t toAlloc = sizeof(Class);		void *mem = sysMalloc(toAlloc);		*obj = new (mem) Class;	}	template <class Class>		void Delete(Class *obj)	{		if (obj)		{			obj->~Class();			sysFree(obj);		}	}};inline void *api_memmgr::sysMalloc(size_t size){	return _call(API_MEMMGR_SYSMALLOC, (void *)NULL, size);}inline void api_memmgr::sysFree(void *ptr){	_voidcall(API_MEMMGR_SYSFREE, ptr);}inline void *api_memmgr::sysRealloc(void *ptr, size_t newsize){	return _call(API_MEMMGR_SYSREALLOC, (void *)NULL, ptr, newsize);}inline void api_memmgr::sysMemChanged(void *ptr){	_voidcall(API_MEMMGR_SYSMEMCHANGED, ptr);}// {000CF46E-4DF6-4a43-BBE7-40E7A3EA02ED}static const GUID memMgrApiServiceGuid ={ 0xcf46e, 0x4df6, 0x4a43, { 0xbb, 0xe7, 0x40, 0xe7, 0xa3, 0xea, 0x2, 0xed } };extern api_memmgr *memmgrApi;#endif
 |