Skip to content
Snippets Groups Projects
Commit 43241f31 authored by Georges Racinet's avatar Georges Racinet :squid:
Browse files

rust-index: find_gca_candidates bit sets genericization

This allows to use arbitratry size of inputs in `find_gca_candidates()`.
We're genericizing so that the common case of up to 63 inputs can be
treated with the efficient implementation backed by `u64`.

Some complications with the borrow checker came, because arbitrary sized
bit sets will not be `Copy`, hence mutating them keeps a mut ref on the `seen`
vector. This is solved by some cloning, most of which can be avoided,
preferably in a follow-up after proof that this works (hence after exposition
to Python layer).

As far as performance is concerned, calling `clone()` on a `Copy` object
(good case when number of revs is less than 64) should end up just doing a
copy, according to this excerpt of the `Clone` trait documentation:

  Types that are Copy should have a trivial implementation of Clone.
  More formally: if T: Copy, x: T, and y: &T, then let x = y.clone();
  is equivalent to let x = *y;.
  Manual implementations should be careful to uphold this invariant;
  however, unsafe code must not rely on it to ensure memory safety.

We kept the general structure, hence why there are some double negations.
This also could be made nicer in a follow-up.

The `NonStaticPoisonableBitSet` is included to ensure that the
`PoisonableBitSet` trait is general enough (had to correct `vec_of_empty()` for
instance). Moving the genericization one level to encompass the `seen`
vector and not its elements would be better for performance, if worth it.
parent 42c8dbdb
No related branches found
No related tags found
2 merge requests!737Improvements to the Rust index's performance,!708Implement pure rust revlog Index
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment