Add pmap_remove_either().
authorDavid Given <dg@cowlark.com>
Mon, 5 Dec 2016 23:12:41 +0000 (00:12 +0100)
committerDavid Given <dg@cowlark.com>
Mon, 5 Dec 2016 23:12:41 +0000 (00:12 +0100)
modules/src/data/pmap.c
modules/src/data/pmap.h

index 4ac3817..a74febc 100644 (file)
@@ -90,6 +90,22 @@ void pmap_remove(void* mapp, void* left, void* right)
     }
 }
 
+void pmap_remove_either(void* mapp, void* either)
+{
+    struct pmap* map = mapp;
+    int i;
+
+    for (i=map->count-1; i>=0; i--)
+    {
+        struct pmap_node* node = &map->item[i];
+        if ((node->left == either) || (node->right == either))
+        {
+            memmove(node, node+1, sizeof(*node) * (map->count - i - 1));
+            map->count--;
+        }
+    }
+}
+
 void* pmap_findleft(void* mapp, void* left)
 {
     struct pmap* map = mapp;
index ff43b6a..c9939dc 100644 (file)
@@ -27,6 +27,7 @@ extern void pmap_put(void* map, void* left, void* right);
 extern void pmap_add(void* map, void* left, void* right);
 extern void pmap_add_bi(void* map, void* left, void* right);
 extern void pmap_remove(void* map, void* left, void* right);
+extern void pmap_remove_either(void* map, void* either);
 extern void* pmap_findleft(void* map, void* left);
 extern void* pmap_findright(void* map, void* right);