From f7e0f34214c71f80225a3599b4b7a9ef0c07792d Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Thu, 6 Mar 2025 18:17:51 +0000 Subject: [PATCH] tree: Replace bitfields with flags to mark deleted nodes clang does not seem to like these much. Signed-off-by: Michael Tremer --- src/network-tree.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/network-tree.c b/src/network-tree.c index 179ba3e..d6a2298 100644 --- a/src/network-tree.c +++ b/src/network-tree.c @@ -39,8 +39,10 @@ struct loc_network_tree_node { struct loc_network* network; - // Set if deleted - int deleted:1; + // Flags + enum loc_network_tree_node_flags { + NETWORK_TREE_NODE_DELETED = (1 << 0), + } flags; }; int loc_network_tree_new(struct loc_ctx* ctx, struct loc_network_tree** tree) { @@ -63,6 +65,10 @@ int loc_network_tree_new(struct loc_ctx* ctx, struct loc_network_tree** tree) { return 0; } +static int loc_network_tree_node_has_flag(struct loc_network_tree_node* node, int flag) { + return node->flags & flag; +} + struct loc_network_tree_node* loc_network_tree_get_root(struct loc_network_tree* tree) { return loc_network_tree_node_ref(tree->root); } @@ -86,8 +92,8 @@ static struct loc_network_tree_node* loc_network_tree_get_node(struct loc_networ } // If the node existed, but has been deleted, we undelete it - if (*n && (*n)->deleted) { - (*n)->deleted = 0; + if (*n && loc_network_tree_node_has_flag(*n, NETWORK_TREE_NODE_DELETED)) { + (*n)->flags &= ~NETWORK_TREE_NODE_DELETED; // If the desired node doesn't exist, yet, we will create it } else if (!*n) { @@ -116,7 +122,7 @@ static int __loc_network_tree_walk(struct loc_ctx* ctx, struct loc_network_tree_ int r; // If the node has been deleted, don't process it - if (node->deleted) + if (loc_network_tree_node_has_flag(node, NETWORK_TREE_NODE_DELETED)) return 0; // Finding a network ends the walk here @@ -244,7 +250,7 @@ static int loc_network_tree_delete_network( // Mark the node as deleted if it was a leaf if (!node->zero && !node->one) - node->deleted = 1; + node->flags |= NETWORK_TREE_NODE_DELETED; return 0; } @@ -253,7 +259,7 @@ static size_t __loc_network_tree_count_nodes(struct loc_network_tree_node* node) size_t counter = 1; // Don't count deleted nodes - if (node->deleted) + if (loc_network_tree_node_has_flag(node, NETWORK_TREE_NODE_DELETED)) return 0; if (node->zero) @@ -603,7 +609,7 @@ static int loc_network_tree_delete_node(struct loc_network_tree* tree, int r1 = 1; // Return for nodes that have already been deleted - if (n->deleted) + if (loc_network_tree_node_has_flag(n, NETWORK_TREE_NODE_DELETED)) goto DELETE; // Delete zero -- 2.47.3