in common/rusty_leveldb_sgx/src/skipmap.rs [192:267]
fn insert(&mut self, key: Vec<u8>, val: Vec<u8>) {
assert!(!key.is_empty());
// Keeping track of skip entries that will need to be updated
let mut prevs: [Option<*mut Node>; MAX_HEIGHT] = [None; MAX_HEIGHT];
let new_height = self.random_height();
let prevs = &mut prevs[0..new_height];
let mut level = MAX_HEIGHT - 1;
let mut current = self.head.as_mut() as *mut Node;
// Set previous node for all levels to current node.
for i in 0..prevs.len() {
prevs[i] = Some(current);
}
// Find the node after which we want to insert the new node; this is the node with the key
// immediately smaller than the key to be inserted.
loop {
unsafe {
if let Some(next) = (*current).skips[level] {
// If the wanted position is after the current node
let ord = self.cmp.cmp(&(*next).key, &key);
assert!(ord != Ordering::Equal, "No duplicates allowed");
if ord == Ordering::Less {
current = next;
continue;
}
}
}
if level < new_height {
prevs[level] = Some(current);
}
if level == 0 {
break;
} else {
level -= 1;
}
}
// Construct new node
let mut new_skips = Vec::new();
new_skips.resize(new_height, None);
let mut new = Box::new(Node {
skips: new_skips,
next: None,
key,
value: val,
});
let newp = new.as_mut() as *mut Node;
for i in 0..new_height {
if let Some(prev) = prevs[i] {
unsafe {
new.skips[i] = (*prev).skips[i];
(*prev).skips[i] = Some(newp);
}
}
}
let added_mem = size_of::<Node>()
+ size_of::<Option<*mut Node>>() * new.skips.len()
+ new.key.len()
+ new.value.len();
self.approx_mem += added_mem;
self.len += 1;
// Insert new node by first replacing the previous element's next field with None and
// assigning its value to new.next...
new.next = unsafe { replace(&mut (*current).next, None) };
// ...and then setting the previous element's next field to the new node
unsafe { replace(&mut (*current).next, Some(new)) };
}