diff rust/hg-core/src/revlog/index.rs @ 51228:61a6ef876efd

rust-index: simplification in find_gca_candidates() `parent_seen` can be made a mutable ref, making this part more obvious, not needing to be commented so much. The micro-optimization of avoiding the union if `parent_seen` and `current_seen` agree is pushed down in the `union()` method of the fast, `u64` based bit set implementation (in case it matters).
author Georges Racinet <georges.racinet@octobus.net>
date Fri, 20 Oct 2023 08:54:49 +0200
parents e553cd209215
children 1b23aaf5eb7b
line wrap: on
line diff
--- a/rust/hg-core/src/revlog/index.rs	Fri Oct 20 08:43:00 2023 +0200
+++ b/rust/hg-core/src/revlog/index.rs	Fri Oct 20 08:54:49 2023 +0200
@@ -1141,7 +1141,7 @@
                 if parent == NULL_REVISION {
                     continue;
                 }
-                let parent_seen = &seen[parent.0 as usize];
+                let parent_seen = &mut seen[parent.0 as usize];
                 if poison {
                     // this block is logically equivalent to poisoning parent
                     // and counting it as non interesting if it
@@ -1149,18 +1149,12 @@
                     if !parent_seen.is_empty() && !parent_seen.is_poisoned() {
                         interesting -= 1;
                     }
-                    seen[parent.0 as usize].poison();
+                    parent_seen.poison();
                 } else {
-                    // Without the `interesting` accounting, this block would
-                    // be logically equivalent to: parent_seen |= current_seen
-                    // The parent counts as interesting if it was not already
-                    // known to be an ancestor (would already have counted)
                     if parent_seen.is_empty() {
-                        seen[parent.0 as usize] = current_seen.clone();
                         interesting += 1;
-                    } else if *parent_seen != current_seen {
-                        seen[parent.0 as usize].union(&current_seen);
                     }
+                    parent_seen.union(&current_seen);
                 }
             }
 
@@ -1343,7 +1337,9 @@
     }
 
     fn union(&mut self, other: &Self) {
-        (*self) |= *other;
+        if *self != *other {
+            (*self) |= *other;
+        }
     }
 
     fn is_full_range(&self, n: usize) -> bool {