Bläddra i källkod

[ht.h] Adding a way to index using int

Vinicius Teshima 1 år sedan
förälder
incheckning
8f9d68ebc5
1 ändrade filer med 22 tillägg och 2 borttagningar
  1. 22 2
      src/ht.h

+ 22 - 2
src/ht.h

@@ -18,6 +18,8 @@
 
 typedef uint64_t (*ht_hash_func)(const char *, size_t);
 
+
+uint64_t ht_hash_nop(const char *cstr, size_t cstr_size);
 uint64_t ht_default_hash(const char *str, size_t str_size);
 
 #define HT_DEF_STRUCT(type, name)			\
@@ -138,18 +140,36 @@ uint64_t ht_default_hash(const char *str, size_t str_size);
 	_HT_SET(ht, key, key_size, val,				\
 		UNIQUE_NAME(_k), UNIQUE_NAME(_it), UNIQUE_NAME(_i))
 
-#define _HT_GET(ht, _key, _key_size, ret, _k, _it)			\
+#define HT_ISET(ht, key, val)					\
+	HT_SET(ht, (const char *)key, 0, val)
+
+#define _HT_GET(ht, _key, _key_size, ret, _k, _it, _i)			\
 	do {								\
 		uint64_t _k = (ht).hash((_key), (_key_size));		\
 		typeof(*(ht).items) *_it = &(ht).items[_k % (ht).cap];	\
+		size_t _i = 0;						\
+		while ( _it->key != _k && _it->key != 0 ) {		\
+			_it = &(ht).items[(_k + (++_i)) % (ht).cap];	\
+		}							\
 		(ret) = _it->data;					\
 	} while(0)
 
 #define HT_GET(ht, key, key_size, ret)					\
-	_HT_GET(ht, key, key_size, ret, UNIQUE_NAME(_k), UNIQUE_NAME(_it))
+	_HT_GET(ht, key, key_size, ret, UNIQUE_NAME(_k), UNIQUE_NAME(_it), \
+		UNIQUE_NAME(_i))
+
+#define HT_IGET(ht, key, ret)			\
+	HT_GET(ht, (const char *)key, 0, ret)
 
 #if defined(HT_IMP) || defined(IMP)
 
+uint64_t
+ht_hash_nop(const char *cstr, size_t cstr_size)
+{
+	(void) cstr_size;
+	return (uint64_t) cstr;
+}
+
 uint64_t
 ht_default_hash(const char *str, size_t str_size)
 {