#include "bee2/core/mem.h"
#include "bee2/core/obj.h"
#include "bee2/core/util.h"
#define objHdr(obj)\
((obj_hdr_t*)obj)
bool_t objIsOperable2(const void* obj)
{
return memIsValid(obj, sizeof(obj_hdr_t)) &&
memIsValid(obj, objKeep(obj)) &&
objOCount(obj) <= objPCount(obj) &&
sizeof(obj_hdr_t) + sizeof(void*) * objPCount(obj) <= objKeep(obj);
}
bool_t objIsOperable(const void* obj)
{
size_t i;
if (!objIsOperable2(obj))
return FALSE;
for (i = 0; i < objOCount(obj); ++i)
if (!objIsOperable(objCPtr(obj, i, void)))
return FALSE;
return TRUE;
}
static void objShiftPtrs(void* obj, ptrdiff_t diff)
{
size_t i;
for (i = 0; i < objOCount(obj); ++i)
if ((octet*)obj <= objPtr(obj, i, octet) + diff &&
objPtr(obj, i, octet) + diff < objEnd(obj, octet))
{
objShiftPtrs(objPtr(obj, i, void), diff);
objPtr(obj, i, octet) += diff;
}
for (; i < objPCount(obj); ++i)
if ((octet*)obj <= objPtr(obj, i, octet) + diff &&
objPtr(obj, i, octet) + diff < objEnd(obj, octet))
objPtr(obj, i, octet) += diff;
}
void objCopy(void* dest, const void* src)
{
ASSERT(objIsOperable(src));
ASSERT(memIsValid(dest, objKeep(src)));
memMove(dest, src, objKeep(src));
objShiftPtrs(dest, (const octet*)dest - (const octet*)src);
}
void objAppend(void* dest, const void* src, size_t i)
{
size_t t;
ASSERT(objIsOperable(src));
ASSERT(objIsOperable(dest));
ASSERT(memIsValid(objEnd(dest, void), objKeep(src)));
ASSERT(i < objOCount(dest));
t = objKeep(src);
objCopy(objEnd(dest, void), src);
objPtr(dest, i, void) = objEnd(dest, void);
objHdr(dest)->keep += t;
}