Преглед изворни кода

structure: CHash: add CHash_Verify()

ambrop7 пре 13 година
родитељ
комит
2431d0361c
4 измењених фајлова са 31 додато и 0 уклоњено
  1. 1 0
      structure/CHash_decl.h
  2. 1 0
      structure/CHash_footer.h
  3. 1 0
      structure/CHash_header.h
  4. 28 0
      structure/CHash_impl.h

+ 1 - 0
structure/CHash_decl.h

@@ -54,5 +54,6 @@ static void CHash_Remove (CHash *o, CHashArg arg, CHashRef entry);
 static CHashRef CHash_Lookup (const CHash *o, CHashArg arg, CHashKey key);
 static CHashRef CHash_GetNextEqual (const CHash *o, CHashArg arg, CHashRef entry);
 static int CHash_MultiplyBuckets (CHash *o, CHashArg arg, int exp);
+static void CHash_Verify (const CHash *o, CHashArg arg);
 
 #include "CHash_footer.h"

+ 1 - 0
structure/CHash_footer.h

@@ -67,6 +67,7 @@
 #undef CHash_Lookup
 #undef CHash_GetNextEqual
 #undef CHash_MultiplyBuckets
+#undef CHash_Verify
 
 // private things
 #undef CHash_next

+ 1 - 0
structure/CHash_header.h

@@ -67,6 +67,7 @@
 #define CHash_Lookup MERGE(CHash, _Lookup)
 #define CHash_GetNextEqual MERGE(CHash, _GetNextEqual)
 #define CHash_MultiplyBuckets MERGE(CHash, _MultiplyBuckets)
+#define CHash_Verify MERGE(CHash, _Verify)
 
 // private things
 #define CHash_next(entry) ((entry).ptr->CHASH_PARAM_ENTRY_NEXT)

+ 28 - 0
structure/CHash_impl.h

@@ -281,4 +281,32 @@ static int CHash_MultiplyBuckets (CHash *o, CHashArg arg, int exp)
     return 1;
 }
 
+static void CHash_Verify (const CHash *o, CHashArg arg)
+{
+    ASSERT_FORCE(o->num_buckets > 0)
+    ASSERT_FORCE(o->buckets)
+    
+    for (size_t i = 0; i < o->num_buckets; i++) {
+        CHashRef cur = CHashDerefMayNull(arg, o->buckets[i]);
+        CHashRef same_first = cur;
+        
+        while (!CHashIsNullRef(cur)) {
+            size_t index = CHASH_PARAM_ENTRYHASH(arg, cur) % o->num_buckets;
+            ASSERT_FORCE(index == i)
+            
+            if (!CHASH_PARAM_COMPARE_ENTRIES(arg, cur, same_first)) {
+                same_first = cur;
+            }
+            
+            CHashRef ccur = CHashDerefNonNull(arg, o->buckets[i]);
+            while (ccur.link != same_first.link) {
+                ASSERT_FORCE(!CHASH_PARAM_COMPARE_ENTRIES(arg, ccur, cur))
+                ccur = CHashDerefMayNull(arg, CHash_next(ccur));
+            }
+            
+            cur = CHashDerefMayNull(arg, CHash_next(cur));
+        }
+    }
+}
+
 #include "CHash_footer.h"