]> git.ipfire.org Git - location/libloc.git/commitdiff
tree: Replace bitfields with flags to mark deleted nodes
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 6 Mar 2025 18:17:51 +0000 (18:17 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 6 Mar 2025 18:17:51 +0000 (18:17 +0000)
clang does not seem to like these much.

Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/network-tree.c

index 179ba3e29f32c419fcbdbd45d2c1f457b47dd2ce..d6a22987bdebda8d345419adbcd2f028073ac11c 100644 (file)
@@ -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