Blame SOURCES/0165-trie-use-BIT-and-MASK-macros.patch

a2d0f5
From 8ef5456338a947944cc03b95c22c837af5884ddc Mon Sep 17 00:00:00 2001
a2d0f5
From: Eugene Syromyatnikov <evgsyr@gmail.com>
a2d0f5
Date: Wed, 18 Aug 2021 21:51:22 +0200
a2d0f5
Subject: [PATCH 149/150] trie: use BIT* and MASK* macros
a2d0f5
a2d0f5
This makes reading the code a bit easier.  It also solves some issues
a2d0f5
where there is a hypothertical possibility of having bit shifts of size
a2d0f5
64, by virtue of using the *_SAFE macros (that should silence some
a2d0f5
reported "left shifting by more than 63 bits has undefined behavior"
a2d0f5
covscan issues).
a2d0f5
a2d0f5
* src/trie.c (trie_create): Use BIT32, MASK64.
a2d0f5
(trie_create_data_block): Use BIT32, change iterator variable type
a2d0f5
to size_t.
a2d0f5
(trie_get_node): Use BIT64, MASK64.
a2d0f5
(trie_data_block_calc_pos): Use BIT32, MASK64, MASK64_SAFE.
a2d0f5
(trie_iterate_keys_node): Use BIT64, MASK64, MASK64_SAFE.
a2d0f5
(trie_free_node): Use BIT64.
a2d0f5
---
a2d0f5
 src/trie.c | 34 +++++++++++++++++-----------------
a2d0f5
 1 file changed, 17 insertions(+), 17 deletions(-)
a2d0f5
a2d0f5
diff --git a/src/trie.c b/src/trie.c
a2d0f5
index 586ff25..0a231e4 100644
a2d0f5
--- a/src/trie.c
a2d0f5
+++ b/src/trie.c
a2d0f5
@@ -15,6 +15,7 @@
a2d0f5
 #include <stdio.h>
a2d0f5
 
a2d0f5
 #include "trie.h"
a2d0f5
+#include "macros.h"
a2d0f5
 #include "xmalloc.h"
a2d0f5
 
a2d0f5
 static const uint8_t ptr_sz_lg = (sizeof(void *) == 8 ? 6 : 5);
a2d0f5
@@ -87,7 +88,7 @@ trie_create(uint8_t key_size, uint8_t item_size_lg, uint8_t node_key_bits,
a2d0f5
 		/ t->node_key_bits;
a2d0f5
 
a2d0f5
 	if (item_size_lg != 6)
a2d0f5
-		t->empty_value &= (((uint64_t) 1 << (1 << t->item_size_lg)) - 1);
a2d0f5
+		t->empty_value &= MASK64(BIT32(t->item_size_lg));
a2d0f5
 
a2d0f5
 	return t;
a2d0f5
 }
a2d0f5
@@ -96,8 +97,8 @@ static void *
a2d0f5
 trie_create_data_block(struct trie *t)
