91 lines
3.5 KiB
C++
91 lines
3.5 KiB
C++
/**
|
|||
|
|
* @file kBytes.cpp
|
||
|
|
*
|
||
|
|
* @internal
|
||
|
|
* Copyright (C) 2012-2021 by LMI Technologies Inc.
|
||
|
|
* Licensed under the MIT License.
|
||
|
|
* Redistributed files must retain the above copyright notice.
|
||
|
|
*/
|
||
|
|
#include <kApi/Data/kBytes.h>
|
||
|
|
#include <kApi/kApiLib.h>
|
||
|
|
#include <kApi/Io/kSerializer.h>
|
||
|
|
#include <stdio.h>
|
||
|
|
|
||
|
|
static kType kBytes_types[xkBYTES_CAPACITY] = { 0 };
|
||
|
|
|
||
|
|
kFx(kStatus) xkBytes_AddTypes(kAssembly assembly)
|
||
|
|
{
|
||
|
|
kChar name[64];
|
||
|
|
kSize i;
|
||
|
|
|
||
|
|
kCheck(kMemSet(&kBytes_types[0], 0, sizeof(kBytes_types)));
|
||
|
|
|
||
|
|
//add each kByteN type
|
||
|
|
for (i = 1; i < xkBYTES_CAPACITY; ++i)
|
||
|
|
{
|
||
|
|
kCheck(kStrPrintf(name, kCountOf(name), "kByte%u", i));
|
||
|
|
kCheck(xkAssembly_AddType(assembly, xkBytes_Register, name));
|
||
|
|
}
|
||
|
|
|
||
|
|
return kOK;
|
||
|
|
}
|
||
|
|
|
||
|
|
kFx(kStatus) xkBytes_Register(kAssembly assembly, const kChar* name)
|
||
|
|
{
|
||
|
|
kSize guid5Base = 0x40000000;
|
||
|
|
kChar guid5[64];
|
||
|
|
kChar guid6[64];
|
||
|
|
k32u typeIndex;
|
||
|
|
|
||
|
|
kCheckArgs(sscanf(name, "kByte%u", &typeIndex) == 1);
|
||
|
|
|
||
|
|
kCheck(kStrPrintf(guid5, kCountOf(guid5), "%u-0", guid5Base + typeIndex));
|
||
|
|
kCheck(kStrPrintf(guid6, kCountOf(guid6), "kBytes%u-0", typeIndex));
|
||
|
|
|
||
|
|
kCheck(xkAssembly_AddValue(assembly, &kBytes_types[typeIndex], name, kTypeOf(kValue), "kValue", typeIndex, kTYPE_FLAGS_VALUE));
|
||
|
|
|
||
|
|
kCheck(xkType_AddVMethod(kBytes_types[typeIndex], offsetof(kValueVTable, VEquals)/sizeof(kPointer), (kFunction)xkBytes_VEquals, "VEquals"));
|
||
|
|
kCheck(xkType_AddVMethod(kBytes_types[typeIndex], offsetof(kValueVTable, VHashCode)/sizeof(kPointer), (kFunction)xkBytes_VHashCode, "VHashCode"));
|
||
|
|
|
||
|
|
kCheck(xkType_AddVersion(kBytes_types[typeIndex], "kdat5", "5.0.0.0", guid5, (kFunction)xkBytes_Write, (kFunction)xkBytes_Read, kTRUE));
|
||
|
|
kCheck(xkType_AddVersion(kBytes_types[typeIndex], "kdat6", "5.7.1.0", guid6, (kFunction)xkBytes_Write, (kFunction)xkBytes_Read, kTRUE));
|
||
|
|
|
||
|
|
return kOK;
|
||
|
|
}
|
||
|
|
|
||
|
|
kFx(kBool) xkBytes_VEquals(kType type, const void* value, const void* other)
|
||
|
|
{
|
||
|
|
return kMemEquals(value, other, kType_Size(type));
|
||
|
|
}
|
||
|
|
|
||
|
|
kFx(kSize) xkBytes_VHashCode(kType type, const void* value)
|
||
|
|
{
|
||
|
|
return xkHashBytes(value, kType_Size(type));
|
||
|
|
}
|
||
|
|
|
||
|
|
kFx(kStatus) xkBytes_Write(kType type, const void* values, kSize count, kSerializer serializer)
|
||
|
|
{
|
||
|
|
return kSerializer_WriteByteArray(serializer, (const kByte*) values, kType_Size(type)*count);
|
||
|
|
}
|
||
|
|
|
||
|
|
kFx(kStatus) xkBytes_Read(kType type, void* values, kSize count, kSerializer serializer)
|
||
|
|
{
|
||
|
|
return kSerializer_ReadByteArray(serializer, (kByte*) values, kType_Size(type)*count);
|
||
|
|
}
|
||
|
|
|
||
|
|
kFx(kType) kBytes_GetType(kSize size)
|
||
|
|
{
|
||
|
|
if (size < xkBYTES_CAPACITY)
|
||
|
|
{
|
||
|
|
return kBytes_types[size];
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
//If this assertion fails, the requested size is larger than the maximum size
|
||
|
|
//supported by the kTYPE_BYTES macro. Consider defining a custom value type instead.
|
||
|
|
kAssert(size < xkBYTES_CAPACITY);
|
||
|
|
|
||
|
|
return kNULL;
|
||
|
|
}
|
||
|
|
}
|