]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Refactor and fix aggregator_bucket_unionize()
authorIgor Putovny <igor.putovny@nic.cz>
Tue, 19 Sep 2023 15:00:16 +0000 (17:00 +0200)
committerIgor Putovny <igor.putovny@nic.cz>
Wed, 20 Sep 2023 10:19:01 +0000 (12:19 +0200)
proto/aggregator/aggregator.c

index 8272ea0eea8005c5f02a7eb0fa0e851525d1c15f..ac290adf83d476a369faa9061ae61a8b252f3bf3 100644 (file)
@@ -275,32 +275,55 @@ aggregator_bucket_unionize(struct trie_node *node, const struct trie_node *left,
 
     int res = aggregator_bucket_compare(left->potential_buckets[i], right->potential_buckets[j]);
 
-    if (res == 0)
+    switch (res)
     {
-      node->potential_buckets[node->potential_buckets_count++] = left->potential_buckets[i];
-      i++;
-      j++;
+      case 0:
+        if (node->potential_buckets_count == 0 || node->potential_buckets[node->potential_buckets_count - 1] != left->potential_buckets[i])
+          node->potential_buckets[node->potential_buckets_count++] = left->potential_buckets[i];
+
+        i++;
+        j++;
+        break;
+
+      case -1:
+        if (node->potential_buckets_count == 0 || node->potential_buckets[node->potential_buckets_count - 1] != left->potential_buckets[i])
+          node->potential_buckets[node->potential_buckets_count++] = left->potential_buckets[i];
+
+        i++;
+        break;
+
+      case 1:
+        if (node->potential_buckets_count == 0 || node->potential_buckets[node->potential_buckets_count - 1] != right->potential_buckets[j])
+          node->potential_buckets[node->potential_buckets_count++] = right->potential_buckets[j];
+
+        j++;
+        break;
+
+      default:
+        bug("Impossible");
     }
-    else if (res == -1)
-      node->potential_buckets[node->potential_buckets_count++] = left->potential_buckets[i++];
-    else if (res == 1)
-      node->potential_buckets[node->potential_buckets_count++] = right->potential_buckets[j++];
-  }
 
-  while (i < left->potential_buckets_count)
-  {
-    if (node->potential_buckets_count >= MAX_POTENTIAL_NEXTHOP_COUNT)
-      return;
+    while (i < left->potential_buckets_count)
+    {
+      if (node->potential_buckets_count >= MAX_POTENTIAL_NEXTHOP_COUNT)
+        return;
 
-    node->potential_buckets[node->potential_buckets_count++] = left->potential_buckets[i++];
-  }
+      if (node->potential_buckets_count == 0 || node->potential_buckets[node->potential_buckets_count - 1] != left->potential_buckets[i])
+        node->potential_buckets[node->potential_buckets_count++] = left->potential_buckets[i];
 
-  while (j < right->potential_buckets_count)
-  {
-    if (node->potential_buckets_count >= MAX_POTENTIAL_NEXTHOP_COUNT)
-      return;
+      i++;
+    }
+
+    while (j < right->potential_buckets_count)
+    {
+      if (node->potential_buckets_count >= MAX_POTENTIAL_NEXTHOP_COUNT)
+        return;
 
-    node->potential_buckets[node->potential_buckets_count++] = right->potential_buckets[j++];
+      if (node->potential_buckets_count == 0 || node->potential_buckets[node->potential_buckets_count - 1] != right->potential_buckets[j])
+        node->potential_buckets[node->potential_buckets_count++] = right->potential_buckets[j];
+
+      j++;
+    }
   }
 }