in common/rusty_leveldb_sgx/src/cmp.rs [41:91]
fn find_shortest_sep(&self, a: &[u8], b: &[u8]) -> Vec<u8> {
if a == b {
return a.to_vec();
}
let min = if a.len() < b.len() { a.len() } else { b.len() };
let mut diff_at = 0;
while diff_at < min && a[diff_at] == b[diff_at] {
diff_at += 1;
}
// First, try to find a short separator. If that fails, try a backup mechanism below.
while diff_at < min {
let diff = a[diff_at];
if diff < 0xff && diff + 1 < b[diff_at] {
let mut sep = Vec::from(&a[0..diff_at + 1]);
sep[diff_at] += 1;
assert!(self.cmp(&sep, b) == Ordering::Less);
return sep;
}
diff_at += 1;
}
let mut sep = Vec::with_capacity(a.len() + 1);
sep.extend_from_slice(a);
// Try increasing a and check if it's still smaller than b. First find the last byte
// smaller than 0xff, and then increment that byte. Only if the separator is lesser than b,
// return it.
let mut i = a.len() - 1;
while i > 0 && sep[i] == 0xff {
i -= 1;
}
if sep[i] < 0xff {
sep[i] += 1;
if self.cmp(&sep, b) == Ordering::Less {
return sep;
} else {
sep[i] -= 1;
}
}
// Backup case: either `a` is full of 0xff, or all different places are less than 2
// characters apart.
// The result is not necessarily short, but a good separator: e.g., "abc" vs "abd" ->
// "abc\0", which is greater than abc and lesser than abd.
// Append a 0 byte; by making it longer than a, it will compare greater to it.
sep.extend_from_slice(&[0]);
return sep;
}