Browse Source

[ht.h] Adding functions for getting the ptr to item data

Vinicius Teshima 1 năm trước cách đây
mục cha
commit
5acdbc8a57
1 tập tin đã thay đổi với 25 bổ sung9 xóa
  1. 25 9
      src/ht.h

+ 25 - 9
src/ht.h

@@ -144,27 +144,43 @@ uint64_t ht_default_hash(const char *str, size_t str_size);
 #define HT_ISET(ht, key, val)					\
 	HT_SET(ht, (const char *)key, 0, val)
 
+#define __HT_GET(ht, _key, _key_size, _k, _it, _i)		\
+	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];		\
+	}								\
+	if ( _it->key == 0 ) {						\
+		break;							\
+	}
+
 #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];	\
-		}							\
-		if ( _it->key == 0 ) {					\
-			break;						\
-		}							\
+		__HT_GET(ht, _key, _key_size, _k, _it, _i)		\
 		(ret) = _it->data;					\
 	} while(0)
 
+#define _HT_GET_PTR(ht, _key, _key_size, ret, _k, _it, _i)		\
+	do {								\
+		__HT_GET(ht, _key, _key_size, _k, _it, _i)		\
+		(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), \
 		UNIQUE_NAME(_i))
 
+#define HT_GET_PTR(ht, key, key_size, ret)				\
+	_HT_GET_PTR(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)
 
+#define HT_IGET_PTR(ht, key, ret)			\
+	HT_GET_PTR(ht, (const char *)key, 0, ret)
+
 #if defined(HT_IMP) || defined(IMP)
 
 uint64_t