]> git.itanic.dy.fi Git - sdl-planets/blobdiff - quadtree.c
Introduce struct quadree_ops
[sdl-planets] / quadtree.c
index f188d8069ee38a5426403304c97e5e485eb9186a..ec683aaa0e8d4e872215e337f3348f5896a21e70 100644 (file)
@@ -109,10 +109,8 @@ static void validate_tree(const struct quadtree *node)
  * account at all.
  */
 
-struct quadtree *quadtree_add(struct quadtree *parent,
-                             struct quadtree *new,
-                             int (*compare)(struct quadtree *a,
-                                            struct quadtree *b))
+struct quadtree *quadtree_add(struct quadtree *parent, struct quadtree *new,
+                             struct quadtree_ops *ops)
 {
        int ret;
        if (parent == new)
@@ -120,7 +118,7 @@ struct quadtree *quadtree_add(struct quadtree *parent,
 
        validate_tree(parent);
 
-       ret = compare(parent, new);
+       ret = ops->compare(parent, new);
 
        if (ret < 0 || ret >= 4) {
                printf("Invalid comparison result of %d\n", ret);
@@ -128,7 +126,7 @@ struct quadtree *quadtree_add(struct quadtree *parent,
        }
 
        if (parent->child[ret])
-               return quadtree_add(parent->child[ret], new, compare);
+               return quadtree_add(parent->child[ret], new, ops);
 
        parent->child[ret] = new;
        new->parent = parent;
@@ -148,8 +146,7 @@ struct quadtree *quadtree_add(struct quadtree *parent,
 static void
 _quadtree_reposition_reqursively(struct quadtree *root,
                                 struct quadtree *node,
-                                int (*compare)(struct quadtree *a,
-                                               struct quadtree *b))
+                                struct quadtree_ops *ops)
 {
        int i;
 
@@ -165,7 +162,7 @@ _quadtree_reposition_reqursively(struct quadtree *root,
                    node->child[i] == node->parent)
                        trap();
 
-               _quadtree_reposition_reqursively(root, node->child[i], compare);
+               _quadtree_reposition_reqursively(root, node->child[i], ops);
                node->child[i] = 0;
        }
 
@@ -174,7 +171,7 @@ _quadtree_reposition_reqursively(struct quadtree *root,
        node->children = 0;
 
        /* Then remove this node under the new root. */
-       quadtree_add(root, node, compare);
+       quadtree_add(root, node, ops);
 }
 
 /*
@@ -185,8 +182,7 @@ _quadtree_reposition_reqursively(struct quadtree *root,
  * value will be the original root of the tree.
  */
 struct quadtree *quadtree_del(struct quadtree *node,
-                             int (*compare)(struct quadtree *a,
-                                            struct quadtree *b))
+                             struct quadtree_ops *ops)
 {
        struct quadtree *parent = 0;
        int i;
@@ -207,7 +203,7 @@ struct quadtree *quadtree_del(struct quadtree *node,
                        }
                        _quadtree_reposition_reqursively(parent,
                                                         node->child[i],
-                                                        compare);
+                                                        ops);
                        node->child[i] = 0;
                }
 
@@ -245,7 +241,7 @@ struct quadtree *quadtree_del(struct quadtree *node,
                        continue;
 
                _quadtree_reposition_reqursively(node->parent, node->child[i],
-                                                compare);
+                                                ops);
                node->child[i] = 0;
        }