use std::ops::Range;
use std::sync::Arc;
use anyhow::Result;
use crate::kvs::{KVKey, KVValue};
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: KVKey>(key: &K) -> Result<Range<Vec<u8>>> {
let start = key.encode_key()?;
let mut end = start.clone();
end.push(0xff);
Ok(Range {
start,
end,
})
}
pub fn deserialize_cache<'a, I, T>(iter: I) -> Result<Arc<[T]>>
where
T: KVValue<KeyContext = ()>,
I: Iterator<Item = &'a [u8]>,
{
let mut buf = Vec::new();
for slice in iter {
buf.push(T::kv_decode_value(slice, ())?)
}
Ok(Arc::from(buf))
}