Files
cKit/Foundation/c_Array.c
T
2026-08-29 01:50:50 +08:00

115 lines
3.0 KiB
C

#include <c_Array.h>
#include <c_Memory.h>
c_err_t c_Array_Init(c_Array_t* array, c_size_t length, c_size_t size) {
if (!array) return C_ERR_PARAM;
array->length = length;
array->size = size;
if (length>0) {
array->array = C_CALLOC(length, size);
if (!array->array) {
return C_ERR_NOMEM;
}
}else {
array->array = NULL;
}
return C_ERR_OK;
}
void c_Array_Destroy(c_Array_t* array) {
if (!array) return;
C_FREE(array->array);
array->size = 0;
array->length = 0;
}
c_Array_t* c_Array_New(c_size_t length, c_size_t size) {
c_Array_t* array;
C_NEW(array);
if (!array) {
return NULL;
}
c_Array_Init(array, length, size);
return array;
}
void c_Array_Delete(c_Array_t** array) {
if (!array || !*array) return;
C_FREE((*array)->array);
C_FREE(*array);
}
c_size_t c_Array_Size(c_Array_t* array) {
if (!array) return 0;
return array->size;
}
c_size_t c_Array_Length(c_Array_t* array) {
if (!array) return 0;
return array->length;
}
c_err_t c_Array_Get(c_Array_t* array, c_size_t index, void** data) {
if (!array || (index >= array->length) || !data) return C_ERR_PARAM;
*data = array->array + index * array->size;
return C_ERR_OK;
}
c_err_t c_Array_Put(c_Array_t* array, c_size_t index, void* value) {
if (!array || !value || (index>=array->length)) return C_ERR_PARAM;
memcpy(array->array + index * array->size, value, array->size);
return C_ERR_OK;
}
c_err_t c_Array_Resize(c_Array_t* array, c_size_t length) {
if (!array) return C_ERR_PARAM;
if (length==0) {
C_FREE(array->array);
}else if (array->length==0) {
array->array = C_ALLOC(length*array->size);
if (!array->array) {
return C_ERR_NOMEM;
}
}else {
array->array = C_REALLOC(array->array, length*array->size);
if (!array->array) {
return C_ERR_NOMEM;
}
}
array->length = length;
return C_ERR_OK;
}
c_Array_t* c_Array_Copy(c_Array_t* array, c_size_t length) {
if (!array || length==0) return NULL;
c_Array_t* result;
C_NEW(result);
if (!result) {
return NULL;
}
c_Array_Init(result, length, array->size);
if (result->length >= array->length && array->length > 0) {
memcpy(result->array, array->array, array->length * array->size);
}else if (array->length > result->length && result->length > 0) {
memcpy(result->array, array->array, result->length * array->size);
}
return result;
}
c_err_t c_Array_CopyTo(const c_Array_t* array, c_Array_t* copy) {
if (!array || !copy) return C_ERR_PARAM;
if (copy->length >= array->length && array->length > 0) {
memcpy(copy->array, array->array, array->length * array->size);
return C_ERR_OK;
}else if (array->length > copy->length && copy->length > 0) {
memcpy(copy->array, array->array, copy->length * array->size);
return C_ERR_OK;
}
return C_ERR_FAIL;
}