Foundations

This commit is contained in:
2026-08-29 01:50:50 +08:00
parent bf5fc3bda6
commit 8e95904cc4
100 changed files with 13997 additions and 0 deletions
+89
View File
@@ -0,0 +1,89 @@
#include "c_ArrayStack.h"
#include <c_Memory.h>
#define DEFAULT_INITIAL_CAPACITY 4
c_err_t c_ArrayStack_Init(c_ArrayStack_t* self, int obj_size, c_size_t capacity) {
if (!self || obj_size <= 0) return C_ERR_PARAM;
self->obj_size = obj_size;
self->capacity = (capacity > 0) ? capacity : DEFAULT_INITIAL_CAPACITY;
self->size = 0;
self->array = C_ALLOC(self->capacity * self->obj_size);
if (!self->array) {
self->capacity = 0;
return C_ERR_NOMEM;
}
return C_ERR_OK;
}
void c_ArrayStack_Destroy(c_ArrayStack_t* self) {
if (!self) return;
C_FREE(self->array);
self->capacity = 0;
self->size = 0;
self->obj_size = 0;
}
c_err_t c_ArrayStack_Push(c_ArrayStack_t* self, void* obj) {
if (!self || !self->array || !obj) return C_ERR_PARAM;
if (self->size >= self->capacity) {
const c_size_t new_capacity = self->capacity << 1;
void* new_array = C_REALLOC(self->array, new_capacity * self->obj_size);
if (!new_array) {
return C_ERR_NOMEM;
}
self->array = new_array;
self->capacity = new_capacity;
}
// 計算頂端目標記憶體地址並寫入資料
char* target = (char*)self->array + (self->size * self->obj_size);
memcpy(target, obj, self->obj_size);
self->size++;
return C_ERR_OK;
}
c_err_t c_ArrayStack_Pop(c_ArrayStack_t* self, void* obj) {
if (!self || !self->array || !obj) return C_ERR_PARAM;
if (self->size == 0) return C_ERR_EMPTY; // 堆疊已空
// 取得位於 size - 1 的堆疊頂端元素地址
const char* pop_src = (char*)self->array + ((self->size - 1) * self->obj_size);
// 直接複製到呼叫端提供的記憶體中
memcpy(obj, pop_src, self->obj_size);
self->size--;
return C_ERR_OK;
}
void* c_ArrayStack_Peek(c_ArrayStack_t* self) {
if (!self || !self->array || self->size == 0) return NULL;
return (char*)self->array + ((self->size - 1) * self->obj_size);
}
c_err_t c_ArrayStack_Remove(c_ArrayStack_t* self, c_size_t index) {
if (!self || !self->array) return C_ERR_PARAM;
if (index >= self->size) return C_ERR_OUTOFBOUND;
// 如果刪除的不是頂端元素,則後續元素需向前平移一個單位
if (index < self->size - 1) {
char* dest = (char*)self->array + (index * self->obj_size);
const char* src = dest + self->obj_size;
const c_size_t num_elements_to_move = self->size - index - 1;
memmove(dest, src, num_elements_to_move * self->obj_size);
}
self->size--;
return C_ERR_OK;
}