#include "c_HashMap.h" #include #include typedef struct { char name[32]; } StringKey_t; typedef struct { int price; } IntValue_t; // 簡單字串雜湊回呼 (DJB2) uint32_t test_hash(const void* key, int key_size) { const char* str = ((StringKey_t*)key)->name; uint32_t hash = 5381; int c; while ((c = (unsigned char)*str++)) hash = ((hash << 5) + hash) + c; return hash; } int test_compare(const void* a, const void* b, int key_size) { return strcmp(((StringKey_t*)a)->name, ((StringKey_t*)b)->name); } void test_log(const char* name) { printf("[PASS] %s\n", name); } int main() { printf("==================================================\n"); printf(" 開始執行 c_HashMapKeyIter_t 鍵值迭代器單元測試\n"); printf("==================================================\n\n"); c_HashMap_t map; c_HashMap_Init(&map, sizeof(StringKey_t), sizeof(IntValue_t), 4, test_hash, test_compare); StringKey_t k1 = {"Apple"}; IntValue_t v1 = {100}; StringKey_t k2 = {"Banana"}; IntValue_t v2 = {200}; // 預計在走訪時刪除此項 StringKey_t k3 = {"Cherry"}; IntValue_t v3 = {300}; c_HashMap_Put(&map, &k1, &v1); c_HashMap_Put(&map, &k2, &v2); c_HashMap_Put(&map, &k3, &v3); assert(map.size == 3); // ========================================== // 1. 測試迭代器基本走訪 // ========================================== c_HashMapKeyIter_t iter; c_HashMapKeyIter_Init(&iter, &map); printf("當前雜湊表包含的鍵值:\n"); int visit_count = 0; while (c_HashMapKeyIter_HasNext(&iter)) { StringKey_t* key = (StringKey_t*)c_HashMapKeyIter_Next(&iter); printf(" - 鍵名稱: %s\n", key->name); visit_count++; } assert(visit_count == 3); test_log("1. 迭代器成功走訪所有雜湊桶中的元素"); // ========================================== // 2. 測試走訪中安全刪除 (Remove "Banana") // ========================================== c_HashMapKeyIter_Init(&iter, &map); while (c_HashMapKeyIter_HasNext(&iter)) { StringKey_t* key = (StringKey_t*)c_HashMapKeyIter_Get(&iter); if (strcmp(key->name, "Banana") == 0) { printf(" [Log] 找到目標 '%s',執行迭代器刪除...\n", key->name); c_HashMapKeyIter_Remove(&iter); // 呼叫 Remove 後,迭代器已自動處理好指標轉移,此處不可呼叫 Next() } else { c_HashMapKeyIter_Next(&iter); // 沒刪除時才手動前進 } } assert(map.size == 2); test_log("2. 迭代器中序安全刪除指定元素成功"); // ========================================== // 3. 驗證刪除後的雜湊表狀態 // ========================================== assert(c_HashMap_Contains(&map, &k1) == C_TRUE); assert(c_HashMap_Contains(&map, &k2) == C_FALSE); // Banana 應不見 assert(c_HashMap_Contains(&map, &k3) == C_TRUE); test_log("3. 最終雜湊表結構完好度驗證成功"); c_HashMap_Destroy(&map); return 0; }