D7792: rust-nodemap: abstracting the indexing
gracinet (Georges Racinet)
phabricator at mercurial-scm.org
Mon Jan 6 19:25:52 UTC 2020
gracinet created this revision.
Herald added subscribers: mercurial-devel, kevincox, durin42.
Herald added a reviewer: hg-reviewers.
REVISION SUMMARY
In the forthcoming mutable implementation, we'll have to visit
node trees that are more complex than a single slice, although
the algorithm will still be expressed in simple indexing terms.
We still refrain using `#[inline]` indications as being
premature optimizations, but we strongly hope the compiler will
indeed inline most of the glue.
REPOSITORY
rHG Mercurial
BRANCH
default
REVISION DETAIL
https://phab.mercurial-scm.org/D7792
AFFECTED FILES
rust/hg-core/src/revlog/nodemap.rs
CHANGE DETAILS
diff --git a/rust/hg-core/src/revlog/nodemap.rs b/rust/hg-core/src/revlog/nodemap.rs
--- a/rust/hg-core/src/revlog/nodemap.rs
+++ b/rust/hg-core/src/revlog/nodemap.rs
@@ -15,6 +15,7 @@
use super::{NodeError, NodePrefix, NodePrefixRef, Revision, RevlogIndex};
use std::fmt;
use std::ops::Deref;
+use std::ops::Index;
#[derive(Debug, PartialEq)]
pub enum NodeMapError {
@@ -152,6 +153,14 @@
readonly: Box<dyn Deref<Target = [Block]> + Send>,
}
+impl Index<usize> for NodeTree {
+ type Output = Block;
+
+ fn index(&self, i: usize) -> &Block {
+ &self.readonly[i]
+ }
+}
+
/// Return `None` unless the `Node` for `rev` has given prefix in `index`.
fn has_prefix_or_none<'p>(
idx: &impl RevlogIndex,
@@ -170,6 +179,10 @@
}
impl NodeTree {
+ fn len(&self) -> usize {
+ self.readonly.len()
+ }
+
/// Main working method for `NodeTree` searches
///
/// This partial implementation lacks
@@ -178,14 +191,14 @@
&self,
prefix: NodePrefixRef<'p>,
) -> Result<Option<Revision>, NodeMapError> {
- let blocks: &[Block] = &*self.readonly;
- if blocks.is_empty() {
+ let len = self.len();
+ if len == 0 {
return Ok(None);
}
- let mut visit = blocks.len() - 1;
+ let mut visit = len - 1;
for i in 0..prefix.len() {
let nybble = prefix.get_nybble(i);
- match blocks[visit].read(nybble) {
+ match self[visit].read(nybble) {
Element::None => return Ok(None),
Element::Rev(r) => return Ok(Some(r)),
Element::Block(idx) => visit = idx,
To: gracinet, #hg-reviewers
Cc: durin42, kevincox, mercurial-devel
More information about the Mercurial-devel
mailing list