Files
2024-05-18 23:53:26 +08:00

204 lines
5.6 KiB
C

/**
* @file kBox.h
* @brief Declares the kBox class.
*
* @internal
* Copyright (C) 2005-2021 by LMI Technologies Inc.
* Licensed under the MIT License.
* Redistributed files must retain the above copyright notice.
*/
#ifndef K_API_BOX_H
#define K_API_BOX_H
#include <kApi/kApiDef.h>
#include <kApi/Data/kBox.x.h>
/**
* @class kBox
* @extends kObject
* @ingroup kApi-Data
* @brief Represents an instance of a value type as an object.
*
* kBox provides a simple way to represent a single value (e.g. k32s) using a kObject-derived class instance.
* This approach can sometimes be used to reduce duplicated effort when both reference types and value types
* must be supported.
*
* kBox supports the kObject_Clone and kObject_Size methods.
*
* kBox supports the kdat5 and kdat6 serialization protocols.
*/
//typedef kObject kBox; --forward-declared in kApiDef.x.h
/**
* Constructs a kBox object.
*
* @public @memberof kBox
* @param box Receives the constructed object.
* @param itemType Type of box element (value types only).
* @param allocator Memory allocator (or kNULL for default).
* @return Operation status.
*/
kFx(kStatus) kBox_Construct(kBox* box, kType itemType, kAlloc allocator);
/**
* Reallocates the internal box item buffer.
*
* @public @memberof kBox
* @param box Box object.
* @param itemType Type of box element.
* @return Operation status.
*/
kFx(kStatus) kBox_Allocate(kBox box, kType itemType);
/**
* Copies the value contained within the source box into this box.
*
* @public @memberof kBox
* @param box Box object.
* @param source Source box to be copied.
* @return Operation status.
*/
kFx(kStatus) kBox_Assign(kBox box, kBox source);
/**
* Sets all box element bits to zero.
*
* @public @memberof kBox
* @param box Box object.
* @return Operation status.
*/
kFx(kStatus) kBox_Zero(kBox box);
/**
* Sets the box value.
*
* @public @memberof kBox
* @param box Box object.
* @param item Pointer to item that will be copied into the box.
* @return Operation status.
*/
kFx(kStatus) kBox_SetItem(kBox box, const void* item);
/**
* Sets the box value.
*
* A debug assertion will be raised if the size of the specified item type is not equal to the
* size of the collection item type.
*
* @relates kBox
* @param kBox_box Box object.
* @param TPtr_item Strongly-typed pointer to item that will be copied into the box.
* @return Operation status.
*/
#define kBox_SetItemT(kBox_box, TPtr_item) \
xkBox_SetItemT(kBox_box, TPtr_item, sizeof(*(TPtr_item)))
/**
* Gets the box value.
*
* @public @memberof kBox
* @param box Box object.
* @param item Destination for value copied from the box.
* @return Operation status.
*/
kFx(kStatus) kBox_Item(kBox box, void* item);
/**
* Sets the box value.
*
* A debug assertion will be raised if the size of the specified data type does not match the size of the box type.
*
* @relates kBox
* @param kBox_box Box object.
* @param T_value Item value.
* @param T Item type identifier (e.g., k32s).
* @return Item value.
*/
#define kBox_SetAsT(kBox_box, T_value, T) \
(kPointer_WriteAs(xkBox_AsT(kBox_box, sizeof(T)), T_value, T), (void)0)
/**
* Gets the box value.
*
* A debug assertion will be raised if the size of the specified data type does not match the size of the box type.
*
* @relates kBox
* @param kBox_box Box object.
* @param T Item type identifier (e.g., k32s).
* @return Item value.
*/
#define kBox_AsT(kBox_box, T) \
kPointer_ReadAs(xkBox_AsT(kBox_box, sizeof(T)), T)
/**
* Gets the box value.
*
* A debug assertion will be raised if the size of the specified item type is not equal to the
* size of the collection item type.
*
* @relates kBox
* @param kBox_box Box object.
* @param TPtr_item Strongly-typed destination pointer for value copied from the box.
* @return Operation status.
*/
#define kBox_ItemT(kBox_box, TPtr_item) \
xkBox_ItemT(kBox_box, TPtr_item, sizeof(*(TPtr_item)))
/**
* Returns a pointer to the box item buffer.
*
* @public @memberof kBox
* @param box Box object.
* @return Pointer to box item buffer.
*/
kInlineFx(void*) kBox_Data(kBox box)
{
kObj(kBox, box);
return obj->item;
}
/**
* Returns a strongly-typed pointer to the box item buffer.
*
* A debug assertion will be raised if the size of the specified item type is not equal to the
* size of the collection item type.
*
* @relates kBox
* @param kBox_box Box object.
* @param T Item type identifier (e.g., k32s).
* @return Strongly-typed pointer to box item buffer.
*/
#define kBox_DataT(kBox_box, T) \
kCast(T*, xkBox_DataT(kBox_box, sizeof(T)))
/**
* Returns the box item type.
*
* @public @memberof kBox
* @param box Box object.
* @return Box item type.
*/
kInlineFx(kType) kBox_ItemType(kBox box)
{
kObj(kBox, box);
return obj->itemType;
}
/**
* Returns the box item size.
*
* @public @memberof kBox
* @param box Box object.
* @return Box item size.
*/
kInlineFx(kSize) kBox_ItemSize(kBox box)
{
kObj(kBox, box);
return obj->itemSize;
}
#endif