Double-inserts (rebalancing near an internal deletion)
[?]
Feb 2, 2021, 1:06 PM
DV4A2LR7Q5LAEGAQHLO34PZCHGJUHPAMRZFGT7GUFNKVQKPJNOYQCDependencies
- [2]
X3QVVQISMore debugging (del seems to work now) - [3]
EHJFNMB2Debugging - [4]
OP6SVMODResetting history - [5]
EAAYH6BQDebugging put - [6]
WS4ZQM4RDebugging, tests, etc. - [*]
FMN7X4J2Micro-improvements, now noticeably faster than std::collections::BTreeMap
Change contents
- replacement in sanakirja-core/src/lib.rs at line 11
type Ord: Ord;fn ord(&self, txn: &T) -> &Self::Ord;fn compare(&self, txn: &T, b: &Self) -> core::cmp::Ordering; - replacement in sanakirja-core/src/lib.rs at line 31
type Ord = Self;fn ord(&self, _: &T) -> &Self::Ord {selffn compare(&self, _: &T, b: &Self) -> core::cmp::Ordering {self.cmp(b) - edit in sanakirja-core/src/btree/put.rs at line 37
None, - edit in sanakirja-core/src/btree/put.rs at line 81[8.405][8.405]
None, - edit in sanakirja-core/src/btree/put.rs at line 97
None, - edit in sanakirja-core/src/btree/page.rs at line 2
use core::cmp::Ordering;use core::mem::MaybeUninit; - edit in sanakirja-core/src/btree/page.rs at line 5
use core::mem::MaybeUninit; - replacement in sanakirja-core/src/btree/page.rs at line 65
impl<T: AllocPage + core::fmt::Debug, K: Representable<T> + core::fmt::Debug, V: Representable<T> + core::fmt::Debug> super::BTreeMutPage<T, K, V>for Page<K, V>impl<T: AllocPage + core::fmt::Debug,K: Representable<T> + core::fmt::Debug,V: Representable<T> + core::fmt::Debug,> super::BTreeMutPage<T, K, V> for Page<K, V> - edit in sanakirja-core/src/btree/page.rs at line 99
if let Some((k, v)) = m.ins2 {occupied += crate::alloc_size(k, v) as usize;} - replacement in sanakirja-core/src/btree/page.rs at line 104
occupied += 2if m.ins2.is_some() {occupied += 4;} else {occupied += 2;} - edit in sanakirja-core/src/btree/page.rs at line 110
} else if m.ins2.is_some() {occupied += 16 - edit in sanakirja-core/src/btree/page.rs at line 126
k1v1: Option<(&'a K, &'a V)>, - replacement in sanakirja-core/src/btree/page.rs at line 131
put::<_, _, _, Leaf>(txn, page, mutable, c.cur, k0, v0, 0, 0)put::<_, _, _, Leaf>(txn, page, mutable, c.cur, k0, v0, k1v1, 0, 0) - replacement in sanakirja-core/src/btree/page.rs at line 133
put::<_, _, _, Internal>(txn, page, mutable, c.cur, k0, v0, l, r)put::<_, _, _, Internal>(txn, page, mutable, c.cur, k0, v0, k1v1, l, r) - edit in sanakirja-core/src/btree/page.rs at line 137
fn replace<'a>(txn: &mut T,page: CowPage,mutable: bool,c: &Self::Cursor,k0: &'a K,v0: &'a V,k1v1: Option<(&'a K, &'a V)>,l: u64,r: u64,) -> Result<Put<'a, K, V>, T::Error> {// We're never in a leaf if we're doing this.assert!(l > 0);let new = Self::del(txn, page, c, l)?;Self::put(txn, new.0, mutable, c, k0, v0, k1v1, l, r)} - replacement in sanakirja-core/src/btree/page.rs at line 163
debug!("update_left_child: {:?} {:?} {:?}", page, mutable, header(page.as_page()));debug!("update_left_child: {:?} {:?} {:?}",page,mutable,header(page.as_page())); - replacement in sanakirja-core/src/btree/page.rs at line 201
unsafe { if c.is_leaf {let n = hdr.n() as usize;if let Some(f) = fixed_size::<T, K, V>() {let al = K::ALIGN.max(V::ALIGN);let hdr_size = (HDR + al - 1) & !(al - 1);let off = c.cur * f;let kv_ptr = p.add(hdr_size + off);core::ptr::copy(kv_ptr.add(f), kv_ptr, f * (n - c.cur - 1));hdr.decr(f);} else {let ptr = p.add(HDR + c.cur * 2) as *mut u16;let kv_ptr = p.add((*ptr) as usize);let size = entry_size::<T, K, V>(kv_ptr);core::ptr::copy(ptr.offset(1), ptr, n - c.cur);hdr.decr(size);}} else {let ptr = p.add(HDR + c.cur * 8) as *mut u64;let off = (u64::from_le(*ptr) & 0xfff) as usize;let kv_ptr = p.add(off);let size = entry_size::<T, K, V>(kv_ptr);core::ptr::copy(ptr.offset(1), ptr, (&*hdr).n() as usize - c.cur);(&mut *hdr).decr(size);}};unsafe {if c.is_leaf {let n = hdr.n() as usize;if let Some(f) = fixed_size::<T, K, V>() {let al = K::ALIGN.max(V::ALIGN);let hdr_size = (HDR + al - 1) & !(al - 1);let off = c.cur * f;let kv_ptr = p.add(hdr_size + off);core::ptr::copy(kv_ptr.add(f), kv_ptr, f * (n - c.cur - 1));hdr.decr(f);} else {let ptr = p.add(HDR + c.cur * 2) as *mut u16;let kv_ptr = p.add((*ptr) as usize);let size = entry_size::<T, K, V>(kv_ptr);core::ptr::copy(ptr.offset(1), ptr, n - c.cur);hdr.decr(size);}} else {let ptr = p.add(HDR + c.cur * 8) as *mut u64;let off = (u64::from_le(*ptr) & 0xfff) as usize;let kv_ptr = p.add(off);let size = entry_size::<T, K, V>(kv_ptr);core::ptr::copy(ptr.offset(1), ptr, (&*hdr).n() as usize - c.cur);(&mut *hdr).decr(size);}}; - replacement in sanakirja-core/src/btree/page.rs at line 277
let left_size = Self::size(&m.modified);let mod_size = Self::size(&m.modified); - replacement in sanakirja-core/src/btree/page.rs at line 282
let size = left_size + mid_size + occupied - hdr_size;debug!("size = {:?} {:?} {:?} {:?} {:?}", left_size, mid_size, occupied, hdr_size, size);let size = mod_size + mid_size + occupied - hdr_size;debug!("size = {:?} {:?} {:?} {:?} {:?}",mod_size, mid_size, occupied, hdr_size, size); - replacement in sanakirja-core/src/btree/page.rs at line 303
let b1 = if Self::is_dirty(m.other.as_page()) { 1 } else { 0 };let b1 = if Self::is_dirty(m.other.as_page()) {1} else {0}; - replacement in sanakirja-core/src/btree/page.rs at line 316[3.5920]→[3.17451:17574](∅→∅),[3.17451]→[3.17451:17574](∅→∅),[3.17574]→[2.118:187](∅→∅),[2.187]→[3.5993:6024](∅→∅),[3.5993]→[3.5993:6024](∅→∅)
// If we can't rebalance, return.if left_size >= PAGE_SIZE / 2 || occupied - first_size < PAGE_SIZE / 2 {return Ok(Op::Put(if let Some((k, v)) = m.modified.ins {Self::replace(// If we can't rebalance, modify and return.if mod_size >= PAGE_SIZE / 2 || occupied - first_size < PAGE_SIZE / 2 {if let Some((k, v)) = m.modified.ins {return Ok(Op::Put(Self::replace( - replacement in sanakirja-core/src/btree/page.rs at line 324
&*k,&*v,k,v,m.modified.ins2, - replacement in sanakirja-core/src/btree/page.rs at line 329
)?)?)); - replacement in sanakirja-core/src/btree/page.rs at line 331
Put::Ok(Ok {return Ok(Op::Put(Put::Ok(Ok { - replacement in sanakirja-core/src/btree/page.rs at line 334
})}));})));} - replacement in sanakirja-core/src/btree/page.rs at line 381
unsafe fn unchecked_current<'a>(page: crate::Page<'a>, c: &Self::Cursor) -> (&'a K, &'a V, u64) {unsafe fn unchecked_current<'a>(page: crate::Page<'a>,c: &Self::Cursor,) -> (&'a K, &'a V, u64) { - replacement in sanakirja-core/src/btree/page.rs at line 411
(u64::from_le(*(page.data.as_ptr().add(HDR + c.cur * 8) as *const u64)) & 0xfff) as usize(u64::from_le(*(page.data.as_ptr().add(HDR + c.cur * 8) as *const u64)) & 0xfff)as usize - replacement in sanakirja-core/src/btree/page.rs at line 421[3.20957]→[3.20957:21038](∅→∅),[3.21038]→[3.8087:8228](∅→∅),[3.8228]→[3.21132:21175](∅→∅),[3.21132]→[3.21132:21175](∅→∅)
2 + entry_size::<T, K, V>(page.data.as_ptr().add(u16::from_le(*(page.data.as_ptr().add(HDR) as *const u16).add(c.cur))as usize),2 + entry_size::<T, K, V>(page.data.as_ptr().add(u16::from_le(*(page.data.as_ptr().add(HDR) as *const u16).add(c.cur), - edit in sanakirja-core/src/btree/page.rs at line 424
as usize)) - replacement in sanakirja-core/src/btree/page.rs at line 428
(u64::from_le(*(page.data.as_ptr().add(HDR) as *const u64).add(c.cur)) & 0xfff) as usize,(u64::from_le(*(page.data.as_ptr().add(HDR) as *const u64).add(c.cur)) & 0xfff)as usize, - replacement in sanakirja-core/src/btree/page.rs at line 485
let off = u16::from_le(*(page.data.as_ptr().add(HDR + n * 2) as *const u16));let off =u16::from_le(*(page.data.as_ptr().add(HDR + n * 2) as *const u16)); - replacement in sanakirja-core/src/btree/page.rs at line 491
let off = u64::from_le(*(page.data.as_ptr().add(HDR + n * 8) as *const u64));let off =u64::from_le(*(page.data.as_ptr().add(HDR + n * 8) as *const u64)); - edit in sanakirja-core/src/btree/page.rs at line 528
- replacement in sanakirja-core/src/btree/page.rs at line 547
s.binary_search_by(|tup| {(tup.k.ord(txn), tup.v.ord(txn)).cmp(&(k0.ord(txn), v0.ord(txn)))s.binary_search_by(|tup| match tup.k.compare(txn, &k0) {Ordering::Equal => tup.v.compare(txn, &v0),c => c, - replacement in sanakirja-core/src/btree/page.rs at line 552
s.binary_search_by(|tup| {(tup.k.ord(txn)).cmp(k0.ord(txn))})s.binary_search_by(|tup| tup.k.compare(txn, k0)) - replacement in sanakirja-core/src/btree/page.rs at line 563
((&*k).ord(txn), (&*v).ord(txn)).cmp(&(k0.ord(txn), v0.ord(txn)))match (&*k).compare(txn, k0) {Ordering::Equal => (&*v).compare(txn, v0),cmp => cmp,} - replacement in sanakirja-core/src/btree/page.rs at line 572
((&*k).ord(txn)).cmp(k0.ord(txn))(&*k).compare(txn, k0) - replacement in sanakirja-core/src/btree/page.rs at line 577
let s =core::slice::from_raw_parts(page.data.as_ptr().add(HDR) as *const u64, hdr.n() as usize);let s = core::slice::from_raw_parts(page.data.as_ptr().add(HDR) as *const u64,hdr.n() as usize,); - replacement in sanakirja-core/src/btree/page.rs at line 585
((&*k).ord(txn), (&*v).ord(txn)).cmp(&(k0.ord(txn), v0.ord(txn)))match (&*k).compare(txn, k0) {Ordering::Equal => (&*v).compare(txn, v0),cmp => cmp,} - replacement in sanakirja-core/src/btree/page.rs at line 594
((&*k).ord(txn)).cmp(k0.ord(txn))(&*k).compare(txn, k0) - edit in sanakirja-core/src/btree/page.rs at line 600
- replacement in sanakirja-core/src/btree/page.rs at line 608
unsafe {&*(page.data.as_ptr() as *const Header)}unsafe { &*(page.data.as_ptr() as *const Header) } - replacement in sanakirja-core/src/btree/page.rs at line 612
unsafe {&mut *(page.0.data as *mut Header)}unsafe { &mut *(page.0.data as *mut Header) } - replacement in sanakirja-core/src/btree/page.rs at line 616[3.26496]→[3.12273:12336](∅→∅),[3.12336]→[3.26566:26624](∅→∅),[3.26566]→[3.26566:26624](∅→∅),[3.26624]→[3.12337:12402](∅→∅),[3.12402]→[3.26696:26754](∅→∅),[3.26696]→[3.26696:26754](∅→∅)
fn can_alloc<T, K: Representable<T>, V: Representable<T>>(hdr: &Header,size: usize,) -> bool;fn can_compact<T, K: Representable<T>, V: Representable<T>>(hdr: &Header,size: usize,) -> bool;fn extra_size<T, K: Representable<T>, V: Representable<T>>() -> usize;fn can_alloc<T, K: Representable<T>, V: Representable<T>>(hdr: &Header, size: usize) -> bool;fn can_compact<T, K: Representable<T>, V: Representable<T>>(hdr: &Header, size: usize) -> bool; - replacement in sanakirja-core/src/btree/page.rs at line 622
fn truncate_left<T, K: Representable<T>, V: Representable<T>>(page: &mut MutPage, n: usize) -> Option<(*const K, *const V)>;fn truncate_left<T, K: Representable<T>, V: Representable<T>>(page: &mut MutPage,n: usize,) -> Option<(*const K, *const V)>; - replacement in sanakirja-core/src/btree/page.rs at line 686
fn can_alloc<T, K: Representable<T>, V: Representable<T>>(hdr: &Header,size: usize,) -> bool {fn extra_size<T, K: Representable<T>, V: Representable<T>>() -> usize {if fixed_size::<T, K, V>().is_some() {0} else {2}}fn can_alloc<T, K: Representable<T>, V: Representable<T>>(hdr: &Header, size: usize) -> bool { - replacement in sanakirja-core/src/btree/page.rs at line 697
debug!("Leaf::can_alloc: {:?} {:?} {:?}", header_size, size, hdr.data);debug!("Leaf::can_alloc: {:?} {:?} {:?}",header_size, size, hdr.data); - replacement in sanakirja-core/src/btree/page.rs at line 706
fn can_compact<T, K: Representable<T>, V: Representable<T>>(hdr: &Header,size: usize,) -> bool {fn can_compact<T, K: Representable<T>, V: Representable<T>>(hdr: &Header, size: usize) -> bool { - replacement in sanakirja-core/src/btree/page.rs at line 716
fn truncate_left<T, K: Representable<T>, V: Representable<T>>(page: &mut MutPage, n: usize) -> Option<(*const K, *const V)> {fn truncate_left<T, K: Representable<T>, V: Representable<T>>(page: &mut MutPage,n: usize,) -> Option<(*const K, *const V)> { - edit in sanakirja-core/src/btree/page.rs at line 727
- replacement in sanakirja-core/src/btree/page.rs at line 728
let mut swap: core::mem::MaybeUninit<Tuple<K, V>> = core::mem::MaybeUninit::uninit();let mut swap: core::mem::MaybeUninit<Tuple<K, V>> =core::mem::MaybeUninit::uninit(); - replacement in sanakirja-core/src/btree/page.rs at line 731
page.0.data.add(hdr_size + (n-1) * f),page.0.data.add(hdr_size + (n - 1) * f), - replacement in sanakirja-core/src/btree/page.rs at line 751
Some(read::<T, K, V>(page.0.data.add(hdr_size + (hdr_n as usize - n) * f)))Some(read::<T, K, V>(page.0.data.add(hdr_size + (hdr_n as usize - n) * f),)) - replacement in sanakirja-core/src/btree/page.rs at line 765
core::slice::from_raw_parts(page.0.data.add(HDR) as *const u16,n as usize,)core::slice::from_raw_parts(page.0.data.add(HDR) as *const u16, n as usize) - replacement in sanakirja-core/src/btree/page.rs at line 767
let deleted_size: u64 = deleted_offsets.iter().map(|&off| {2 + unsafe { entry_size::<T, K, V>(page.0.data.add(off as usize)) } as u64}).sum();let deleted_size: u64 = deleted_offsets.iter().map(|&off| {2 + unsafe { entry_size::<T, K, V>(page.0.data.add(off as usize)) } as u64}).sum(); - replacement in sanakirja-core/src/btree/page.rs at line 812
(hdr.n(), Self::alloc(&mut *hdr, 2+size, K::ALIGN))(hdr.n(),Self::alloc(&mut *hdr, 2 + size, K::ALIGN.max(V::ALIGN)),) - replacement in sanakirja-core/src/btree/page.rs at line 855
) -> (&'a K, &'a V, u64) {) -> (&'a K, &'a V, u64) { - replacement in sanakirja-core/src/btree/page.rs at line 858
(& *k, & *v, 0)(&*k, &*v, 0) - replacement in sanakirja-core/src/btree/page.rs at line 864
fn can_alloc<T, K: Representable<T>, V: Representable<T>>(hdr: &Header,size: usize,) -> bool {fn extra_size<T, K: Representable<T>, V: Representable<T>>() -> usize {8}fn can_alloc<T, K: Representable<T>, V: Representable<T>>(hdr: &Header, size: usize) -> bool { - replacement in sanakirja-core/src/btree/page.rs at line 871
fn can_compact<T, K: Representable<T>, V: Representable<T>>(hdr: &Header,size: usize,) -> bool {fn can_compact<T, K: Representable<T>, V: Representable<T>>(hdr: &Header, size: usize) -> bool { - replacement in sanakirja-core/src/btree/page.rs at line 874
fn truncate_left<T, K: Representable<T>, V: Representable<T>>(page: &mut MutPage, n: usize) -> Option<(*const K, *const V)> {fn truncate_left<T, K: Representable<T>, V: Representable<T>>(page: &mut MutPage,n: usize,) -> Option<(*const K, *const V)> { - replacement in sanakirja-core/src/btree/page.rs at line 897
offsets.iter().map(|&off| {8 + unsafe { entry_size::<T, K, V>(page.0.data.add(off as usize)) } as u64}).sum()offsets.iter().map(|&off| {8 + unsafe { entry_size::<T, K, V>(page.0.data.add(off as usize)) } as u64}).sum() - replacement in sanakirja-core/src/btree/page.rs at line 927
(hdr.n(), Self::alloc(&mut *hdr, size, K::ALIGN.max(V::ALIGN)))(hdr.n(),Self::alloc(&mut *hdr, size, K::ALIGN.max(V::ALIGN)),) - replacement in sanakirja-core/src/btree/page.rs at line 971
) -> (&'a K, &'a V, u64) {) -> (&'a K, &'a V, u64) { - replacement in sanakirja-core/src/btree/page.rs at line 974
(& *k, & *v, r)(&*k, &*v, r) - replacement in sanakirja-core/src/btree/page.rs at line 979
unsafe fn modify<T: LoadPage + core::fmt::Debug, K: Representable<T> + core::fmt::Debug, V: Representable<T> + core::fmt::Debug, L: Alloc>(unsafe fn modify<T: LoadPage + core::fmt::Debug,K: Representable<T> + core::fmt::Debug,V: Representable<T> + core::fmt::Debug,L: Alloc,>( - replacement in sanakirja-core/src/btree/page.rs at line 996
alloc::<_, _, _, L>(new, &*k, &*v, m.l, m.r, n);if let Some((k2, v2)) = m.ins2 {alloc::<_, _, _, L>(new, k, v, 0, 0, n);alloc::<_, _, _, L>(new, k2, v2, m.l, m.r, n);} else {alloc::<_, _, _, L>(new, k, v, m.l, m.r, n);} - replacement in sanakirja-core/src/btree/page.rs at line 1016
unsafe fn merge<T: LoadPage + core::fmt::Debug, K: Representable<T> + core::fmt::Debug, V: Representable<T> + core::fmt::Debug, L: Alloc>(unsafe fn merge<T: LoadPage + core::fmt::Debug,K: Representable<T> + core::fmt::Debug,V: Representable<T> + core::fmt::Debug,L: Alloc,>( - replacement in sanakirja-core/src/btree/page.rs at line 1046
fn rebalance_left<'a, T: AllocPage + core::fmt::Debug, K: Representable<T> + core::fmt::Debug, V: Representable<T> + core::fmt::Debug, L: Alloc>(fn rebalance_left<'a,T: AllocPage + core::fmt::Debug,K: Representable<T> + core::fmt::Debug,V: Representable<T> + core::fmt::Debug,L: Alloc,>( - replacement in sanakirja-core/src/btree/page.rs at line 1064
let b = if header(m.modified.page.as_page()).is_dirty() { 1 } else { 0 };let b = if header(m.modified.page.as_page()).is_dirty() {1} else {0}; - replacement in sanakirja-core/src/btree/page.rs at line 1077
&*k,&*v,k,v,m.modified.ins2, - edit in sanakirja-core/src/btree/page.rs at line 1092
- replacement in sanakirja-core/src/btree/page.rs at line 1111
11, - replacement in sanakirja-core/src/btree/page.rs at line 1116
n-1n - 1, - replacement in sanakirja-core/src/btree/page.rs at line 1118
let last = data.add(hdr_size + f * (n-1)) as *mut Tuple<K, V>;core::ptr::copy_nonoverlapping(t.as_ptr(),last,1);let last = data.add(hdr_size + f * (n - 1)) as *mut Tuple<K, V>;core::ptr::copy_nonoverlapping(t.as_ptr(), last, 1); - replacement in sanakirja-core/src/btree/page.rs at line 1125
(<Page<K, V>>::del(txn, m.other, &rc, r)?,core::mem::transmute(k),core::mem::transmute(v))}(<Page<K, V>>::del(txn, m.other, &rc, r)?,core::mem::transmute(k),core::mem::transmute(v),)}, - replacement in sanakirja-core/src/btree/page.rs at line 1146
fn rebalance_right<'a, T: AllocPage + core::fmt::Debug, K: Representable<T> + core::fmt::Debug, V: Representable<T> + core::fmt::Debug, L: Alloc>(fn rebalance_right<'a,T: AllocPage + core::fmt::Debug,K: Representable<T> + core::fmt::Debug,V: Representable<T> + core::fmt::Debug,L: Alloc,>( - edit in sanakirja-core/src/btree/page.rs at line 1164
- replacement in sanakirja-core/src/btree/page.rs at line 1166
let b = if header(m.modified.page.as_page()).is_dirty() { 1 } else { 0 };let b = if header(m.modified.page.as_page()).is_dirty() {1} else {0}; - replacement in sanakirja-core/src/btree/page.rs at line 1179
&*k,&*v,k,v,m.modified.ins2, - replacement in sanakirja-core/src/btree/page.rs at line 1192
if let Put::Ok(Ok { page, .. }) = <Page<K, V>>::put(txn,new_right.0,true,&rc,m.mid.0,m.mid.1,r0,rl,)? {if let Put::Ok(Ok { page, .. }) =<Page<K, V>>::put(txn, new_right.0, true, &rc, m.mid.0, m.mid.1, None, r0, rl)?{ - edit in sanakirja-core/src/btree/page.rs at line 1214
- replacement in sanakirja-core/src/btree/page.rs at line 1263
let off_new = L::alloc(hdr, size, K::ALIGN);let off_new = L::alloc(hdr, size, K::ALIGN.max(V::ALIGN)); - replacement in sanakirja-core/src/btree/page.rs at line 1314
fn put<'a, T: AllocPage + core::fmt::Debug, K: Representable<T> + core::fmt::Debug, V: Representable<T> + core::fmt::Debug, L: Alloc>(fn put<'a,T: AllocPage + core::fmt::Debug,K: Representable<T> + core::fmt::Debug,V: Representable<T> + core::fmt::Debug,L: Alloc,>( - edit in sanakirja-core/src/btree/page.rs at line 1327
k1v1: Option<(&'a K, &'a V)>, - replacement in sanakirja-core/src/btree/page.rs at line 1331
let size = alloc_size(k0, v0);let size = alloc_size(k0, v0)+ if let Some((k1, v1)) = k1v1 {alloc_size(k1, v1)} else {0}; - replacement in sanakirja-core/src/btree/page.rs at line 1344
alloc::<_, _, _, L>(&mut page, k0, v0, l, r, &mut n);if let Some((k1, v1)) = k1v1 {alloc::<_, _, _, L>(&mut page, k0, v0, 0, 0, &mut n);alloc::<_, _, _, L>(&mut page, k1, v1, l, r, &mut n);} else {alloc::<_, _, _, L>(&mut page, k0, v0, l, r, &mut n);} - replacement in sanakirja-core/src/btree/page.rs at line 1360
alloc::<T, K, V, L>(&mut new, k0, v0, l, r, &mut n);if let Some((k1, v1)) = k1v1 {alloc::<_, _, _, L>(&mut new, k0, v0, 0, 0, &mut n);alloc::<_, _, _, L>(&mut new, k1, v1, l, r, &mut n);} else {alloc::<_, _, _, L>(&mut new, k0, v0, l, r, &mut n);} - replacement in sanakirja-core/src/btree/page.rs at line 1378
return split_unsized::<_, _, _, L>(txn, page.as_page(), mutable, u, k0, v0, l, r);return split_unsized::<_, _, _, L>(txn, page.as_page(), u, k0, v0, k1v1, l, r); - replacement in sanakirja-core/src/btree/page.rs at line 1383
fn split<'a, T: AllocPage + core::fmt::Debug, K: Representable<T> + core::fmt::Debug, V: Representable<T> + core::fmt::Debug, L: Alloc>(fn split<'a,T: AllocPage + core::fmt::Debug,K: Representable<T> + core::fmt::Debug,V: Representable<T> + core::fmt::Debug,L: Alloc,>( - replacement in sanakirja-core/src/btree/page.rs at line 1507
fn split_unsized<'a, T: AllocPage, K: Representable<T>, V: Representable<T>, L: Alloc>(_txn: &mut T,_page: crate::Page,_mutable: bool,_u: usize,_k0: &'a K,_v0: &'a V,_l: u64,_r: u64,fn split_unsized<'a,T: AllocPage+ core::fmt::Debug,K: Representable<T> + core::fmt::Debug,V: Representable<T> + core::fmt::Debug,L: Alloc,>(txn: &mut T,page: crate::Page,u: usize,k0: &'a K,v0: &'a V,k1v1: Option<(&'a K, &'a V)>,l0: u64,r0: u64, - replacement in sanakirja-core/src/btree/page.rs at line 1523
unimplemented!()let hdr = header(page);let n0 = hdr.n();let mut left = txn.alloc_page()?;<Page<K, V> as BTreeMutPage<T, K, V>>::init(&mut left);let mut right = txn.alloc_page()?;<Page<K, V> as BTreeMutPage<T, K, V>>::init(&mut left);let left_child = header(page).left_page() & !0xfff;L::set_right_child(&mut left, -1, left_child);let mut split = core::ptr::null();let mut current_page = &mut left;let mut n = 0;let s = unsafe {core::slice::from_raw_parts(page.data.as_ptr().add(HDR) as *const LeafOffset,n0 as usize,)};let mut total = HDR;let mut is_left = true;for off in s.iter() {let (r, off): (u64, u16) = (*off).into();unsafe {let ptr = page.data.as_ptr().add(off as usize);let size = entry_size::<T, K, V>(ptr) + L::extra_size::<T, K, V>();total += size;if is_left && total >= PAGE_SIZE / 2 {is_left = false;split = ptr as *const Tuple<K, V>;L::set_right_child(&mut right, -1, r);current_page = &mut right;} else {let off_new = L::alloc(header_mut(current_page), size, K::ALIGN.max(V::ALIGN));core::ptr::copy_nonoverlapping(ptr, current_page.0.data.offset(off_new as isize), size);L::set_offset(current_page, n, r, off_new);}}n += 1;if n == u as isize {if let Some((k1, v1)) = k1v1 {alloc::<T, K, V, L>(current_page, k0, v0, 0, l0, &mut n);total += alloc_size(k0, v0) + L::extra_size::<T, K, V>();alloc::<T, K, V, L>(current_page, k1, v1, 0, r0, &mut n);total += alloc_size(k1, v1) + L::extra_size::<T, K, V>();n += 2;} else {alloc::<T, K, V, L>(current_page, k0, v0, l0, r0, &mut n);total += alloc_size(k0, v0) + L::extra_size::<T, K, V>();n += 1;}}}assert!(!split.is_null());let split = unsafe { &*split };Ok(Put::Split {split_key: &split.k,split_value: &split.v,left,right,freed: page.offset,}) - edit in sanakirja-core/src/btree/mod.rs at line 111
k1v1: Option<(&'a K, &'a V)>, - edit in sanakirja-core/src/btree/mod.rs at line 133
k1v1: Option<(&'a K, &'a V)>, - replacement in sanakirja-core/src/btree/mod.rs at line 136
) -> Result<Put<'a, K, V>, T::Error> {// TODO: optimise this for page::Page<K, V>, since this moves// all the offsets twice in this case.let new = Self::del(txn, page, c, l)?;Self::put(txn, new.0, mutable, c, k0, v0, l, r)}) -> Result<Put<'a, K, V>, T::Error>; - replacement in sanakirja-core/src/btree/mod.rs at line 149
Self::replace(txn, m.page, m.mutable, &m.c1, &*k, &*v, m.l, m.r)Self::replace(txn, m.page, m.mutable, &m.c1, k, v, m.ins2, m.l, m.r) - replacement in sanakirja-core/src/btree/mod.rs at line 151
Self::put(txn, m.page, m.mutable, &m.c1, &*k, &*v, m.l, m.r)Self::put(txn, m.page, m.mutable, &m.c1, k, v, m.ins2, m.l, m.r) - replacement in sanakirja-core/src/btree/mod.rs at line 207
// Replace the right child of c0's last element with `l`.// If > 0, replace the right child of c0's last element with `l`. - replacement in sanakirja-core/src/btree/mod.rs at line 209
// Replace the left child of c1's last element with `r`.// If > 0, replace the left child of c1's last element with `r`. - edit in sanakirja-core/src/btree/mod.rs at line 213
pub ins2: Option<(&'a K, &'a V)>, - edit in sanakirja-core/src/btree/del.rs at line 68
ins2: None, - edit in sanakirja-core/src/btree/del.rs at line 139
// If we're deleting at an internal node, the// replacement has already been included in the merged// page. - edit in sanakirja-core/src/btree/del.rs at line 149
ins2: None, - edit in sanakirja-core/src/btree/del.rs at line 163
// If we're deleting at an internal node, the// replacement is already in pages `l` or `r`. - edit in sanakirja-core/src/btree/del.rs at line 172
ins2: None, - edit in sanakirja-core/src/btree/del.rs at line 186
// Here, no merge, split or rebalance has happened. If// we're deleting at an internal node (i.e. if// cursor.pointer == p0), we need to mark the// replacement here. - edit in sanakirja-core/src/btree/del.rs at line 191
let l = P::left_child(page.0.as_page(), &c1); - replacement in sanakirja-core/src/btree/del.rs at line 193
(l, page.0.offset, Some((k, v)), true)(0, page.0.offset, Some((k, v)), true) - edit in sanakirja-core/src/btree/del.rs at line 206
ins2: None, - replacement in sanakirja-core/src/btree/del.rs at line 226
// Here, if we are at cursor.pointer == p0, the// replacement has been either inserted into one of// {left, right}, or is the split key/value// itself. Therefore, we just have to delete the// key/value selected for deletion in page p0 (the// current page).let (ins, ins2, skip_first) = if cursor.pointer == p0 {let k = unsafe { &*k0.as_ptr() };let v = unsafe { &*v0.as_ptr() };(Some((k, v)), Some((split_key, split_value)), true)} else {(Some((split_key, split_value)), None, false)}; - replacement in sanakirja-core/src/btree/del.rs at line 239
ins: Some((split_key, split_value)),ins,ins2, - replacement in sanakirja-core/src/btree/del.rs at line 242
skip_first: cursor.pointer == p0,skip_first, - edit in sanakirja-core/src/btree/del.rs at line 294
None,