use crate::key_composer::{KeyComposer, KeyTag, SmallKey, SubkeyComposer};
#[inline]
pub fn meta(kc: &KeyComposer, key: &[u8]) -> SmallKey {
kc.compose_meta_key_stack(KeyTag::ZSetMeta.as_slice(), key)
}
#[inline]
pub fn member(kc: &KeyComposer, key: &[u8], member_bytes: &[u8]) -> SmallKey {
kc.compose_subkey_stack(KeyTag::ZSetData.as_slice(), key, member_bytes)
}
#[inline]
pub fn prefix(kc: &KeyComposer, key: &[u8]) -> Vec<u8> {
kc.compose_prefix(KeyTag::ZSetData.as_slice(), key)
}
#[inline]
pub fn prefix_stack(kc: &KeyComposer, key: &[u8]) -> SmallKey {
kc.compose_prefix_stack(KeyTag::ZSetData.as_slice(), key)
}
#[inline]
pub fn score(kc: &KeyComposer, key: &[u8], score_val: f64, member_bytes: &[u8]) -> SmallKey {
let score_bits = encode_sortable_f64(score_val);
kc.compose_subkey2_stack(
KeyTag::ZSetScore.as_slice(),
key,
&score_bits.to_be_bytes(),
member_bytes,
)
}
#[inline]
pub fn score_prefix(kc: &KeyComposer, key: &[u8]) -> Vec<u8> {
kc.compose_prefix(KeyTag::ZSetScore.as_slice(), key)
}
#[inline]
pub fn score_prefix_stack(kc: &KeyComposer, key: &[u8]) -> SmallKey {
kc.compose_prefix_stack(KeyTag::ZSetScore.as_slice(), key)
}
pub use crate::meta::{
decode_sortable_f64_u64 as decode_sortable_f64, encode_sortable_f64_u64 as encode_sortable_f64,
};
#[derive(Debug, Clone)]
pub struct ItemKeyComposer {
member_composer: SubkeyComposer,
score_buf: Vec<u8>,
score_prefix_len: usize,
}
impl ItemKeyComposer {
#[inline]
pub fn new(kc: &KeyComposer, key: &[u8]) -> Self {
let mp = prefix_stack(kc, key);
let sp = score_prefix(kc, key);
let score_prefix_len = sp.len();
Self {
member_composer: SubkeyComposer::from_slice(&mp),
score_buf: sp,
score_prefix_len,
}
}
#[inline(always)]
pub fn key_for_member<'a>(&'a mut self, member: &[u8]) -> &'a [u8] {
self.member_composer.compose_sub(member)
}
#[inline(always)]
pub fn key_for_score<'a>(&'a mut self, score_val: f64, member: &[u8]) -> &'a [u8] {
let score_bits = encode_sortable_f64(score_val);
self.score_buf.truncate(self.score_prefix_len);
self.score_buf.extend_from_slice(&score_bits.to_be_bytes());
self.score_buf.extend_from_slice(member);
&self.score_buf
}
#[inline(always)]
pub fn member_prefix(&self) -> &[u8] {
self.member_composer.prefix()
}
#[inline(always)]
pub fn score_prefix(&self) -> &[u8] {
&self.score_buf[..self.score_prefix_len]
}
}