(&mut self, idx: u32, sort_key: Vec<u8>, primary_key: Vec<u8>)
| 266 | } |
| 267 | |
| 268 | fn avl_insert(&mut self, idx: u32, sort_key: Vec<u8>, primary_key: Vec<u8>) -> u32 { |
| 269 | if idx == NULL { |
| 270 | return self.alloc_node(sort_key, primary_key); |
| 271 | } |
| 272 | |
| 273 | let n = &self.nodes[idx as usize]; |
| 274 | let cmp = Self::cmp_keys(&sort_key, &primary_key, &n.sort_key, &n.primary_key); |
| 275 | |
| 276 | match cmp { |
| 277 | std::cmp::Ordering::Less => { |
| 278 | let left = self.nodes[idx as usize].left; |
| 279 | let new_left = self.avl_insert(left, sort_key, primary_key); |
| 280 | self.nodes[idx as usize].left = new_left; |
| 281 | } |
| 282 | std::cmp::Ordering::Greater => { |
| 283 | let right = self.nodes[idx as usize].right; |
| 284 | let new_right = self.avl_insert(right, sort_key, primary_key); |
| 285 | self.nodes[idx as usize].right = new_right; |
| 286 | } |
| 287 | std::cmp::Ordering::Equal => { |
| 288 | // Exact duplicate (same sort_key + primary_key) — shouldn't happen |
| 289 | // since we check key_to_sort before inserting. No-op. |
| 290 | return idx; |
| 291 | } |
| 292 | } |
| 293 | |
| 294 | self.rebalance(idx) |
| 295 | } |
| 296 | |
| 297 | fn avl_remove(&mut self, idx: u32, sort_key: &[u8], primary_key: &[u8]) -> u32 { |
| 298 | if idx == NULL { |
no test coverage detected