OrderedVec - copy_split for segsizes

This commit is contained in:
Patrick Insinger
2021-10-05 11:48:54 -07:00
parent b7c3f02ed1
commit 896a172d46
2 changed files with 21 additions and 12 deletions

View File

@@ -642,18 +642,11 @@ impl InMemoryLayer {
// Divide all the page versions into old and new
// at the 'cutoff_lsn' point.
// TODO OrderedVec split method
let mut before_segsizes = OrderedVec::default();
let mut after_segsizes = OrderedVec::default();
let mut after_oldest_lsn: Accum<Lsn> = Accum(None);
for (lsn, size) in inner.segsizes.iter() {
if *lsn > cutoff_lsn {
after_segsizes.append(*lsn, *size);
after_oldest_lsn.accum(min, *lsn);
} else {
before_segsizes.append(*lsn, *size);
}
}
let (before_segsizes, after_segsizes) = inner.segsizes.copy_split(&Lsn(cutoff_lsn.0 + 1));
// The iterator is in Lsn order, so the first element will have the smallest Lsn
let mut after_oldest_lsn: Accum<Lsn> =
Accum(after_segsizes.iter().next().map(|(lsn, _size)| *lsn));
let mut before_page_versions = PageVersions::default();
let mut after_page_versions = PageVersions::default();

View File

@@ -90,6 +90,22 @@ impl<K: Ord + Copy, V> OrderedVec<K, V> {
pub fn is_empty(&self) -> bool {
self.0.is_empty()
}
pub fn copy_split(&self, key: &K) -> (Self, Self)
where
K: Clone,
V: Clone,
{
let idx = match self.0.binary_search_by_key(key, extract_key) {
Ok(idx) => idx,
Err(idx) => idx,
};
(
OrderedVec(Vec::from(&self.0[..idx])),
OrderedVec(Vec::from(&self.0[idx..])),
)
}
}
impl<K: Ord, V> From<BTreeMap<K, V>> for OrderedVec<K, V> {