Skip to content

Commit

Permalink
remove clone
Browse files Browse the repository at this point in the history
  • Loading branch information
jiacai2050 committed Jun 6, 2023
1 parent 902c584 commit 7d2926c
Showing 1 changed file with 28 additions and 26 deletions.
54 changes: 28 additions & 26 deletions src/xor8/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -128,9 +128,7 @@ where
/// Build bitmap for keys that where previously inserted using [Xor8Builder::insert],
/// [Xor8Builder::populate] and [Xor8Builder::populate_digests] method.
pub fn build(&mut self) -> Result<Xor8<H>, crate::Error> {
let digest_len = self.digests.len();
let digests = self.digests.iter().copied();
Self::build_inner(self.hash_builder.clone(), || digests.clone(), digest_len)
self.build_inner(None)
}

/// Build a bitmap for pre-computed 64-bit digests for keys.
Expand All @@ -144,23 +142,15 @@ where
&mut self,
digests: &[u64],
) -> Result<Xor8<H>, crate::Error> {
Self::build_inner(
self.hash_builder.clone(),
|| digests.iter().copied(),
digests.len(),
)
self.build_inner(Some(digests))
}

fn build_inner<F, It>(
hash_builder: H,
digest_generator: F,
digest_len: usize,
) -> Result<Xor8<H>, crate::Error>
where
F: Fn() -> It,
It: IntoIterator<Item = u64> + Clone,
{
let mut ff = Xor8::<H>::new(hash_builder);
fn build_inner(&self, digests: Option<&[u64]>) -> Result<Xor8<H>, crate::Error> {
let digest_len = match digests {
Some(v) => v.len(),
None => self.digests.len(),
};
let mut ff = Xor8::<H>::new(self.hash_builder.clone());

ff.num_keys = Some(digest_len);
let (size, mut rngcounter) = (digest_len, 1_u64);
Expand All @@ -182,14 +172,26 @@ where
let mut sets2: Vec<XorSet> = vec![XorSet::default(); block_length];

loop {
for key in digest_generator() {
let hs = ff.get_h0h1h2(key);
sets0[hs.h0 as usize].xor_mask ^= hs.h;
sets0[hs.h0 as usize].count += 1;
sets1[hs.h1 as usize].xor_mask ^= hs.h;
sets1[hs.h1 as usize].count += 1;
sets2[hs.h2 as usize].xor_mask ^= hs.h;
sets2[hs.h2 as usize].count += 1;
if let Some(digests) = digests {
for key in digests {
let hs = ff.get_h0h1h2(*key);
sets0[hs.h0 as usize].xor_mask ^= hs.h;
sets0[hs.h0 as usize].count += 1;
sets1[hs.h1 as usize].xor_mask ^= hs.h;
sets1[hs.h1 as usize].count += 1;
sets2[hs.h2 as usize].xor_mask ^= hs.h;
sets2[hs.h2 as usize].count += 1;
}
} else {
for key in &self.digests {
let hs = ff.get_h0h1h2(*key);
sets0[hs.h0 as usize].xor_mask ^= hs.h;
sets0[hs.h0 as usize].count += 1;
sets1[hs.h1 as usize].xor_mask ^= hs.h;
sets1[hs.h1 as usize].count += 1;
sets2[hs.h2 as usize].xor_mask ^= hs.h;
sets2[hs.h2 as usize].count += 1;
}
}

q0.clear();
Expand Down

0 comments on commit 7d2926c

Please sign in to comment.