Cleanup + docs
[?]
Feb 13, 2021, 8:24 PM
LSQ6V7M66TEGLJ7QBLRVDX4E7UKJTDQTEXZOS3KGPGFKVXNLPKBQCDependencies
- [2]
QBDBAQXYBetter graphviz debugging (include values) - [3]
SQ7MD7OWUnsized pages: decrement n on deletions - [4]
ESUI5EUZMaking as_page() unsafe - [5]
OP6SVMODResetting history - [6]
APPY2E7MUnsized deletions + custom sizes back - [7]
7WJNSPEWUsing the same definition of the "occupied" field uniform everywhere - [8]
KM3JAFGPAdding a test for next/prev - [9]
AOX2XQISActually, with the correct functions, Unsized pages are always slower than Sized pages (especially for writing) - [10]
G4JEQLLXDebugging synchronisation - [11]
W26CFMAQImproving safety of cursors - [12]
UUUVNC4DDebugging/cleanup around cursors - [13]
6DCQHIFPMinor changes after benchmarking - [14]
SO25TWFLA few features for integrating it into Pijul - [15]
WS4ZQM4RDebugging, tests, etc. - [16]
ONES3V46reference counting works for put - [17]
KX3WVNZWTesting/debugging "rebalance causes split of the root" - [18]
S4V4QZ5CDebugging reference-counting for put - [19]
LROAI3NBTwo iterators (convenience functions), along with tests to move cursors (put and del still destroy cursors though) - [20]
OFINGD26implementing prev() on cursors (+ some cleanup) - [21]
QEUTVAZ4Splitting btree::page - [22]
EAAYH6BQDebugging put - [23]
RV2L6CZWA few comments - [24]
6UVFCERMFormatting, debugging, etc. - [25]
UAQX27N4Tests - [26]
FMN7X4J2Micro-improvements, now noticeably faster than std::collections::BTreeMap - [27]
XEU2QVLCDebugging after plugging this into Pijul - [28]
WAKPPBKOFixing a double-free of roots after deletions (the root was freed both by handle_merge and by update_root) - [29]
Q7DRIBBRDebugging replace (which cannot be del+put) - [30]
PXF3R6SVImproving test coverage for btree::cursor - [31]
6DMPXOATMore debugging - [32]
DV4A2LR7Double-inserts (rebalancing near an internal deletion) - [33]
OTWDDJE7Trait/type cleanup - [34]
T73WR2BXCleaner RC increments for keys and values containing references + more comments in `del` - [35]
H3FVSQIQUnsized pages - [36]
EYNN7RLSTests++ (including UUID) - [37]
HN6Z5DU4Cleanup - [38]
NXMFNPZ7Comments + debugging drop - [39]
X3QVVQISMore debugging (del seems to work now) - [40]
T7QB6QEPAdding debug.rs - [41]
MSRWB47YDeletions at immutable leaves weren't really deleting anything - [42]
KMT3MF5NDrop a database - [43]
73Z2UB3JCleanup + comments
Change contents
- edit in sanakirja-core/src/lib.rs at line 1
#![no_std] - replacement in sanakirja-core/src/lib.rs at line 5
//! memory-mapped files, but if that environment is threatened, might//! seek refuge in lower-level environments.//! memory-mapped files, but if that environment is threatened, they//! might seek refuge in lower-level environments. - replacement in sanakirja-core/src/lib.rs at line 28
#![no_std] - edit in sanakirja-core/src/lib.rs at line 31
/// There's a hard-coded assumption that pages have 4K bytes. This is/// true for normal memory pages on almost all platforms. - edit in sanakirja-core/src/lib.rs at line 35
/// Types that can be stored on disk. - edit in sanakirja-core/src/lib.rs at line 37[5.44]→[5.148:444](∅→∅),[5.26]→[5.148:444](∅→∅),[5.148]→[5.148:444](∅→∅),[5.444]→[5.37:115](∅→∅),[5.65]→[5.505:506](∅→∅),[5.115]→[5.505:506](∅→∅),[5.95]→[5.505:506](∅→∅),[5.505]→[5.505:506](∅→∅)
/// An iterator over the offsets to pages contained in this/// value. Only values from this crate can generate non-empty/// iterators, but combined values (like tuples) must chain the/// iterators returned by method `page_offsets`.type PageOffsets: Iterator<Item = u64>;fn compare<T: LoadPage>(&self, txn: &T, b: &Self) -> core::cmp::Ordering; - edit in sanakirja-core/src/lib.rs at line 41
/// Some datastructures expect this to be at least the memory size/// of `Self` (as returned by `core::mem::size_of::<Self>()`). For/// example, the sized implementation of B trees sometimes/// allocates an instance of `Self` on the stack, and copy it from/// the - edit in sanakirja-core/src/lib.rs at line 48
/// If `Self::SIZE.is_some()`, this must return the same/// value. The default implementation is `Self;:SIZE.unwrap()`. - edit in sanakirja-core/src/lib.rs at line 54
/// Form a pointer to `Self` from a raw pointer. The purpose of/// this function is that the output can be a slim or a fat/// pointer (like for `&[u8]`). - edit in sanakirja-core/src/lib.rs at line 59
/// Read the size from an on-page entry. If `Self::SIZE.is_some()`/// this must be the same value. - edit in sanakirja-core/src/lib.rs at line 65
/// Write to a page. Must not overwrite the allocated size, but/// this isn't checkde (which is why it's unsafe). - edit in sanakirja-core/src/lib.rs at line 69
/// This is required for B trees, not necessarily for other/// structures. The default implementation panics.fn compare<T: LoadPage>(&self, _txn: &T, _b: &Self) -> core::cmp::Ordering {unimplemented!()}/// An iterator over the offsets to pages contained in this/// value. Only values from this crate can generate non-empty/// iterators, but combined values (like tuples) must chain the/// iterators returned by method `page_offsets`.type PageOffsets: Iterator<Item = u64>; - replacement in sanakirja-core/src/lib.rs at line 151
txn: &T,_txn: &T, - replacement in sanakirja-core/src/lib.rs at line 154
let s = K::size(K::from_raw_ptr(txn, k));let s = K::onpage_size(k); - replacement in sanakirja-core/src/lib.rs at line 179
/// Representation of a page.#[derive(Debug, Clone, Copy)]/// Representation of a mutable or shared page.#[derive(Debug)]#[repr(C)] - edit in sanakirja-core/src/lib.rs at line 188
#[repr(C)] - replacement in sanakirja-core/src/lib.rs at line 195
pub unsafe fn as_page(&self) -> Page {pub fn as_page(&self) -> Page { - replacement in sanakirja-core/src/lib.rs at line 197
data: &*(self.data as *const [u8; PAGE_SIZE]),data: unsafe { &*(self.data as *const [u8; PAGE_SIZE]) }, - replacement in sanakirja-core/src/btree/put.rs at line 31
let ref cur = cursor.current();let p = cursor.len(); // Save the position of the leaf cursor.let is_owned = p < cursor.first_rc_len;// Insert the key and value at the leaf, i.e. pop the top level of// the stack (the leaf) and insert in there.let cur = cursor.pop().unwrap(); - replacement in sanakirja-core/src/btree/put.rs at line 40
cursor.pointer() < cursor.first_rc_level,is_owned, - edit in sanakirja-core/src/btree/put.rs at line 65
let p = cursor.pointer(); // Save the position of cursor at the leaf. - replacement in sanakirja-core/src/btree/put.rs at line 103
debug!("Want to split the root"); - replacement in sanakirja-core/src/btree/put.rs at line 105[5.1770]→[5.81:123](∅→∅),[5.81]→[5.81:123](∅→∅),[5.123]→[5.1771:1911](∅→∅),[5.1911]→[5.79:113](∅→∅),[5.123]→[5.79:113](∅→∅),[5.123]→[5.70:118](∅→∅),[5.113]→[5.70:118](∅→∅),[5.70]→[5.70:118](∅→∅)
if cursor.pointer() > 0 {// If we aren't at the root, just pop the cursor// stack and insert a new entry in the page above.cursor.pop();let cur = cursor.current();let is_owned = cursor.len() < cursor.first_rc_len;if let Some(cur) = cursor.pop() {// In this case, there's a page above the page// that just split (since we can pop the stack),// so the page that just split isn't the root (but// `cur` might be). - replacement in sanakirja-core/src/btree/put.rs at line 114
cursor.pointer() < cursor.first_rc_level,is_owned, - replacement in sanakirja-core/src/btree/put.rs at line 124
// If we are at the root, the root has// split. Insert the split key/value in a new page// above the entire tree.// No page above the split, so the root has just// split. Insert the split key/value into a new// page above the entire tree. - replacement in sanakirja-core/src/btree/put.rs at line 159
if cursor.pointer() > 0 {let is_owned = cursor.len() < cursor.first_rc_len;if let Some(curs) = cursor.pop() { - edit in sanakirja-core/src/btree/put.rs at line 162[5.2729]→[5.114:148](∅→∅),[5.263]→[5.114:148](∅→∅),[5.263]→[5.573:626](∅→∅),[5.148]→[5.573:626](∅→∅),[5.573]→[5.573:626](∅→∅)
cursor.pop();let ref curs = cursor.current(); - replacement in sanakirja-core/src/btree/put.rs at line 165
cursor.pointer() < cursor.first_rc_level,is_owned, - replacement in sanakirja-core/src/btree/put.rs at line 191
if cursor.pointer() < cursor.first_rc_level {if cursor.len() < cursor.first_rc_len { - replacement in sanakirja-core/src/btree/put.rs at line 195
free[cursor.pointer()] = freed;free[cursor.len()] = freed; - replacement in sanakirja-core/src/btree/put.rs at line 199
if cursor.pointer() == cursor.first_rc_level {if cursor.len() == cursor.first_rc_len { - replacement in sanakirja-core/src/btree/put.rs at line 201
free[cursor.pointer()] = freed;free[cursor.len()] = freed; - replacement in sanakirja-core/src/btree/put.rs at line 213
let left = P::left_child(unsafe { cur.page.as_page() }, &c);let left = P::left_child(cur.page.as_page(), &c); - replacement in sanakirja-core/src/btree/put.rs at line 220
while let Some((k, v, r)) = P::next(txn, unsafe { cur.page.as_page() }, &mut c) {while let Some((k, v, r)) = P::next(txn, cur.page.as_page(), &mut c) { - replacement in sanakirja-core/src/btree/page_unsized.rs at line 97
let l = header(unsafe { page.as_page() }).left_page() & !0xfff;let l = header(page.as_page()).left_page() & !0xfff; - replacement in sanakirja-core/src/btree/page_unsized.rs at line 100
let s = Internal::offset_slice::<K, V>(unsafe { page.as_page() });let s = Internal::offset_slice::<K, V>(page.as_page()); - replacement in sanakirja-core/src/btree/page_unsized.rs at line 102
clone::<K, V, Internal>(unsafe { page.as_page() }, &mut new, s, &mut n);clone::<K, V, Internal>(page.as_page(), &mut new, s, &mut n); - replacement in sanakirja-core/src/btree/page_unsized.rs at line 188
m: &mut Concat<'a, K, V, Self>,m: Concat<'a, K, V, Self>, - replacement in sanakirja-core/src/btree/page_unsized.rs at line 198
let hdr = header(unsafe { m.other.as_page() });let hdr = header(m.other.as_page()); - edit in sanakirja-core/src/btree/page_unsized.rs at line 210
let freed = {let b0 = if m.modified.page.is_dirty() { 1 } else { 0 };let b1 = if m.other.is_dirty() { 1 } else { 0 };[m.modified.page.offset | b0, m.other.offset | b1]}; - edit in sanakirja-core/src/btree/page_unsized.rs at line 220
let b0 = if m.modified.page.is_dirty() { 1 } else { 0 };let b1 = if m.other.is_dirty() { 1 } else { 0 }; - replacement in sanakirja-core/src/btree/page_unsized.rs at line 222
freed: [m.modified.page.offset | b0, m.other.offset | b1],freed, - replacement in sanakirja-core/src/btree/page_unsized.rs at line 227
let first_size = <Page<K, V>>::current_size(unsafe { m.other.as_page() }, &rc);let first_size = <Page<K, V>>::current_size(m.other.as_page(), &rc); - replacement in sanakirja-core/src/btree/page_unsized.rs at line 274
let hdr = header(unsafe { m.page.as_page() });let hdr = header(m.page.as_page()); - replacement in sanakirja-core/src/btree/page_unsized.rs at line 286
total -= <Page<K, V> as BTreePage<K, V>>::current_size(unsafe { m.page.as_page() }, &m.c1)as usize;total -= <Page<K, V> as BTreePage<K, V>>::current_size(m.page.as_page(), &m.c1) as usize; - replacement in sanakirja-core/src/btree/page_unsized.rs at line 550
let mut l = <Page<K, V>>::left_child(unsafe { m.page.as_page() }, &m.c0);while let Some((k, v, r)) = <Page<K, V>>::next(txn, unsafe { m.page.as_page() }, &mut m.c0) {let mut l = <Page<K, V>>::left_child(m.page.as_page(), &m.c0);while let Some((k, v, r)) = <Page<K, V>>::next(txn, m.page.as_page(), &mut m.c0) { - replacement in sanakirja-core/src/btree/page_unsized.rs at line 566
while let Some((k, v, r)) = <Page<K, V>>::next(txn, unsafe { m.page.as_page() }, &mut m.c1) {while let Some((k, v, r)) = <Page<K, V>>::next(txn, m.page.as_page(), &mut m.c1) { - replacement in sanakirja-core/src/btree/page_unsized.rs at line 584
m: &mut Concat<K, V, Page<K, V>>,mut m: Concat<K, V, Page<K, V>>, - replacement in sanakirja-core/src/btree/page_unsized.rs at line 590
let l = <Page<K, V>>::left_child(unsafe { m.other.as_page() }, &rc);let l = <Page<K, V>>::left_child(m.other.as_page(), &rc); - replacement in sanakirja-core/src/btree/page_unsized.rs at line 592
while let Some((k, v, r)) = <Page<K, V>>::next(txn, unsafe { m.other.as_page() }, &mut rc) {while let Some((k, v, r)) = <Page<K, V>>::next(txn, m.other.as_page(), &mut rc) { - replacement in sanakirja-core/src/btree/page_unsized.rs at line 597
let mut l = <Page<K, V>>::left_child(unsafe { m.other.as_page() }, &rc);while let Some((k, v, r)) = <Page<K, V>>::next(txn, unsafe { m.other.as_page() }, &mut rc) {let mut l = <Page<K, V>>::left_child(m.other.as_page(), &rc);while let Some((k, v, r)) = <Page<K, V>>::next(txn, m.other.as_page(), &mut rc) { - replacement in sanakirja-core/src/btree/page_unsized/rebalance.rs at line 12
m: &mut Concat<'a, K, V, Page<K, V>>,m: Concat<'a, K, V, Page<K, V>>, - replacement in sanakirja-core/src/btree/page_unsized/rebalance.rs at line 19
let rl = <Page<K, V>>::left_child(unsafe { m.other.as_page() }, &rc);let (k, v, r) = <Page<K, V>>::current(txn, unsafe { m.other.as_page() }, &rc).unwrap();let rl = <Page<K, V>>::left_child(m.other.as_page(), &rc);let (k, v, r) = <Page<K, V>>::current(txn, m.other.as_page(), &rc).unwrap();// Extend the lifetimes of k and v.let (k, v): (&K, &V) = unsafe { (core::mem::transmute(k), core::mem::transmute(v)) }; - edit in sanakirja-core/src/btree/page_unsized/rebalance.rs at line 27
let is_dirty = m.modified.page.is_dirty(); - replacement in sanakirja-core/src/btree/page_unsized/rebalance.rs at line 41
let b = if header(unsafe { m.modified.page.as_page() }).is_dirty() {1} else {0};let b = if is_dirty { 1 } else { 0 }; - edit in sanakirja-core/src/btree/page_unsized/rebalance.rs at line 49
let is_dirty = m.modified.page.is_dirty(); - replacement in sanakirja-core/src/btree/page_unsized/rebalance.rs at line 58[5.812]→[4.1728:1809](∅→∅),[5.2108]→[5.877:949](∅→∅),[4.1809]→[5.877:949](∅→∅),[5.877]→[5.877:949](∅→∅)
let b = if header(unsafe { m.modified.page.as_page() }).is_dirty() {1} else {0};let b = if is_dirty { 1 } else { 0 }; - replacement in sanakirja-core/src/btree/page_unsized/rebalance.rs at line 63
let lc = PageCursor::after(&m.modified.page);if let Put::Ok(Ok { page, freed }) = <Page<K, V>>::put(let lc = PageCursor::after(&new_left.0);let new_left = if let Put::Ok(Ok { freed, page }) = <Page<K, V>>::put( - edit in sanakirja-core/src/btree/page_unsized/rebalance.rs at line 67
assert_eq!(page.0.offset, new_left.0.offset); - edit in sanakirja-core/src/btree/page_unsized/rebalance.rs at line 68
page - edit in sanakirja-core/src/btree/page_unsized/rebalance.rs at line 73
let b = {let hdr = &*header(m.other.as_page());if hdr.is_dirty() {1} else {0}}; - edit in sanakirja-core/src/btree/page_unsized/rebalance.rs at line 82
let (k, v): (&K, &V) = unsafe { (core::mem::transmute(k), core::mem::transmute(v)) }; - edit in sanakirja-core/src/btree/page_unsized/rebalance.rs at line 83
let hdr = &*header(unsafe { m.other.as_page() });let b = if hdr.is_dirty() { 1 } else { 0 }; - replacement in sanakirja-core/src/btree/page_unsized/rebalance.rs at line 103
m: &mut Concat<'a, K, V, Page<K, V>>,m: Concat<'a, K, V, Page<K, V>>, - replacement in sanakirja-core/src/btree/page_unsized/rebalance.rs at line 107
let lc = super::PageCursor::last(unsafe { m.other.as_page() });let (k0, v0, r0) = <Page<K, V>>::current(txn, unsafe { m.other.as_page() }, &lc).unwrap();let lc = super::PageCursor::last(m.other.as_page());let (k0, v0, r0) = <Page<K, V>>::current(txn, m.other.as_page(), &lc).unwrap(); - replacement in sanakirja-core/src/btree/page_unsized/rebalance.rs at line 112
let rl = <Page<K, V>>::left_child(unsafe { m.modified.page.as_page() }, &rc);let rl = <Page<K, V>>::left_child(m.modified.page.as_page(), &rc); - edit in sanakirja-core/src/btree/page_unsized/rebalance.rs at line 117
let is_dirty = m.modified.page.is_dirty(); - replacement in sanakirja-core/src/btree/page_unsized/rebalance.rs at line 131
let b = if header(unsafe { m.modified.page.as_page() }).is_dirty() {1} else {0};let b = if is_dirty { 1 } else { 0 }; - edit in sanakirja-core/src/btree/page_unsized/rebalance.rs at line 139
let is_dirty = m.modified.page.is_dirty(); - replacement in sanakirja-core/src/btree/page_unsized/rebalance.rs at line 148[5.1533]→[4.2202:2283](∅→∅),[5.2829]→[5.1599:1671](∅→∅),[4.2283]→[5.1599:1671](∅→∅),[5.1599]→[5.1599:1671](∅→∅)
let b = if header(unsafe { m.modified.page.as_page() }).is_dirty() {1} else {0};let b = if is_dirty { 1 } else { 0 }; - replacement in sanakirja-core/src/btree/page_unsized/rebalance.rs at line 153
if let Put::Ok(Ok { freed, .. }) = <Page<K, V>>::put(let new_right = if let Put::Ok(Ok { freed, page }) = <Page<K, V>>::put( - edit in sanakirja-core/src/btree/page_unsized/rebalance.rs at line 166
page - edit in sanakirja-core/src/btree/page_unsized/rebalance.rs at line 171
let k = unsafe { core::mem::transmute(k0) };let v = unsafe { core::mem::transmute(v0) };let b = {let hdr = &*header(m.other.as_page());if hdr.is_dirty() {1} else {0}}; - edit in sanakirja-core/src/btree/page_unsized/rebalance.rs at line 183
let hdr = &*header(unsafe { m.other.as_page() });let b = if hdr.is_dirty() { 1 } else { 0 }; - replacement in sanakirja-core/src/btree/page_unsized/rebalance.rs at line 188
k: unsafe { core::mem::transmute(k0) },v: unsafe { core::mem::transmute(v0) },k,v, - replacement in sanakirja-core/src/btree/page_unsized/put.rs at line 30
let cur_size = Internal::current_size::<K, V>(unsafe { page.as_page() }, u as isize);let cur_size = Internal::current_size::<K, V>(page.as_page(), u as isize); - replacement in sanakirja-core/src/btree/page_unsized/put.rs at line 35
let hdr = header(unsafe { page.as_page() });let hdr = header(page.as_page()); - replacement in sanakirja-core/src/btree/page_unsized/put.rs at line 38
if mutable && is_dirty && L::can_alloc(header(unsafe { page.as_page() }), size) {if mutable && is_dirty && L::can_alloc(header(page.as_page()), size) { - edit in sanakirja-core/src/btree/page_unsized/put.rs at line 43
let p = page.0.data;let hdr = header_mut(&mut page); - edit in sanakirja-core/src/btree/page_unsized/put.rs at line 47
let p = page.0.data; - edit in sanakirja-core/src/btree/page_unsized/put.rs at line 52
let hdr = header_mut(&mut page); - replacement in sanakirja-core/src/btree/page_unsized/put.rs at line 68
let s = L::offset_slice::<K, V>(unsafe { page.as_page() });let s = L::offset_slice::<K, V>(page.as_page()); - replacement in sanakirja-core/src/btree/page_unsized/put.rs at line 72
clone::<K, V, L>(unsafe { page.as_page() }, &mut new, s0, &mut n);clone::<K, V, L>(page.as_page(), &mut new, s0, &mut n); - replacement in sanakirja-core/src/btree/page_unsized/put.rs at line 79
clone::<K, V, L>(unsafe { page.as_page() }, &mut new, s1, &mut n);clone::<K, V, L>(page.as_page(), &mut new, s1, &mut n); - replacement in sanakirja-core/src/btree/page_unsized/put.rs at line 88
return split_unsized::<_, _, _, L>(txn,unsafe { page.as_page() },replace,u,k0,v0,k1v1,l,r,);return split_unsized::<_, _, _, L>(txn, page.as_page(), replace, u, k0, v0, k1v1, l, r); - edit in sanakirja-core/src/btree/page.rs at line 14
/// This struct is used to allocate a pair `(K, V)` on the stack, and/// copy it from a C pointer from a page.////// This is also used to form slices of pairs in order to use/// functions from the core library. - edit in sanakirja-core/src/btree/page.rs at line 26
fn tuple_size<K: Representable, V: Representable>() -> usize {let s = ((K::SIZE.unwrap() + V::ALIGN - 1) & !(V::ALIGN - 1)) + V::SIZE.unwrap();let al = K::ALIGN.max(V::ALIGN);(s + al - 1) & !(al - 1)} - replacement in sanakirja-core/src/btree/page.rs at line 55
let f = tuple_size::<K, V>();let f = core::mem::size_of::<Tuple<K, V>>(); - replacement in sanakirja-core/src/btree/page.rs at line 87
tuple_size::<K, V>()core::mem::size_of::<Tuple<K, V>>() - replacement in sanakirja-core/src/btree/page.rs at line 146
let f = tuple_size::<K, V>();let f = core::mem::size_of::<Tuple<K, V>>(); - replacement in sanakirja-core/src/btree/page.rs at line 264
let l = header(unsafe { page.as_page() }).left_page() & !0xfff;let l = header(page.as_page()).left_page() & !0xfff; - replacement in sanakirja-core/src/btree/page.rs at line 267
let s = Internal::offset_slice::<T, K, V>(unsafe { page.as_page() });let s = Internal::offset_slice::<T, K, V>(page.as_page()); - replacement in sanakirja-core/src/btree/page.rs at line 269
clone::<K, V, Internal>(unsafe { page.as_page() }, &mut new, s, &mut n);clone::<K, V, Internal>(page.as_page(), &mut new, s, &mut n); - replacement in sanakirja-core/src/btree/page.rs at line 294
let f = tuple_size::<K, V>();let f = core::mem::size_of::<Tuple<K, V>>(); - replacement in sanakirja-core/src/btree/page.rs at line 359
m: &mut Concat<'a, K, V, Self>,m: Concat<'a, K, V, Self>, - replacement in sanakirja-core/src/btree/page.rs at line 363
let f = tuple_size::<K, V>();let f = core::mem::size_of::<Tuple<K, V>>(); - replacement in sanakirja-core/src/btree/page.rs at line 372
let hdr = header(unsafe { m.other.as_page() });let hdr = header(m.other.as_page()); - edit in sanakirja-core/src/btree/page.rs at line 380
let freed = {let b0 = if m.modified.page.is_dirty() { 1 } else { 0 };let b1 = if m.other.is_dirty() { 1 } else { 0 };[m.modified.page.offset | b0, m.other.offset | b1]}; - edit in sanakirja-core/src/btree/page.rs at line 390
let b0 = if m.modified.page.is_dirty() { 1 } else { 0 };let b1 = if m.other.is_dirty() { 1 } else { 0 }; - replacement in sanakirja-core/src/btree/page.rs at line 392
freed: [m.modified.page.offset | b0, m.other.offset | b1],freed, - replacement in sanakirja-core/src/btree/page.rs at line 397
let first_size = <Page<K, V>>::current_size(unsafe { m.other.as_page() }, &rc);let first_size = <Page<K, V>>::current_size(m.other.as_page(), &rc); - replacement in sanakirja-core/src/btree/page.rs at line 442
let hdr = header(unsafe { m.page.as_page() });let hdr = header(m.page.as_page()); - replacement in sanakirja-core/src/btree/page.rs at line 459
total -= <Page<K, V> as BTreePage<K, V>>::current_size(unsafe { m.page.as_page() }, &m.c1)as usize;total -= <Page<K, V> as BTreePage<K, V>>::current_size(m.page.as_page(), &m.c1) as usize; - replacement in sanakirja-core/src/btree/page.rs at line 580
let mut l = <Page<K, V>>::left_child(unsafe { m.page.as_page() }, &m.c0);while let Some((k, v, r)) = <Page<K, V>>::next(txn, unsafe { m.page.as_page() }, &mut m.c0) {let mut l = <Page<K, V>>::left_child(m.page.as_page(), &m.c0);while let Some((k, v, r)) = <Page<K, V>>::next(txn, m.page.as_page(), &mut m.c0) { - replacement in sanakirja-core/src/btree/page.rs at line 596
while let Some((k, v, r)) = <Page<K, V>>::next(txn, unsafe { m.page.as_page() }, &mut m.c1) {while let Some((k, v, r)) = <Page<K, V>>::next(txn, m.page.as_page(), &mut m.c1) { - replacement in sanakirja-core/src/btree/page.rs at line 614
m: &mut Concat<K, V, Page<K, V>>,mut m: Concat<K, V, Page<K, V>>, - replacement in sanakirja-core/src/btree/page.rs at line 620
let l = <Page<K, V>>::left_child(unsafe { m.other.as_page() }, &rc);let l = <Page<K, V>>::left_child(m.other.as_page(), &rc); - replacement in sanakirja-core/src/btree/page.rs at line 622
while let Some((k, v, r)) = <Page<K, V>>::next(txn, unsafe { m.other.as_page() }, &mut rc) {while let Some((k, v, r)) = <Page<K, V>>::next(txn, m.other.as_page(), &mut rc) { - replacement in sanakirja-core/src/btree/page.rs at line 627
let mut l = <Page<K, V>>::left_child(unsafe { m.other.as_page() }, &rc);while let Some((k, v, r)) = <Page<K, V>>::next(txn, unsafe { m.other.as_page() }, &mut rc) {let mut l = <Page<K, V>>::left_child(m.other.as_page(), &rc);while let Some((k, v, r)) = <Page<K, V>>::next(txn, m.other.as_page(), &mut rc) { - replacement in sanakirja-core/src/btree/page.rs at line 659
let size = tuple_size::<K, V>();let size = core::mem::size_of::<Tuple<K, V>>(); - replacement in sanakirja-core/src/btree/page/rebalance.rs at line 12
m: &mut Concat<'a, K, V, Page<K, V>>,m: Concat<'a, K, V, Page<K, V>>, - replacement in sanakirja-core/src/btree/page/rebalance.rs at line 18
let rl = <Page<K, V>>::left_child(unsafe { m.other.as_page() }, &rc);let (k, v, r) = <Page<K, V>>::current(txn, unsafe { m.other.as_page() }, &rc).unwrap();let rl = <Page<K, V>>::left_child(m.other.as_page(), &rc);let (k, v, r) = <Page<K, V>>::current(txn, m.other.as_page(), &rc).unwrap(); - replacement in sanakirja-core/src/btree/page/rebalance.rs at line 23
let mut new_left = if let Some((k, v)) = m.modified.ins {let new_left = if let Some((k, v)) = m.modified.ins {let is_dirty = m.modified.page.is_dirty(); - replacement in sanakirja-core/src/btree/page/rebalance.rs at line 38
let b = if header(unsafe { m.modified.page.as_page() }).is_dirty() {1} else {0};let b = if is_dirty { 1 } else { 0 }; - edit in sanakirja-core/src/btree/page/rebalance.rs at line 46
let is_dirty = m.modified.page.is_dirty(); - replacement in sanakirja-core/src/btree/page/rebalance.rs at line 55
let b = if header(unsafe { m.modified.page.as_page() }).is_dirty() {1} else {0};let b = if is_dirty { 1 } else { 0 }; - replacement in sanakirja-core/src/btree/page/rebalance.rs at line 60
let lc = PageCursor::after(&m.modified.page);if let Put::Ok(Ok { page, freed }) = <Page<K, V>>::put(let lc = PageCursor::after(&new_left.0);let new_left = if let Put::Ok(Ok { page, freed }) = <Page<K, V>>::put( - replacement in sanakirja-core/src/btree/page/rebalance.rs at line 64[5.8596]→[5.2525:2548](∅→∅),[5.2525]→[5.2525:2548](∅→∅),[5.2548]→[4.4572:4648](∅→∅),[4.4648]→[5.2613:2754](∅→∅),[5.2613]→[5.2613:2754](∅→∅)
if freed > 0 {let b = if header(unsafe { new_left.0.as_page() }).is_dirty() {1} else {0};freed_[0] = freed | b;}new_left = pageassert_eq!(freed, 0);page - replacement in sanakirja-core/src/btree/page/rebalance.rs at line 70
let right_hdr = header(unsafe { m.other.as_page() });let f = tuple_size::<K, V>();let right_hdr = header(m.other.as_page());let f = core::mem::size_of::<Tuple<K, V>>(); - edit in sanakirja-core/src/btree/page/rebalance.rs at line 100
let k = unsafe { core::mem::transmute(k) };let v = unsafe { core::mem::transmute(v) };let is_dirty = m.other.is_dirty(); - replacement in sanakirja-core/src/btree/page/rebalance.rs at line 106
let hdr = &*header(unsafe { m.other.as_page() });let b = if hdr.is_dirty() { 1 } else { 0 };freed_[1] = freed | b;freed_[1] = freed | if is_dirty { 1 } else { 0 }; - replacement in sanakirja-core/src/btree/page/rebalance.rs at line 108
unsafe { (page, core::mem::transmute(k), core::mem::transmute(v)) }(page, k, v) - replacement in sanakirja-core/src/btree/page/rebalance.rs at line 113
k: unsafe { core::mem::transmute(k) },v: unsafe { core::mem::transmute(v) },k,v, - replacement in sanakirja-core/src/btree/page/rebalance.rs at line 128
m: &mut Concat<'a, K, V, Page<K, V>>,m: Concat<'a, K, V, Page<K, V>>, - replacement in sanakirja-core/src/btree/page/rebalance.rs at line 132
let lc = PageCursor::last(unsafe { m.other.as_page() });let (k0, v0, r0) = <Page<K, V>>::current(txn, unsafe { m.other.as_page() }, &lc).unwrap();let lc = PageCursor::last(m.other.as_page());let (k0, v0, r0) = <Page<K, V>>::current(txn, m.other.as_page(), &lc).unwrap(); - replacement in sanakirja-core/src/btree/page/rebalance.rs at line 137
let rl = <Page<K, V>>::left_child(unsafe { m.modified.page.as_page() }, &rc);let rl = <Page<K, V>>::left_child(m.modified.page.as_page(), &rc); - edit in sanakirja-core/src/btree/page/rebalance.rs at line 142
let is_dirty = m.modified.page.is_dirty(); - replacement in sanakirja-core/src/btree/page/rebalance.rs at line 155
let b = if header(unsafe { m.modified.page.as_page() }).is_dirty() {1} else {0};let b = if is_dirty { 1 } else { 0 }; - edit in sanakirja-core/src/btree/page/rebalance.rs at line 162
let is_dirty = m.modified.page.is_dirty(); - replacement in sanakirja-core/src/btree/page/rebalance.rs at line 171[5.3205]→[4.5093:5174](∅→∅),[5.8701]→[5.3271:3343](∅→∅),[4.5174]→[5.3271:3343](∅→∅),[5.3271]→[5.3271:3343](∅→∅)
let b = if header(unsafe { m.modified.page.as_page() }).is_dirty() {1} else {0};let b = if is_dirty { 1 } else { 0 }; - replacement in sanakirja-core/src/btree/page/rebalance.rs at line 176
if let Put::Ok(Ok { page, freed }) = <Page<K, V>>::put(let new_right = if let Put::Ok(Ok { freed, page }) = <Page<K, V>>::put( - replacement in sanakirja-core/src/btree/page/rebalance.rs at line 189
assert_eq!(new_right.0.offset, page.0.offset);page - edit in sanakirja-core/src/btree/page/rebalance.rs at line 194
let k = unsafe { core::mem::transmute(k0) };let v = unsafe { core::mem::transmute(v0) };let is_dirty = m.other.is_dirty(); - replacement in sanakirja-core/src/btree/page/rebalance.rs at line 200[5.9052]→[4.5175:5233](∅→∅),[4.5233]→[5.5618:5670](∅→∅),[5.5618]→[5.5618:5670](∅→∅),[5.5670]→[5.9053:9083](∅→∅)
let hdr = &*header(unsafe { m.other.as_page() });let b = if hdr.is_dirty() { 1 } else { 0 };freed_[1] = freed | bfreed_[1] = freed | if is_dirty { 1 } else { 0 } - replacement in sanakirja-core/src/btree/page/rebalance.rs at line 205
k: unsafe { core::mem::transmute(k0) },v: unsafe { core::mem::transmute(v0) },k,v, - replacement in sanakirja-core/src/btree/page/put.rs at line 27
let hdr = header(unsafe { page.as_page() });let hdr = header(page.as_page()); - replacement in sanakirja-core/src/btree/page/put.rs at line 29
if mutable && is_dirty && L::can_alloc::<K, V>(header(unsafe { page.as_page() }), size) {if mutable && is_dirty && L::can_alloc::<K, V>(header(page.as_page()), size) { - edit in sanakirja-core/src/btree/page/put.rs at line 31
let p = page.0.data;let hdr = header_mut(&mut page); - edit in sanakirja-core/src/btree/page/put.rs at line 37
let p = page.0.data; - edit in sanakirja-core/src/btree/page/put.rs at line 42
let hdr = header_mut(&mut page); - replacement in sanakirja-core/src/btree/page/put.rs at line 58
let s = L::offset_slice::<T, K, V>(unsafe { page.as_page() });let s = L::offset_slice::<T, K, V>(page.as_page()); - replacement in sanakirja-core/src/btree/page/put.rs at line 62
clone::<K, V, L>(unsafe { page.as_page() }, &mut new, s0, &mut n);clone::<K, V, L>(page.as_page(), &mut new, s0, &mut n); - replacement in sanakirja-core/src/btree/page/put.rs at line 71
debug!("alloc: {:?}",header(unsafe { new.0.as_page() }).left_page());clone::<K, V, L>(unsafe { page.as_page() }, &mut new, s1, &mut n);debug!("alloc: {:?}", header(new.0.as_page()).left_page());clone::<K, V, L>(page.as_page(), &mut new, s1, &mut n); - replacement in sanakirja-core/src/btree/page/put.rs at line 82
let s = tuple_size::<K, V>();let s = core::mem::size_of::<Tuple<K, V>>(); - replacement in sanakirja-core/src/btree/page/put.rs at line 106
let hdr = header(unsafe { page.as_page() });let hdr = header(page.as_page()); - replacement in sanakirja-core/src/btree/page/put.rs at line 113
let s = L::offset_slice::<T, K, V>(unsafe { page.as_page() });let s = L::offset_slice::<T, K, V>(page.as_page()); - replacement in sanakirja-core/src/btree/page/put.rs at line 120
let (k, v, r) = L::kv(txn, unsafe { page.as_page() }, s1a.first::<T, K, V>());let (k, v, r) = L::kv(txn, page.as_page(), s1a.first::<T, K, V>()); - edit in sanakirja-core/src/btree/page/put.rs at line 125
// If we are here, u >= k, i.e. the insertion is in the right-hand// side of the split.let mut right = txn.alloc_page()?;<Page<K, V> as BTreeMutPage<K, V>>::init(&mut right);if u > k as usize {let mut n = 0;let kk = u as usize - k as usize - 1;let (s1a, s1b) = s1.split_at(kk);L::set_right_child(&mut right, -1, mid_child);clone::<K, V, L>(page.as_page(), &mut right, s1a, &mut n);alloc::<K, V, L>(&mut right, k0, v0, l, r, &mut n);clone::<K, V, L>(page.as_page(), &mut right, s1b, &mut n);} else {let mut n = 0;clone::<K, V, L>(page.as_page(), &mut right, s1, &mut n);} - replacement in sanakirja-core/src/btree/page/put.rs at line 153
clone::<K, V, L>(unsafe { page.as_page() }, &mut left, s0, &mut n);clone::<K, V, L>(page.as_page(), &mut left, s0, &mut n); - replacement in sanakirja-core/src/btree/page/put.rs at line 156[5.10249]→[5.10249:10420](∅→∅),[5.10420]→[5.8555:8617](∅→∅),[5.8617]→[5.10485:10668](∅→∅),[5.10485]→[5.10485:10668](∅→∅),[5.10668]→[4.6003:6085](∅→∅),[4.6085]→[5.8689:8753](∅→∅),[5.8689]→[5.8689:8753](∅→∅),[5.8753]→[4.6086:6168](∅→∅),[4.6168]→[5.10883:10900](∅→∅),[5.8824]→[5.10883:10900](∅→∅),[5.10883]→[5.10883:10900](∅→∅)
// If we are here, u >= k, i.e. the insertion is in the right-hand// side of the split.let mut n = 0;let mut right = txn.alloc_page()?;<Page<K, V> as BTreeMutPage<K, V>>::init(&mut right);if u > k as usize {let kk = u as usize - k as usize - 1;let (s1a, s1b) = s1.split_at(kk);L::set_right_child(&mut right, -1, mid_child);clone::<K, V, L>(unsafe { page.as_page() }, &mut right, s1a, &mut n);alloc::<K, V, L>(&mut right, k0, v0, l, r, &mut n);clone::<K, V, L>(unsafe { page.as_page() }, &mut right, s1b, &mut n);} else {if u == k as usize { - edit in sanakirja-core/src/btree/page/put.rs at line 163
clone::<K, V, L>(unsafe { page.as_page() }, &mut right, s1, &mut n); - replacement in sanakirja-core/src/btree/page/put.rs at line 175
let ll = header(unsafe { page.as_page() }).left_page() & !0xfff;let ll = header(page.as_page()).left_page() & !0xfff; - replacement in sanakirja-core/src/btree/page/put.rs at line 178
clone::<K, V, L>(unsafe { page.as_page() }, &mut left, s0a, &mut n);clone::<K, V, L>(page.as_page(), &mut left, s0a, &mut n); - replacement in sanakirja-core/src/btree/page/put.rs at line 180
clone::<K, V, L>(unsafe { page.as_page() }, &mut left, s0b, &mut n);clone::<K, V, L>(page.as_page(), &mut left, s0b, &mut n); - replacement in sanakirja-core/src/btree/page/put.rs at line 198
clone::<K, V, L>(unsafe { page.as_page() }, &mut right, s1, &mut n);clone::<K, V, L>(page.as_page(), &mut right, s1, &mut n); - replacement in sanakirja-core/src/btree/page/alloc.rs at line 62
let size = tuple_size::<K, V>();let size = core::mem::size_of::<Tuple<K, V>>(); - replacement in sanakirja-core/src/btree/page/alloc.rs at line 76
let f = tuple_size::<K, V>();let f = core::mem::size_of::<Tuple<K, V>>(); - replacement in sanakirja-core/src/btree/page/alloc.rs at line 100
let f = tuple_size::<K, V>();let f = core::mem::size_of::<Tuple<K, V>>(); - edit in sanakirja-core/src/btree/page/alloc.rs at line 107
// This performs a rotation by 1 without all the rotation// machinery from the core lib. - replacement in sanakirja-core/src/btree/page/alloc.rs at line 147
let f = tuple_size::<K, V>();let f = core::mem::size_of::<Tuple<K, V>>(); - replacement in sanakirja-core/src/btree/page/alloc.rs at line 222
let f = tuple_size::<K, V>();let f = core::mem::size_of::<Tuple<K, V>>(); - replacement in sanakirja-core/src/btree/mod.rs at line 216
m: &'b mut Concat<'a, K, V, Self>,m: Concat<'a, K, V, Self>, - replacement in sanakirja-core/src/btree/mod.rs at line 392
if let Ok((kk, vv, _)) = P::set_cursor(txn, unsafe { page.as_page() }, &mut cursor, k, v) {if let Ok((kk, vv, _)) = P::set_cursor(txn, page.as_page(), &mut cursor, k, v) { - replacement in sanakirja-core/src/btree/mod.rs at line 397
} else if let Some((k, v, _)) = P::current(txn, unsafe { page.as_page() }, &cursor) {} else if let Some((k, v, _)) = P::current(txn, page.as_page(), &cursor) { - replacement in sanakirja-core/src/btree/mod.rs at line 407
let next_page = P::left_child(unsafe { page.as_page() }, &cursor);let next_page = P::left_child(page.as_page(), &cursor); - edit in sanakirja-core/src/btree/mod.rs at line 456
MaybeUninit::uninit(),MaybeUninit::uninit(),MaybeUninit::uninit(),MaybeUninit::uninit(),MaybeUninit::uninit(),MaybeUninit::uninit(),MaybeUninit::uninit(),MaybeUninit::uninit(),MaybeUninit::uninit(), - replacement in sanakirja-core/src/btree/mod.rs at line 485
if let Some((k, v, _)) = P::current(txn, unsafe { cur.page.as_page() }, &cur.cursor) {if let Some((k, v, _)) = P::current(txn, cur.page.as_page(), &cur.cursor) { - replacement in sanakirja-core/src/btree/mod.rs at line 494
let r = P::left_child(unsafe { cur.page.as_page() }, &cur.cursor);let r = P::left_child(cur.page.as_page(), &cur.cursor); - replacement in sanakirja-core/src/btree/del.rs at line 43
let p0 = cursor.pointer();let p0 = cursor.len(); - replacement in sanakirja-core/src/btree/del.rs at line 53
if p0 < cursor.first_rc_level {if p0 < cursor.first_rc_len { - replacement in sanakirja-core/src/btree/del.rs at line 56
P::current(txn, unsafe { cur.page.as_page() }, &cur.cursor).unwrap()P::current(txn, cur.page.as_page(), &cur.cursor).unwrap() - replacement in sanakirja-core/src/btree/del.rs at line 66
let mut left_page = P::right_child(unsafe { cur.page.as_page() }, &cur.cursor);let mut left_page = P::right_child(cur.page.as_page(), &cur.cursor); - edit in sanakirja-core/src/btree/del.rs at line 68
if cursor.first_rc_len >= N_CURSORS && txn.rc(left_page)? >= 2 {cursor.first_rc_len = cursor.len()} - replacement in sanakirja-core/src/btree/del.rs at line 73
left_page = P::left_child(unsafe { page.as_page() }, &curs);left_page = P::left_child(page.as_page(), &curs); - edit in sanakirja-core/src/btree/del.rs at line 76
let leaf_is_shared = cursor.len() >= cursor.first_rc_len; - replacement in sanakirja-core/src/btree/del.rs at line 86
if cursor.pointer() >= cursor.first_rc_level {if leaf_is_shared { - replacement in sanakirja-core/src/btree/del.rs at line 92[5.55587]→[5.17067:17134](∅→∅),[5.1308]→[5.1308:1341](∅→∅),[5.1341]→[5.386:408](∅→∅),[5.1341]→[5.17136:17471](∅→∅),[5.408]→[5.17136:17471](∅→∅),[5.17136]→[5.17136:17471](∅→∅),[5.17471]→[5.2443:2510](∅→∅)
// Then, climb up the stack, performing the operations lazily.while cursor.pointer() > 0 {cursor.pop();// Prepare a plan for merging the current modified page (that// page is at level cursor.pointer + 1) with one of its// neighbours.//// This is a little bit convoluted, but we do have to get up// one level in order to fetch the right or left sibling of// the modified page.let mut concat = concat(txn, cursor, p0, &k0v0, last_op)?;// Then, climb up the stack, performing the operations lazily. At// each step, we are one level above the page that we plan to// modify, since `last_op` is the result of popping the// stack.//// We iterate up to the root. The last iteration builds a modified// page for the root, but doesn't actually execute it.while cursor.len() > 0 {// Prepare a plan for merging the current modified page (which// is stored in `last_op`) with one of its neighbours.let concat = concat(txn, cursor, p0, &k0v0, last_op)?;let mil = concat.mod_is_left; - replacement in sanakirja-core/src/btree/del.rs at line 105[5.17539]→[5.17539:17603](∅→∅),[5.17603]→[5.848:1078](∅→∅),[5.1078]→[5.4202:4264](∅→∅),[5.30986]→[5.4202:4264](∅→∅),[5.6963]→[5.4202:4264](∅→∅),[5.17624]→[5.4202:4264](∅→∅),[5.32226]→[5.4202:4264](∅→∅)
// Execute the plan, resulting in one of four different// outcomes. This mutates or clones the children page,// i.e. the page at level `cursor.pointer + 1`, returning an// `Op` describing what happened (between update, merge,// rebalance and split).let merge = P::merge_or_rebalance(txn, &mut concat)?;// Execute the modification plan, resulting in one of four// different outcomes (described in the big match in// `handle_merge`). This mutates or clones the current// modified page, returning an `Op` describing what happened// (between update, merge, rebalance and split).let merge = P::merge_or_rebalance(txn, concat)?; - replacement in sanakirja-core/src/btree/del.rs at line 112[5.17626]→[5.17626:17696](∅→∅),[5.17696]→[5.1079:1200](∅→∅),[5.1200]→[5.30987:31025](∅→∅),[5.17789]→[5.30987:31025](∅→∅),[5.7002]→[5.30987:31025](∅→∅)
// Prepare a description (`last_op`) of the page modification// to be performed at level `p` (i.e. at level// `cursor.pointer`), without mutating/cloning that page.let mil = concat.mod_is_left;// Prepare a description (`last_op`) of the next page// modification, without mutating nor cloning that page. - replacement in sanakirja-core/src/btree/del.rs at line 119
if cursor.pointer() >= cursor.first_rc_level {//// Since `handle_merge` pops the stack, the modified page is// at level `cursor.len() + 1`.if cursor.len() + 1 >= cursor.first_rc_len { - replacement in sanakirja-core/src/btree/del.rs at line 127
// The last operation was on the root (i.e. at level 1), and that// operation still needs to be executed.let root_is_shared = cursor.first_rc_level == 0;// The last modification plan was on the root, and still needs to// be executed.let root_is_shared = cursor.first_rc_len == 1; - replacement in sanakirja-core/src/btree/del.rs at line 161
let is_rc = cursor.pointer() >= cursor.first_rc_level;let del_at_internal = p0 < cursor.pointer();let ref mut curs0 = cursor.last();let is_rc = cursor.len() >= cursor.first_rc_len;let del_at_internal = p0 < cursor.len();let curs0 = cursor.pop().unwrap(); - replacement in sanakirja-core/src/btree/del.rs at line 171
let (k, v, _) = P::current(txn, unsafe { curs0.page.as_page() }, &c1).unwrap();let (k, v, _) = P::current(txn, curs0.page.as_page(), &c1).unwrap(); - replacement in sanakirja-core/src/btree/del.rs at line 195
/// From a cursor at level `p = cursor.pointer()`, form the/// From a cursor at level `p = cursor.len()`, form the - replacement in sanakirja-core/src/btree/del.rs at line 211
let p = cursor.pointer();let rc_level = cursor.first_rc_level;let p = cursor.len();let rc_level = cursor.first_rc_len; - replacement in sanakirja-core/src/btree/del.rs at line 224
let other = txn.load_page(P::left_child(unsafe { curs.page.as_page() }, &curs.cursor))?;let other = txn.load_page(P::left_child(curs.page.as_page(), &curs.cursor))?; - replacement in sanakirja-core/src/btree/del.rs at line 249
let ((k, v, r), mod_is_left) = if let Some(x) =P::current(txn, unsafe { curs.page.as_page() }, &curs.cursor){// Not the last element of the page.(x, true)} else {// Last element of the page.let (k, v, _) = P::prev(txn, unsafe { curs.page.as_page() }, &mut curs.cursor).unwrap();let l = P::left_child(unsafe { curs.page.as_page() }, &curs.cursor);((k, v, l), false)};let ((k, v, r), mod_is_left) =if let Some(x) = P::current(txn, curs.page.as_page(), &curs.cursor) {// Not the last element of the page.(x, true)} else {// Last element of the page.let (k, v, _) = P::prev(txn, curs.page.as_page(), &mut curs.cursor).unwrap();let l = P::left_child(curs.page.as_page(), &curs.cursor);((k, v, l), false)}; - replacement in sanakirja-core/src/btree/del.rs at line 282
/// cursor.pointer()`./// cursor.len()`. - replacement in sanakirja-core/src/btree/del.rs at line 298
let mutable = cursor.pointer() < cursor.first_rc_level;let mutable = cursor.len() < cursor.first_rc_len; - replacement in sanakirja-core/src/btree/del.rs at line 300
let curs = cursor.current_mut();// Beware, a stack pop happens here, all subsequent references// to the pointer must be updated.let curs = cursor.pop().unwrap(); - replacement in sanakirja-core/src/btree/del.rs at line 317
// level `cursor.pointer() + 1`, and build the modification plan// level `cursor.len() + 1`, and build the modification plan - replacement in sanakirja-core/src/btree/del.rs at line 319
// `cursor.pointer()`).// `cursor.len()`). - replacement in sanakirja-core/src/btree/del.rs at line 359
// deleting at an internal node (i.e. if cursor.pointer ==// deleting at an internal node (i.e. if cursor.len == - replacement in sanakirja-core/src/btree/del.rs at line 361
if cursor.pointer() == p0 {if cursor.len() + 1 == p0 { - replacement in sanakirja-core/src/btree/del.rs at line 389
let split_key_is_k0 = if cursor.pointer() == p0 {let split_key_is_k0 = if cursor.len() + 1 == p0 { - replacement in sanakirja-core/src/btree/del.rs at line 409
assert!(cursor.pointer() < p0);assert!(cursor.len() + 1 < p0); - replacement in sanakirja-core/src/btree/del.rs at line 420
if cursor.pointer() + 1 >= cursor.first_rc_level && !split_key_is_k0 {if cursor.len() + 2 >= cursor.first_rc_len && !split_key_is_k0 { - replacement in sanakirja-core/src/btree/del.rs at line 428
// Free the page(s) at level `cursor.pointer() + 1` if it isn't// Free the page(s) at level `cursor.len() + 1` if it isn't - replacement in sanakirja-core/src/btree/del.rs at line 431[5.110]→[5.2311:2361](∅→∅),[5.6539]→[5.2311:2361](∅→∅),[5.37905]→[5.2311:2361](∅→∅),[5.2361]→[5.6540:6584](∅→∅)
if cursor.pointer() < cursor.first_rc_level {free[cursor.pointer() + 1] = freed;if cursor.len() + 1 < cursor.first_rc_len {free[cursor.len() + 1] = freed; - replacement in sanakirja-core/src/btree/del.rs at line 452
let mut left = P::left_child(unsafe { m.page.as_page() }, &c0);while let Some((k, v, r)) = P::next(txn, unsafe { m.page.as_page() }, &mut c0) {let mut left = P::left_child(m.page.as_page(), &c0);while let Some((k, v, r)) = P::next(txn, m.page.as_page(), &mut c0) { - replacement in sanakirja-core/src/btree/del.rs at line 478
if let Some((k, v, r)) = P::next(txn, unsafe { m.page.as_page() }, &mut c1) {if let Some((k, v, r)) = P::next(txn, m.page.as_page(), &mut c1) { - replacement in sanakirja-core/src/btree/del.rs at line 487
while let Some((k, v, r)) = P::next(txn, unsafe { m.page.as_page() }, &mut c1) {while let Some((k, v, r)) = P::next(txn, m.page.as_page(), &mut c1) { - replacement in sanakirja-core/src/btree/cursor.rs at line 20
// of a B tree below the root has at least 4 elements, the arity is at// least 5, except for the root. Since 5^23 is the smallest power of 5// larger than 2^52, the maximum depth is 24.pub(crate) const N_CURSORS: usize = 24;// of a B tree below the root has at least 2 elements (because each// page is at least half-full, and elements are at most 1/4th of a// page), the arity is at least 3, except for the root. Since 3^33 is// the smallest power of 3 larger than 2^52, the maximum depth is 33.pub(crate) const N_CURSORS: usize = 33; - replacement in sanakirja-core/src/btree/cursor.rs at line 32[5.2653]→[5.65137:65168](∅→∅),[5.24741]→[5.65137:65168](∅→∅),[5.65137]→[5.65137:65168](∅→∅),[5.65168]→[5.2654:2674](∅→∅)
pub first_rc_level: usize,pointer: usize,pub first_rc_len: usize,len: usize, - edit in sanakirja-core/src/btree/cursor.rs at line 38
// Looking forward to getting array initialisation stabilised :) - edit in sanakirja-core/src/btree/cursor.rs at line 40
core::mem::MaybeUninit::uninit(),core::mem::MaybeUninit::uninit(),core::mem::MaybeUninit::uninit(),core::mem::MaybeUninit::uninit(),core::mem::MaybeUninit::uninit(),core::mem::MaybeUninit::uninit(),core::mem::MaybeUninit::uninit(),core::mem::MaybeUninit::uninit(),core::mem::MaybeUninit::uninit(), - replacement in sanakirja-core/src/btree/cursor.rs at line 81
first_rc_level: N_CURSORS,pointer: 0,first_rc_len: N_CURSORS,len: 1, - replacement in sanakirja-core/src/btree/cursor.rs at line 87
self.pointer += 1;self.stack[self.pointer] = MaybeUninit::new(p)self.stack[self.len] = MaybeUninit::new(p);self.len += 1; - edit in sanakirja-core/src/btree/cursor.rs at line 90[5.65651]→[5.3567:3568](∅→∅),[5.3568]→[5.7420:7484](∅→∅),[5.1909]→[5.3625:3688](∅→∅),[5.7484]→[5.3625:3688](∅→∅),[5.3625]→[5.3625:3688](∅→∅),[5.3688]→[5.3688:3694](∅→∅)
pub(super) fn last(&mut self) -> &mut PageCursor<K, V, P> {unsafe { &mut *self.stack[self.pointer].as_mut_ptr() }} - replacement in sanakirja-core/src/btree/cursor.rs at line 94[5.1972]→[5.65821:65876](∅→∅),[5.7544]→[5.65821:65876](∅→∅),[5.25007]→[5.65821:65876](∅→∅),[5.65821]→[5.65821:65876](∅→∅)
unsafe { &*self.stack[self.pointer].as_ptr() }assert!(self.len > 0);unsafe { &*self.stack[self.len - 1].as_ptr() } - replacement in sanakirja-core/src/btree/cursor.rs at line 98[5.65883]→[5.7545:7589](∅→∅),[5.2020]→[5.3732:3753](∅→∅),[5.7589]→[5.3732:3753](∅→∅),[5.3732]→[5.3732:3753](∅→∅)
pub(super) fn pointer(&self) -> usize {self.pointerpub(super) fn len(&self) -> usize {self.len - replacement in sanakirja-core/src/btree/cursor.rs at line 102[5.3760]→[5.7590:7625](∅→∅),[5.2059]→[5.672:707](∅→∅),[5.7625]→[5.672:707](∅→∅),[5.3788]→[5.672:707](∅→∅),[5.707]→[5.3788:3814](∅→∅),[5.3788]→[5.3788:3814](∅→∅)
pub(super) fn pop(&mut self) {assert!(self.pointer > 0);self.pointer -= 1pub(super) fn pop(&mut self) -> Option<PageCursor<K, V, P>> {if self.len > 0 {self.len -= 1;let result = core::mem::replace(&mut self.stack[self.len], MaybeUninit::uninit());Some(unsafe { result.assume_init() })} else {None} - replacement in sanakirja-core/src/btree/cursor.rs at line 113[5.2134]→[5.33974:34037](∅→∅),[5.7697]→[5.33974:34037](∅→∅),[5.25072]→[5.33974:34037](∅→∅),[5.33974]→[5.33974:34037](∅→∅)
unsafe { &mut *self.stack[self.pointer].as_mut_ptr() }assert!(self.len > 0);unsafe { &mut *self.stack[self.len - 1].as_mut_ptr() } - replacement in sanakirja-core/src/btree/cursor.rs at line 126
self.pointer = 0;self.len = 1; - replacement in sanakirja-core/src/btree/cursor.rs at line 132[5.66237]→[5.2507:2548](∅→∅),[5.2548]→[5.757:810](∅→∅),[5.34163]→[5.2548:2648](∅→∅),[5.810]→[5.2548:2648](∅→∅),[5.1601]→[5.2548:2648](∅→∅),[5.2548]→[5.2548:2648](∅→∅),[5.2648]→[5.15041:15168](∅→∅),[5.15168]→[5.66450:66501](∅→∅),[5.1748]→[5.66450:66501](∅→∅),[5.66450]→[5.66450:66501](∅→∅)
while self.pointer < N_CURSORS {debug!("set cursor {:?}", self.pointer);let current = unsafe { &mut *self.stack.get_unchecked_mut(self.pointer).as_mut_ptr() };// let page = current.page;if self.first_rc_level >= N_CURSORS && txn.rc(current.page.offset)? >= 2 {self.first_rc_level = self.pointerwhile self.len < N_CURSORS {debug!("set cursor {:?}", self.len);let current = unsafe { &mut *self.stack.get_unchecked_mut(self.len - 1).as_mut_ptr() };if self.first_rc_len >= N_CURSORS && txn.rc(current.page.offset)? >= 2 {self.first_rc_len = self.len - replacement in sanakirja-core/src/btree/cursor.rs at line 141
if let Ok((kk, vv, _)) =P::set_cursor(txn, unsafe { current.page.as_page() }, cursor, k, v){if let Ok((kk, vv, _)) = P::set_cursor(txn, current.page.as_page(), cursor, k, v) { - replacement in sanakirja-core/src/btree/cursor.rs at line 146
last_matching_page = self.pointerlast_matching_page = self.len - replacement in sanakirja-core/src/btree/cursor.rs at line 153
let next_page = P::left_child(unsafe { current.page.as_page() }, cursor);let next_page = P::left_child(current.page.as_page(), cursor); - replacement in sanakirja-core/src/btree/cursor.rs at line 165
self.pointer = last_matching_page;self.len = last_matching_page; - replacement in sanakirja-core/src/btree/cursor.rs at line 177
assert_eq!(self.pointer, 0);let current = unsafe { &mut *self.stack[self.pointer].as_mut_ptr() };self.len = 1;let current = unsafe { &mut *self.stack[self.len - 1].as_mut_ptr() }; - replacement in sanakirja-core/src/btree/cursor.rs at line 181[5.67901]→[5.67901:67983](∅→∅),[5.67983]→[5.11493:11535](∅→∅),[5.11535]→[5.67983:68121](∅→∅),[5.67983]→[5.67983:68121](∅→∅)
let current = unsafe { &mut *self.stack[self.pointer].as_mut_ptr() };debug!("{:?}", current.page);if self.first_rc_level >= N_CURSORS && txn.rc(current.page.offset)? >= 2 {self.first_rc_level = self.pointerlet current = unsafe { &mut *self.stack[self.len - 1].as_mut_ptr() };if self.first_rc_len >= N_CURSORS && txn.rc(current.page.offset)? >= 2 {self.first_rc_len = self.len - replacement in sanakirja-core/src/btree/cursor.rs at line 185
debug!("cursor = {:?}", current.cursor);let (k, v, r) =P::current(txn, unsafe { current.page.as_page() }, &mut current.cursor).unwrap();let (k, v, r) = P::current(txn, current.page.as_page(), &mut current.cursor).unwrap(); - edit in sanakirja-core/src/btree/cursor.rs at line 187
debug!("k {:?} v {:?} r = {:?}", k, v, r); - replacement in sanakirja-core/src/btree/cursor.rs at line 214
debug!("next: {:?}", self.pointer);let current = unsafe { &mut *self.stack[self.pointer].as_mut_ptr() };debug!("next: {:?}", self.len);let current = unsafe { &mut *self.stack[self.len - 1].as_mut_ptr() }; - replacement in sanakirja-core/src/btree/cursor.rs at line 217
let left = P::right_child(unsafe { current.page.as_page() }, ¤t.cursor);let left = P::right_child(current.page.as_page(), ¤t.cursor); - replacement in sanakirja-core/src/btree/cursor.rs at line 227
} else if let Some((k, v, r)) =P::current(txn, unsafe { current.page.as_page() }, ¤t.cursor)} else if let Some((k, v, r)) = P::current(txn, current.page.as_page(), ¤t.cursor) - replacement in sanakirja-core/src/btree/cursor.rs at line 238
} else if self.pointer > 0 {self.pop();} else if self.len > 1 {self.len -= 1 - replacement in sanakirja-core/src/btree/cursor.rs at line 249
let current = unsafe { &mut *self.stack[self.pointer].as_mut_ptr() };let current = unsafe { &mut *self.stack[self.len - 1].as_mut_ptr() }; - replacement in sanakirja-core/src/btree/cursor.rs at line 252
self.pointer, current.page, current.cursorself.len, current.page, current.cursor - replacement in sanakirja-core/src/btree/cursor.rs at line 256
let left = P::left_child(unsafe { current.page.as_page() }, ¤t.cursor);let left = P::left_child(current.page.as_page(), ¤t.cursor); - replacement in sanakirja-core/src/btree/cursor.rs at line 266
} else if let Some((k, v, _)) =P::current(txn, unsafe { current.page.as_page() }, ¤t.cursor)} else if let Some((k, v, _)) = P::current(txn, current.page.as_page(), ¤t.cursor) - replacement in sanakirja-core/src/btree/cursor.rs at line 269
let l = P::left_child(unsafe { current.page.as_page() }, ¤t.cursor);let l = P::left_child(current.page.as_page(), ¤t.cursor); - replacement in sanakirja-core/src/btree/cursor.rs at line 280
} else if self.pointer > 0 {} else if self.len > 1 { - replacement in sanakirja-core/src/btree/cursor.rs at line 282
self.pop();let current = unsafe { &mut *self.stack[self.pointer].as_mut_ptr() };self.len -= 1;let current = unsafe { &mut *self.stack[self.len - 1].as_mut_ptr() }; - replacement in sanakirja/src/tests.rs at line 199
crate::debug::debug(&txn, &[&db], "debug", true);crate::debug::debug(&txn, &[&db, &db2], "debug", true); - edit in sanakirja/src/tests.rs at line 202
crate::debug::debug(&txn, &[&db, &db2], "debug1", true); - replacement in sanakirja/src/tests.rs at line 227
let n = 20 as u64;let n = 19 as u64; - edit in sanakirja/src/tests.rs at line 239
crate::debug::debug(&txn, &[&db, &db2], "debug0", true); - edit in sanakirja/src/tests.rs at line 248
crate::debug::debug(&txn, &[&db, &db2], "debug1", true); - edit in sanakirja/src/tests.rs at line 264
debug!("{:?}", *k); - replacement in sanakirja/src/tests.rs at line 349
let mut c = P::cursor_first(p.as_page());let mut c = P::cursor_first(&p); - replacement in sanakirja/src/tests.rs at line 699
let cursor = P::cursor_first(pp.as_page());let cursor = P::cursor_first(&pp); - replacement in sanakirja/src/debug.rs at line 28
print_page::<T, K, V, PP>(t,&mut h,&mut buf,&t.load_page(db.db).unwrap().as_page(),recurse,);print_page::<T, K, V, PP>(t, &mut h, &mut buf, &t.load_page(db.db).unwrap(), recurse); - replacement in sanakirja/src/debug.rs at line 42
p: &Page,p: &CowPage, - replacement in sanakirja/src/debug.rs at line 69
print_page::<T, K, V, P>(txn, pages, buf, &p.as_page(), print_children)print_page::<T, K, V, P>(txn, pages, buf, &p, print_children) - replacement in sanakirja/src/debug.rs at line 85
p: &Page,p: &CowPage, - replacement in sanakirja/src/debug.rs at line 89
let mut cursor = P::cursor_first(*p);let mut cursor = P::cursor_first(p); - replacement in sanakirja/src/debug.rs at line 91
let l = P::left_child(*p, &cursor);let l = P::left_child(p.as_page(), &cursor); - replacement in sanakirja/src/debug.rs at line 99
while let Some((key, val, r)) = P::next(txn, *p, &mut cursor) {while let Some((key, val, r)) = P::next(txn, p.as_page(), &mut cursor) { - edit in sanakirja/Cargo.toml at line 27
uuid = { version = "*", features = [ "v4" ] }