a2d0f5
 {
a2d0f5
 	uint64_t fill_value = t->empty_value;
a2d0f5
-	for (int i = 1; i < 1 << (6 - t->item_size_lg); i++) {
a2d0f5
-		fill_value <<= (1 << t->item_size_lg);
a2d0f5
+	for (size_t i = 1; i < BIT32(6 - t->item_size_lg); i++) {
a2d0f5
+		fill_value <<= BIT32(t->item_size_lg);
a2d0f5
 		fill_value |= t->empty_value;
a2d0f5
 	}
a2d0f5
 
a2d0f5
@@ -105,7 +106,7 @@ trie_create_data_block(struct trie *t)
a2d0f5
 	if (sz < 6)
a2d0f5
 		sz = 6;
a2d0f5
 
a2d0f5
-	size_t count = 1 << (sz - 6);
a2d0f5
+	size_t count = BIT32(sz - 6);
a2d0f5
 	uint64_t *data_block = xcalloc(count, 8);
a2d0f5
 
a2d0f5
 	for (size_t i = 0; i < count; i++)
a2d0f5
@@ -119,7 +120,7 @@ trie_get_node(struct trie *t, uint64_t key, bool auto_create)
a2d0f5
 {
a2d0f5
 	void **cur_node = &(t->data);
a2d0f5
 
a2d0f5
-	if (t->key_size < 64 && key > (uint64_t) 1 << t->key_size)
a2d0f5
+	if (t->key_size < 64 && key > MASK64(t->key_size))
a2d0f5
 		return NULL;
a2d0f5
 
a2d0f5
 	for (uint8_t cur_depth = 0; cur_depth <= t->max_depth; cur_depth++) {
a2d0f5
@@ -133,13 +134,13 @@ trie_get_node(struct trie *t, uint64_t key, bool auto_create)
a2d0f5
 			if (cur_depth == t->max_depth)
a2d0f5
 				*cur_node = trie_create_data_block(t);
a2d0f5
 			else
a2d0f5
-				*cur_node = xcalloc(1 << sz, 1);
a2d0f5
+				*cur_node = xcalloc(BIT64(sz), 1);
a2d0f5
 		}
a2d0f5
 
a2d0f5
 		if (cur_depth == t->max_depth)
a2d0f5
 			break;
a2d0f5
 
a2d0f5
-		size_t pos = (key >> offs) & ((1 << (sz - ptr_sz_lg)) - 1);
a2d0f5
+		size_t pos = (key >> offs) & MASK64(sz - ptr_sz_lg);
a2d0f5
 		cur_node = (((void **) (*cur_node)) + pos);
a2d0f5
 	}
a2d0f5
 
a2d0f5
@@ -152,7 +153,7 @@ trie_data_block_calc_pos(struct trie *t, uint64_t key,
a2d0f5
 {
a2d0f5
 	uint64_t key_mask;
a2d0f5
 
a2d0f5
-	key_mask = (1 << t->data_block_key_bits) - 1;
a2d0f5
+	key_mask = MASK64(t->data_block_key_bits);
a2d0f5
 	*pos = (key & key_mask) >> (6 - t->item_size_lg);
a2d0f5
 
a2d0f5
 	if (t->item_size_lg == 6) {
a2d0f5
@@ -161,10 +162,10 @@ trie_data_block_calc_pos(struct trie *t, uint64_t key,
a2d0f5
 		return;
a2d0f5
 	}
a2d0f5
 
a2d0f5
-	key_mask = (1 << (6 - t->item_size_lg)) - 1;
a2d0f5
-	*offs = (key & key_mask) * (1 << t->item_size_lg);
a2d0f5
+	key_mask = MASK64(6 - t->item_size_lg);
a2d0f5
+	*offs = (key & key_mask) << t->item_size_lg;
a2d0f5
 
a2d0f5
-	*mask = (((uint64_t) 1 << (1 << t->item_size_lg)) - 1) << *offs;
a2d0f5
+	*mask = MASK64_SAFE(BIT32(t->item_size_lg)) << *offs;
a2d0f5
 }
a2d0f5
 
a2d0f5
 bool
a2d0f5
@@ -211,7 +212,7 @@ trie_iterate_keys_node(struct trie *t,
a2d0f5
 		return 0;
a2d0f5
 
a2d0f5
 	if (t->key_size < 64) {
a2d0f5
-		uint64_t key_max = ((uint64_t) 1 << t->key_size) - 1;
a2d0f5
+		uint64_t key_max = MASK64(t->key_size);
a2d0f5
 		if (end > key_max)
a2d0f5
 			end = key_max;
a2d0f5
 	}
a2d0f5
@@ -228,15 +229,14 @@ trie_iterate_keys_node(struct trie *t,
a2d0f5
 		t->key_size :
a2d0f5
 		trie_get_node_bit_offs(t, depth - 1);
a2d0f5
 
a2d0f5
-	uint64_t first_key_in_node = start &
a2d0f5
-		(uint64_t) -1 << parent_node_bit_off;
a2d0f5
+	uint64_t first_key_in_node = start & ~MASK64_SAFE(parent_node_bit_off);
a2d0f5
 
a2d0f5
 	uint8_t node_bit_off = trie_get_node_bit_offs(t, depth);
a2d0f5
 	uint8_t node_key_bits = parent_node_bit_off - node_bit_off;
a2d0f5
-	uint64_t mask = ((uint64_t) 1 << (node_key_bits)) - 1;
a2d0f5
+	uint64_t mask = MASK64_SAFE(node_key_bits);
a2d0f5
 	uint64_t start_index = (start >> node_bit_off) & mask;
a2d0f5
 	uint64_t end_index = (end >> node_bit_off) & mask;
a2d0f5
-	uint64_t child_key_count = (uint64_t) 1 << node_bit_off;
a2d0f5
+	uint64_t child_key_count = BIT64(node_bit_off);
a2d0f5
 
a2d0f5
 	uint64_t count = 0;
a2d0f5
 
a2d0f5
@@ -274,7 +274,7 @@ trie_free_node(struct trie *t, void *node, uint8_t depth)
a2d0f5
 	if (depth >= t->max_depth)
a2d0f5
 		goto free_node;
a2d0f5
 
a2d0f5
-	size_t sz = 1 << (trie_get_node_size(t, depth) - ptr_sz_lg);
a2d0f5
+	size_t sz = BIT64(trie_get_node_size(t, depth) - ptr_sz_lg);
a2d0f5
 	for (size_t i = 0; i < sz; i++)
a2d0f5
 		trie_free_node(t, ((void **) node)[i], depth + 1);
a2d0f5
 
a2d0f5
-- 
a2d0f5
2.1.4
a2d0f5