use std::{ops::Range, sync::Arc};
use revision::Revisioned;
use crate::err::Error;
use super::KeyEncode;
pub fn advance_key(key: &mut [u8]) {
for b in key.iter_mut().rev() {
*b = b.wrapping_add(1);
if *b != 0 {
break;
}
}
}
pub fn to_prefix_range<K: KeyEncode>(key: K) -> Result<Range<Vec<u8>>, Error> {
let start = key.encode_owned()?;
let mut end = start.clone();
end.push(0xff);
Ok(Range {
start,
end,
})
}
pub fn deserialize_cache<'a, I, T>(iter: I) -> Result<Arc<[T]>, Error>
where
T: Revisioned,
I: Iterator<Item = &'a [u8]>,
{
let mut buf = Vec::new();
for mut slice in iter {
buf.push(Revisioned::deserialize_revisioned(&mut slice)?)
}
Ok(Arc::from(buf))
}