Przeglądaj źródła

structure: CHash: retrieve keys via a macro expression instead of expecting them to be directly in entries

ambrop7 13 lat temu
rodzic
commit
89ea627530

+ 1 - 1
ncd/NCDInterpBlock_hash.h

@@ -7,5 +7,5 @@
 #define CHASH_PARAM_DEREF(arg, link) (&(arg)[(link)])
 #define CHASH_PARAM_HASHFUN(arg, key) (djb2_hash((const unsigned char *)(key)))
 #define CHASH_PARAM_KEYSEQUAL(arg, key1, key2) (!strcmp((key1), (key2)))
-#define CHASH_PARAM_ENTRY_KEY name
+#define CHASH_PARAM_GETKEY(arg, entry) ((entry).ptr->name)
 #define CHASH_PARAM_ENTRY_NEXT hash_next

+ 1 - 1
ncd/NCDInterpProg_hash.h

@@ -7,5 +7,5 @@
 #define CHASH_PARAM_DEREF(arg, link) (&(arg)[(link)])
 #define CHASH_PARAM_HASHFUN(arg, key) (djb2_hash((const unsigned char *)(key)))
 #define CHASH_PARAM_KEYSEQUAL(arg, key1, key2) (!strcmp((key1), (key2)))
-#define CHASH_PARAM_ENTRY_KEY name
+#define CHASH_PARAM_GETKEY(arg, entry) ((entry).ptr->name)
 #define CHASH_PARAM_ENTRY_NEXT hash_next

+ 1 - 1
structure/CHash_footer.h

@@ -37,7 +37,7 @@
 #undef CHASH_PARAM_DEREF
 #undef CHASH_PARAM_HASHFUN
 #undef CHASH_PARAM_KEYSEQUAL
-#undef CHASH_PARAM_ENTRY_KEY
+#undef CHASH_PARAM_GETKEY
 #undef CHASH_PARAM_ENTRY_NEXT
 
 // types

+ 1 - 1
structure/CHash_header.h

@@ -37,7 +37,7 @@
 // CHASH_PARAM_DEREF(arg, link) - dereference a non-null link
 // CHASH_PARAM_HASHFUN(arg, key) - hash function, return size_t
 // CHASH_PARAM_KEYSEQUAL(arg, key1, key2) - compares equality of two keys
-// CHASH_PARAM_ENTRY_KEY - key member in entry
+// CHASH_PARAM_GETKEY(arg, entry) - get key of entry
 // CHASH_PARAM_ENTRY_NEXT - next member in entry
 
 // types

+ 8 - 8
structure/CHash_impl.h

@@ -83,12 +83,12 @@ static CHashRef CHash_Deref (CHashArg arg, CHashLink link)
 
 static int CHash_Insert (CHash *o, CHashArg arg, CHashRef entry, CHashRef *out_existing)
 {
-    CHashKey key = entry.ptr->CHASH_PARAM_ENTRY_KEY;
+    CHashKey key = CHASH_PARAM_GETKEY(arg, entry);
     size_t index = CHASH_PARAM_HASHFUN(arg, key) % o->numBuckets;
     
     CHashRef e = CHash_Deref(arg, o->buckets[index]);
     while (e.link != CHashNullLink()) {
-        if (CHASH_PARAM_KEYSEQUAL(arg, key, e.ptr->CHASH_PARAM_ENTRY_KEY)) {
+        if (CHASH_PARAM_KEYSEQUAL(arg, key, CHASH_PARAM_GETKEY(arg, e))) {
             if (out_existing) {
                 *out_existing = e;
             }
@@ -110,13 +110,13 @@ static int CHash_Insert (CHash *o, CHashArg arg, CHashRef entry, CHashRef *out_e
 
 static void CHash_InsertMulti (CHash *o, CHashArg arg, CHashRef entry)
 {
-    CHashKey key = entry.ptr->CHASH_PARAM_ENTRY_KEY;
+    CHashKey key = CHASH_PARAM_GETKEY(arg, entry);
     size_t index = CHASH_PARAM_HASHFUN(arg, key) % o->numBuckets;
     
     CHashRef prev = CHashNullRef();
     CHashRef cur = CHash_Deref(arg, o->buckets[index]);
     while (cur.link != CHashNullLink()) {
-        if (CHASH_PARAM_KEYSEQUAL(arg, cur.ptr->CHASH_PARAM_ENTRY_KEY, key)) {
+        if (CHASH_PARAM_KEYSEQUAL(arg, CHASH_PARAM_GETKEY(arg, cur), key)) {
             break;
         }
         prev = cur;
@@ -136,7 +136,7 @@ static void CHash_InsertMulti (CHash *o, CHashArg arg, CHashRef entry)
 
 static void CHash_Remove (CHash *o, CHashArg arg, CHashRef entry)
 {
-    CHashKey key = entry.ptr->CHASH_PARAM_ENTRY_KEY;
+    CHashKey key = CHASH_PARAM_GETKEY(arg, entry);
     size_t index = CHASH_PARAM_HASHFUN(arg, key) % o->numBuckets;
     
     CHashRef prev = CHashNullRef();
@@ -162,7 +162,7 @@ static CHashRef CHash_Lookup (const CHash *o, CHashArg arg, CHashKey key)
     
     CHashRef e = CHash_Deref(arg, o->buckets[index]);
     while (e.link != CHashNullLink()) {
-        if (CHASH_PARAM_KEYSEQUAL(arg, e.ptr->CHASH_PARAM_ENTRY_KEY, key)) {
+        if (CHASH_PARAM_KEYSEQUAL(arg, CHASH_PARAM_GETKEY(arg, e), key)) {
             return e;
         }
         e = CHash_Deref(arg, e.ptr->CHASH_PARAM_ENTRY_NEXT);
@@ -192,7 +192,7 @@ static CHashRef CHash_GetNext (const CHash *o, CHashArg arg, CHashRef entry)
         return CHash_Deref(arg, next);
     }
     
-    CHashKey key = entry.ptr->CHASH_PARAM_ENTRY_KEY;
+    CHashKey key = CHASH_PARAM_GETKEY(arg, entry);
     size_t i = CHASH_PARAM_HASHFUN(arg, key) % o->numBuckets;
     i++;
     
@@ -216,7 +216,7 @@ static CHashRef CHash_GetNextEqual (const CHash *o, CHashArg arg, CHashRef entry
     }
     
     CHashRef next_ref = CHash_Deref(arg, next);
-    if (!CHASH_PARAM_KEYSEQUAL(arg, next_ref.ptr->CHASH_PARAM_ENTRY_KEY, entry.ptr->CHASH_PARAM_ENTRY_KEY)) {
+    if (!CHASH_PARAM_KEYSEQUAL(arg, CHASH_PARAM_GETKEY(arg, next_ref), CHASH_PARAM_GETKEY(arg, entry))) {
         return CHashNullRef();
     }