1mod cursor;
2
3use arrayvec::ArrayVec;
4pub use cursor::Cursor;
5pub use cursor::FilterCursor;
6use std::{fmt, iter::FromIterator, ops::AddAssign, sync::Arc};
7
8#[cfg(test)]
9const TREE_BASE: usize = 2;
10#[cfg(not(test))]
11const TREE_BASE: usize = 6;
12
13pub trait Item: Clone + fmt::Debug {
14 type Summary: for<'a> AddAssign<&'a Self::Summary> + Default + Clone + fmt::Debug;
15
16 fn summary(&self) -> Self::Summary;
17}
18
19pub trait KeyedItem: Item {
20 type Key: for<'a> Dimension<'a, Self::Summary> + Ord;
21
22 fn key(&self) -> Self::Key;
23}
24
25pub trait Dimension<'a, Summary: Default>: 'a + Clone + fmt::Debug + Default {
26 fn add_summary(&mut self, summary: &'a Summary);
27}
28
29impl<'a, T: Default> Dimension<'a, T> for () {
30 fn add_summary(&mut self, _: &'a T) {}
31}
32
33#[derive(Copy, Clone, Eq, PartialEq)]
34pub enum SeekBias {
35 Left,
36 Right,
37}
38
39#[derive(Debug, Clone)]
40pub struct SumTree<T: Item>(Arc<Node<T>>);
41
42impl<T: Item> SumTree<T> {
43 pub fn new() -> Self {
44 SumTree(Arc::new(Node::Leaf {
45 summary: T::Summary::default(),
46 items: ArrayVec::new(),
47 item_summaries: ArrayVec::new(),
48 }))
49 }
50
51 pub fn from_item(item: T) -> Self {
52 let mut tree = Self::new();
53 tree.push(item);
54 tree
55 }
56
57 #[allow(unused)]
58 pub fn items(&self) -> Vec<T> {
59 let mut cursor = self.cursor::<(), ()>();
60 cursor.descend_to_first_item(self, |_| true);
61 cursor.cloned().collect()
62 }
63
64 pub fn cursor<'a, S, U>(&'a self) -> Cursor<T, S, U>
65 where
66 S: Dimension<'a, T::Summary>,
67 U: Dimension<'a, T::Summary>,
68 {
69 Cursor::new(self)
70 }
71
72 pub fn filter<'a, F, U>(&'a self, filter_node: F) -> FilterCursor<F, T, U>
73 where
74 F: Fn(&T::Summary) -> bool,
75 U: Dimension<'a, T::Summary>,
76 {
77 FilterCursor::new(self, filter_node)
78 }
79
80 #[allow(dead_code)]
81 pub fn first(&self) -> Option<&T> {
82 self.leftmost_leaf().0.items().first()
83 }
84
85 pub fn last(&self) -> Option<&T> {
86 self.rightmost_leaf().0.items().last()
87 }
88
89 pub fn extent<'a, D: Dimension<'a, T::Summary>>(&'a self) -> D {
90 let mut extent = D::default();
91 match self.0.as_ref() {
92 Node::Internal { summary, .. } | Node::Leaf { summary, .. } => {
93 extent.add_summary(summary)
94 }
95 }
96 extent
97 }
98
99 pub fn summary(&self) -> T::Summary {
100 match self.0.as_ref() {
101 Node::Internal { summary, .. } => summary.clone(),
102 Node::Leaf { summary, .. } => summary.clone(),
103 }
104 }
105
106 pub fn is_empty(&self) -> bool {
107 match self.0.as_ref() {
108 Node::Internal { .. } => false,
109 Node::Leaf { items, .. } => items.is_empty(),
110 }
111 }
112
113 pub fn extend<I>(&mut self, iter: I)
114 where
115 I: IntoIterator<Item = T>,
116 {
117 let mut leaf: Option<Node<T>> = None;
118
119 for item in iter {
120 if leaf.is_some() && leaf.as_ref().unwrap().items().len() == 2 * TREE_BASE {
121 self.push_tree(SumTree(Arc::new(leaf.take().unwrap())));
122 }
123
124 if leaf.is_none() {
125 leaf = Some(Node::Leaf::<T> {
126 summary: T::Summary::default(),
127 items: ArrayVec::new(),
128 item_summaries: ArrayVec::new(),
129 });
130 }
131
132 if let Some(Node::Leaf {
133 summary,
134 items,
135 item_summaries,
136 }) = leaf.as_mut()
137 {
138 let item_summary = item.summary();
139 *summary += &item_summary;
140 items.push(item);
141 item_summaries.push(item_summary);
142 } else {
143 unreachable!()
144 }
145 }
146
147 if leaf.is_some() {
148 self.push_tree(SumTree(Arc::new(leaf.take().unwrap())));
149 }
150 }
151
152 pub fn push(&mut self, item: T) {
153 let summary = item.summary();
154 self.push_tree(SumTree::from_child_trees(vec![SumTree(Arc::new(
155 Node::Leaf {
156 summary: summary.clone(),
157 items: ArrayVec::from_iter(Some(item)),
158 item_summaries: ArrayVec::from_iter(Some(summary)),
159 },
160 ))]))
161 }
162
163 pub fn push_tree(&mut self, other: Self) {
164 let other_node = other.0.clone();
165 if !other_node.is_leaf() || other_node.items().len() > 0 {
166 if self.0.height() < other_node.height() {
167 for tree in other_node.child_trees() {
168 self.push_tree(tree.clone());
169 }
170 } else if let Some(split_tree) = self.push_tree_recursive(other) {
171 *self = Self::from_child_trees(vec![self.clone(), split_tree]);
172 }
173 }
174 }
175
176 fn push_tree_recursive(&mut self, other: SumTree<T>) -> Option<SumTree<T>> {
177 match Arc::make_mut(&mut self.0) {
178 Node::Internal {
179 height,
180 summary,
181 child_summaries,
182 child_trees,
183 ..
184 } => {
185 let other_node = other.0.clone();
186 *summary += other_node.summary();
187
188 let height_delta = *height - other_node.height();
189 let mut summaries_to_append = ArrayVec::<[T::Summary; 2 * TREE_BASE]>::new();
190 let mut trees_to_append = ArrayVec::<[SumTree<T>; 2 * TREE_BASE]>::new();
191 if height_delta == 0 {
192 summaries_to_append.extend(other_node.child_summaries().iter().cloned());
193 trees_to_append.extend(other_node.child_trees().iter().cloned());
194 } else if height_delta == 1 && !other_node.is_underflowing() {
195 summaries_to_append.push(other_node.summary().clone());
196 trees_to_append.push(other)
197 } else {
198 let tree_to_append = child_trees.last_mut().unwrap().push_tree_recursive(other);
199 *child_summaries.last_mut().unwrap() =
200 child_trees.last().unwrap().0.summary().clone();
201
202 if let Some(split_tree) = tree_to_append {
203 summaries_to_append.push(split_tree.0.summary().clone());
204 trees_to_append.push(split_tree);
205 }
206 }
207
208 let child_count = child_trees.len() + trees_to_append.len();
209 if child_count > 2 * TREE_BASE {
210 let left_summaries: ArrayVec<_>;
211 let right_summaries: ArrayVec<_>;
212 let left_trees;
213 let right_trees;
214
215 let midpoint = (child_count + child_count % 2) / 2;
216 {
217 let mut all_summaries = child_summaries
218 .iter()
219 .chain(summaries_to_append.iter())
220 .cloned();
221 left_summaries = all_summaries.by_ref().take(midpoint).collect();
222 right_summaries = all_summaries.collect();
223 let mut all_trees =
224 child_trees.iter().chain(trees_to_append.iter()).cloned();
225 left_trees = all_trees.by_ref().take(midpoint).collect();
226 right_trees = all_trees.collect();
227 }
228 *summary = sum(left_summaries.iter());
229 *child_summaries = left_summaries;
230 *child_trees = left_trees;
231
232 Some(SumTree(Arc::new(Node::Internal {
233 height: *height,
234 summary: sum(right_summaries.iter()),
235 child_summaries: right_summaries,
236 child_trees: right_trees,
237 })))
238 } else {
239 child_summaries.extend(summaries_to_append);
240 child_trees.extend(trees_to_append);
241 None
242 }
243 }
244 Node::Leaf {
245 summary,
246 items,
247 item_summaries,
248 } => {
249 let other_node = other.0;
250
251 let child_count = items.len() + other_node.items().len();
252 if child_count > 2 * TREE_BASE {
253 let left_items;
254 let right_items;
255 let left_summaries;
256 let right_summaries: ArrayVec<[T::Summary; 2 * TREE_BASE]>;
257
258 let midpoint = (child_count + child_count % 2) / 2;
259 {
260 let mut all_items = items.iter().chain(other_node.items().iter()).cloned();
261 left_items = all_items.by_ref().take(midpoint).collect();
262 right_items = all_items.collect();
263
264 let mut all_summaries = item_summaries
265 .iter()
266 .chain(other_node.child_summaries())
267 .cloned();
268 left_summaries = all_summaries.by_ref().take(midpoint).collect();
269 right_summaries = all_summaries.collect();
270 }
271 *items = left_items;
272 *item_summaries = left_summaries;
273 *summary = sum(item_summaries.iter());
274 Some(SumTree(Arc::new(Node::Leaf {
275 items: right_items,
276 summary: sum(right_summaries.iter()),
277 item_summaries: right_summaries,
278 })))
279 } else {
280 *summary += other_node.summary();
281 items.extend(other_node.items().iter().cloned());
282 item_summaries.extend(other_node.child_summaries().iter().cloned());
283 None
284 }
285 }
286 }
287 }
288
289 fn from_child_trees(child_trees: Vec<SumTree<T>>) -> Self {
290 let height = child_trees[0].0.height() + 1;
291 let mut child_summaries = ArrayVec::new();
292 for child in &child_trees {
293 child_summaries.push(child.0.summary().clone());
294 }
295 let summary = sum(child_summaries.iter());
296 SumTree(Arc::new(Node::Internal {
297 height,
298 summary,
299 child_summaries,
300 child_trees: ArrayVec::from_iter(child_trees),
301 }))
302 }
303
304 fn leftmost_leaf(&self) -> &Self {
305 match *self.0 {
306 Node::Leaf { .. } => self,
307 Node::Internal {
308 ref child_trees, ..
309 } => child_trees.first().unwrap().leftmost_leaf(),
310 }
311 }
312
313 fn rightmost_leaf(&self) -> &Self {
314 match *self.0 {
315 Node::Leaf { .. } => self,
316 Node::Internal {
317 ref child_trees, ..
318 } => child_trees.last().unwrap().rightmost_leaf(),
319 }
320 }
321}
322
323impl<T: KeyedItem> SumTree<T> {
324 #[allow(unused)]
325 pub fn insert(&mut self, item: T) {
326 *self = {
327 let mut cursor = self.cursor::<T::Key, ()>();
328 let mut new_tree = cursor.slice(&item.key(), SeekBias::Left);
329 new_tree.push(item);
330 new_tree.push_tree(cursor.suffix());
331 new_tree
332 };
333 }
334
335 pub fn edit(&mut self, mut edits: Vec<Edit<T>>) -> Vec<T> {
336 if edits.is_empty() {
337 return Vec::new();
338 }
339
340 let mut removed = Vec::new();
341 edits.sort_unstable_by_key(|item| item.key());
342
343 *self = {
344 let mut cursor = self.cursor::<T::Key, ()>();
345 let mut new_tree = SumTree::new();
346 let mut buffered_items = Vec::new();
347
348 cursor.seek(&T::Key::default(), SeekBias::Left);
349 for edit in edits {
350 let new_key = edit.key();
351 let mut old_item = cursor.item();
352
353 if old_item
354 .as_ref()
355 .map_or(false, |old_item| old_item.key() < new_key)
356 {
357 new_tree.extend(buffered_items.drain(..));
358 let slice = cursor.slice(&new_key, SeekBias::Left);
359 new_tree.push_tree(slice);
360 old_item = cursor.item();
361 }
362
363 if let Some(old_item) = old_item {
364 if old_item.key() == new_key {
365 removed.push(old_item.clone());
366 cursor.next();
367 }
368 }
369
370 match edit {
371 Edit::Insert(item) => {
372 buffered_items.push(item);
373 }
374 Edit::Remove(_) => {}
375 }
376 }
377
378 new_tree.extend(buffered_items);
379 new_tree.push_tree(cursor.suffix());
380 new_tree
381 };
382
383 removed
384 }
385
386 pub fn get(&self, key: &T::Key) -> Option<&T> {
387 let mut cursor = self.cursor::<T::Key, ()>();
388 if cursor.seek(key, SeekBias::Left) {
389 cursor.item()
390 } else {
391 None
392 }
393 }
394}
395
396impl<T: Item> Default for SumTree<T> {
397 fn default() -> Self {
398 Self::new()
399 }
400}
401
402#[derive(Clone, Debug)]
403pub enum Node<T: Item> {
404 Internal {
405 height: u8,
406 summary: T::Summary,
407 child_summaries: ArrayVec<[T::Summary; 2 * TREE_BASE]>,
408 child_trees: ArrayVec<[SumTree<T>; 2 * TREE_BASE]>,
409 },
410 Leaf {
411 summary: T::Summary,
412 items: ArrayVec<[T; 2 * TREE_BASE]>,
413 item_summaries: ArrayVec<[T::Summary; 2 * TREE_BASE]>,
414 },
415}
416
417impl<T: Item> Node<T> {
418 fn is_leaf(&self) -> bool {
419 match self {
420 Node::Leaf { .. } => true,
421 _ => false,
422 }
423 }
424
425 fn height(&self) -> u8 {
426 match self {
427 Node::Internal { height, .. } => *height,
428 Node::Leaf { .. } => 0,
429 }
430 }
431
432 fn summary(&self) -> &T::Summary {
433 match self {
434 Node::Internal { summary, .. } => summary,
435 Node::Leaf { summary, .. } => summary,
436 }
437 }
438
439 fn child_summaries(&self) -> &[T::Summary] {
440 match self {
441 Node::Internal {
442 child_summaries, ..
443 } => child_summaries.as_slice(),
444 Node::Leaf { item_summaries, .. } => item_summaries.as_slice(),
445 }
446 }
447
448 fn child_trees(&self) -> &ArrayVec<[SumTree<T>; 2 * TREE_BASE]> {
449 match self {
450 Node::Internal { child_trees, .. } => child_trees,
451 Node::Leaf { .. } => panic!("Leaf nodes have no child trees"),
452 }
453 }
454
455 fn items(&self) -> &ArrayVec<[T; 2 * TREE_BASE]> {
456 match self {
457 Node::Leaf { items, .. } => items,
458 Node::Internal { .. } => panic!("Internal nodes have no items"),
459 }
460 }
461
462 fn is_underflowing(&self) -> bool {
463 match self {
464 Node::Internal { child_trees, .. } => child_trees.len() < TREE_BASE,
465 Node::Leaf { items, .. } => items.len() < TREE_BASE,
466 }
467 }
468}
469
470#[derive(Debug)]
471pub enum Edit<T: KeyedItem> {
472 Insert(T),
473 Remove(T::Key),
474}
475
476impl<T: KeyedItem> Edit<T> {
477 fn key(&self) -> T::Key {
478 match self {
479 Edit::Insert(item) => item.key(),
480 Edit::Remove(key) => key.clone(),
481 }
482 }
483}
484
485fn sum<'a, T, I>(iter: I) -> T
486where
487 T: 'a + Default + AddAssign<&'a T>,
488 I: Iterator<Item = &'a T>,
489{
490 let mut sum = T::default();
491 for value in iter {
492 sum += value;
493 }
494 sum
495}
496
497#[cfg(test)]
498mod tests {
499 use super::*;
500 use std::cmp;
501 use std::ops::Add;
502
503 #[test]
504 fn test_extend_and_push_tree() {
505 let mut tree1 = SumTree::new();
506 tree1.extend(0..20);
507
508 let mut tree2 = SumTree::new();
509 tree2.extend(50..100);
510
511 tree1.push_tree(tree2);
512 assert_eq!(tree1.items(), (0..20).chain(50..100).collect::<Vec<u8>>());
513 }
514
515 #[test]
516 fn test_random() {
517 for seed in 0..100 {
518 use rand::{distributions, prelude::*};
519
520 let rng = &mut StdRng::seed_from_u64(seed);
521
522 let mut tree = SumTree::<u8>::new();
523 let count = rng.gen_range(0..10);
524 tree.extend(rng.sample_iter(distributions::Standard).take(count));
525
526 for _ in 0..5 {
527 let splice_end = rng.gen_range(0..tree.extent::<Count>().0 + 1);
528 let splice_start = rng.gen_range(0..splice_end + 1);
529 let count = rng.gen_range(0..3);
530 let tree_end = tree.extent::<Count>();
531 let new_items = rng
532 .sample_iter(distributions::Standard)
533 .take(count)
534 .collect::<Vec<u8>>();
535
536 let mut reference_items = tree.items();
537 reference_items.splice(splice_start..splice_end, new_items.clone());
538
539 tree = {
540 let mut cursor = tree.cursor::<Count, ()>();
541 let mut new_tree = cursor.slice(&Count(splice_start), SeekBias::Right);
542 new_tree.extend(new_items);
543 cursor.seek(&Count(splice_end), SeekBias::Right);
544 new_tree.push_tree(cursor.slice(&tree_end, SeekBias::Right));
545 new_tree
546 };
547
548 assert_eq!(tree.items(), reference_items);
549
550 let mut filter_cursor = tree.filter::<_, Count>(|summary| summary.contains_even);
551 let mut reference_filter = tree
552 .items()
553 .into_iter()
554 .enumerate()
555 .filter(|(_, item)| (item & 1) == 0);
556 while let Some(actual_item) = filter_cursor.item() {
557 let (reference_index, reference_item) = reference_filter.next().unwrap();
558 assert_eq!(actual_item, &reference_item);
559 assert_eq!(filter_cursor.start().0, reference_index);
560 filter_cursor.next();
561 }
562 assert!(reference_filter.next().is_none());
563
564 let mut pos = rng.gen_range(0..tree.extent::<Count>().0 + 1);
565 let mut before_start = false;
566 let mut cursor = tree.cursor::<Count, Count>();
567 cursor.seek(&Count(pos), SeekBias::Right);
568
569 for i in 0..10 {
570 assert_eq!(cursor.start().0, pos);
571
572 if pos > 0 {
573 assert_eq!(cursor.prev_item().unwrap(), &reference_items[pos - 1]);
574 } else {
575 assert_eq!(cursor.prev_item(), None);
576 }
577
578 if pos < reference_items.len() && !before_start {
579 assert_eq!(cursor.item().unwrap(), &reference_items[pos]);
580 } else {
581 assert_eq!(cursor.item(), None);
582 }
583
584 if i < 5 {
585 cursor.next();
586 if pos < reference_items.len() {
587 pos += 1;
588 before_start = false;
589 }
590 } else {
591 cursor.prev();
592 if pos == 0 {
593 before_start = true;
594 }
595 pos = pos.saturating_sub(1);
596 }
597 }
598 }
599
600 for _ in 0..10 {
601 let end = rng.gen_range(0..tree.extent::<Count>().0 + 1);
602 let start = rng.gen_range(0..end + 1);
603 let start_bias = if rng.gen() {
604 SeekBias::Left
605 } else {
606 SeekBias::Right
607 };
608 let end_bias = if rng.gen() {
609 SeekBias::Left
610 } else {
611 SeekBias::Right
612 };
613
614 let mut cursor = tree.cursor::<Count, ()>();
615 cursor.seek(&Count(start), start_bias);
616 let slice = cursor.slice(&Count(end), end_bias);
617
618 cursor.seek(&Count(start), start_bias);
619 let summary = cursor.summary::<Sum>(&Count(end), end_bias);
620
621 assert_eq!(summary, slice.summary().sum);
622 }
623 }
624 }
625
626 #[test]
627 fn test_cursor() {
628 // Empty tree
629 let tree = SumTree::<u8>::new();
630 let mut cursor = tree.cursor::<Count, Sum>();
631 assert_eq!(
632 cursor.slice(&Count(0), SeekBias::Right).items(),
633 Vec::<u8>::new()
634 );
635 assert_eq!(cursor.item(), None);
636 assert_eq!(cursor.prev_item(), None);
637 assert_eq!(cursor.start(), &Sum(0));
638
639 // Single-element tree
640 let mut tree = SumTree::<u8>::new();
641 tree.extend(vec![1]);
642 let mut cursor = tree.cursor::<Count, Sum>();
643 assert_eq!(
644 cursor.slice(&Count(0), SeekBias::Right).items(),
645 Vec::<u8>::new()
646 );
647 assert_eq!(cursor.item(), Some(&1));
648 assert_eq!(cursor.prev_item(), None);
649 assert_eq!(cursor.start(), &Sum(0));
650
651 cursor.next();
652 assert_eq!(cursor.item(), None);
653 assert_eq!(cursor.prev_item(), Some(&1));
654 assert_eq!(cursor.start(), &Sum(1));
655
656 cursor.prev();
657 assert_eq!(cursor.item(), Some(&1));
658 assert_eq!(cursor.prev_item(), None);
659 assert_eq!(cursor.start(), &Sum(0));
660
661 let mut cursor = tree.cursor::<Count, Sum>();
662 assert_eq!(cursor.slice(&Count(1), SeekBias::Right).items(), [1]);
663 assert_eq!(cursor.item(), None);
664 assert_eq!(cursor.prev_item(), Some(&1));
665 assert_eq!(cursor.start(), &Sum(1));
666
667 cursor.seek(&Count(0), SeekBias::Right);
668 assert_eq!(
669 cursor
670 .slice(&tree.extent::<Count>(), SeekBias::Right)
671 .items(),
672 [1]
673 );
674 assert_eq!(cursor.item(), None);
675 assert_eq!(cursor.prev_item(), Some(&1));
676 assert_eq!(cursor.start(), &Sum(1));
677
678 // Multiple-element tree
679 let mut tree = SumTree::new();
680 tree.extend(vec![1, 2, 3, 4, 5, 6]);
681 let mut cursor = tree.cursor::<Count, Sum>();
682
683 assert_eq!(cursor.slice(&Count(2), SeekBias::Right).items(), [1, 2]);
684 assert_eq!(cursor.item(), Some(&3));
685 assert_eq!(cursor.prev_item(), Some(&2));
686 assert_eq!(cursor.start(), &Sum(3));
687
688 cursor.next();
689 assert_eq!(cursor.item(), Some(&4));
690 assert_eq!(cursor.prev_item(), Some(&3));
691 assert_eq!(cursor.start(), &Sum(6));
692
693 cursor.next();
694 assert_eq!(cursor.item(), Some(&5));
695 assert_eq!(cursor.prev_item(), Some(&4));
696 assert_eq!(cursor.start(), &Sum(10));
697
698 cursor.next();
699 assert_eq!(cursor.item(), Some(&6));
700 assert_eq!(cursor.prev_item(), Some(&5));
701 assert_eq!(cursor.start(), &Sum(15));
702
703 cursor.next();
704 cursor.next();
705 assert_eq!(cursor.item(), None);
706 assert_eq!(cursor.prev_item(), Some(&6));
707 assert_eq!(cursor.start(), &Sum(21));
708
709 cursor.prev();
710 assert_eq!(cursor.item(), Some(&6));
711 assert_eq!(cursor.prev_item(), Some(&5));
712 assert_eq!(cursor.start(), &Sum(15));
713
714 cursor.prev();
715 assert_eq!(cursor.item(), Some(&5));
716 assert_eq!(cursor.prev_item(), Some(&4));
717 assert_eq!(cursor.start(), &Sum(10));
718
719 cursor.prev();
720 assert_eq!(cursor.item(), Some(&4));
721 assert_eq!(cursor.prev_item(), Some(&3));
722 assert_eq!(cursor.start(), &Sum(6));
723
724 cursor.prev();
725 assert_eq!(cursor.item(), Some(&3));
726 assert_eq!(cursor.prev_item(), Some(&2));
727 assert_eq!(cursor.start(), &Sum(3));
728
729 cursor.prev();
730 assert_eq!(cursor.item(), Some(&2));
731 assert_eq!(cursor.prev_item(), Some(&1));
732 assert_eq!(cursor.start(), &Sum(1));
733
734 cursor.prev();
735 assert_eq!(cursor.item(), Some(&1));
736 assert_eq!(cursor.prev_item(), None);
737 assert_eq!(cursor.start(), &Sum(0));
738
739 cursor.prev();
740 assert_eq!(cursor.item(), None);
741 assert_eq!(cursor.prev_item(), None);
742 assert_eq!(cursor.start(), &Sum(0));
743
744 cursor.next();
745 assert_eq!(cursor.item(), Some(&1));
746 assert_eq!(cursor.prev_item(), None);
747 assert_eq!(cursor.start(), &Sum(0));
748
749 let mut cursor = tree.cursor::<Count, Sum>();
750 assert_eq!(
751 cursor
752 .slice(&tree.extent::<Count>(), SeekBias::Right)
753 .items(),
754 tree.items()
755 );
756 assert_eq!(cursor.item(), None);
757 assert_eq!(cursor.prev_item(), Some(&6));
758 assert_eq!(cursor.start(), &Sum(21));
759
760 cursor.seek(&Count(3), SeekBias::Right);
761 assert_eq!(
762 cursor
763 .slice(&tree.extent::<Count>(), SeekBias::Right)
764 .items(),
765 [4, 5, 6]
766 );
767 assert_eq!(cursor.item(), None);
768 assert_eq!(cursor.prev_item(), Some(&6));
769 assert_eq!(cursor.start(), &Sum(21));
770
771 // Seeking can bias left or right
772 cursor.seek(&Count(1), SeekBias::Left);
773 assert_eq!(cursor.item(), Some(&1));
774 cursor.seek(&Count(1), SeekBias::Right);
775 assert_eq!(cursor.item(), Some(&2));
776
777 // Slicing without resetting starts from where the cursor is parked at.
778 cursor.seek(&Count(1), SeekBias::Right);
779 assert_eq!(cursor.slice(&Count(3), SeekBias::Right).items(), vec![2, 3]);
780 assert_eq!(cursor.slice(&Count(6), SeekBias::Left).items(), vec![4, 5]);
781 assert_eq!(cursor.slice(&Count(6), SeekBias::Right).items(), vec![6]);
782 }
783
784 #[test]
785 fn test_edit() {
786 let mut tree = SumTree::<u8>::new();
787
788 let removed = tree.edit(vec![Edit::Insert(1), Edit::Insert(2), Edit::Insert(0)]);
789 assert_eq!(tree.items(), vec![0, 1, 2]);
790 assert_eq!(removed, Vec::<u8>::new());
791 assert_eq!(tree.get(&0), Some(&0));
792 assert_eq!(tree.get(&1), Some(&1));
793 assert_eq!(tree.get(&2), Some(&2));
794 assert_eq!(tree.get(&4), None);
795
796 let removed = tree.edit(vec![Edit::Insert(2), Edit::Insert(4), Edit::Remove(0)]);
797 assert_eq!(tree.items(), vec![1, 2, 4]);
798 assert_eq!(removed, vec![0, 2]);
799 assert_eq!(tree.get(&0), None);
800 assert_eq!(tree.get(&1), Some(&1));
801 assert_eq!(tree.get(&2), Some(&2));
802 assert_eq!(tree.get(&4), Some(&4));
803 }
804
805 #[derive(Clone, Default, Debug)]
806 pub struct IntegersSummary {
807 count: Count,
808 sum: Sum,
809 contains_even: bool,
810 max: u8,
811 }
812
813 #[derive(Ord, PartialOrd, Default, Eq, PartialEq, Clone, Debug)]
814 struct Count(usize);
815
816 #[derive(Ord, PartialOrd, Default, Eq, PartialEq, Clone, Debug)]
817 struct Sum(usize);
818
819 impl Item for u8 {
820 type Summary = IntegersSummary;
821
822 fn summary(&self) -> Self::Summary {
823 IntegersSummary {
824 count: Count(1),
825 sum: Sum(*self as usize),
826 contains_even: (*self & 1) == 0,
827 max: *self,
828 }
829 }
830 }
831
832 impl KeyedItem for u8 {
833 type Key = u8;
834
835 fn key(&self) -> Self::Key {
836 *self
837 }
838 }
839
840 impl<'a> Dimension<'a, IntegersSummary> for u8 {
841 fn add_summary(&mut self, summary: &IntegersSummary) {
842 *self = summary.max;
843 }
844 }
845
846 impl<'a> AddAssign<&'a Self> for IntegersSummary {
847 fn add_assign(&mut self, other: &Self) {
848 self.count.0 += &other.count.0;
849 self.sum.0 += &other.sum.0;
850 self.contains_even |= other.contains_even;
851 self.max = cmp::max(self.max, other.max);
852 }
853 }
854
855 impl<'a> Dimension<'a, IntegersSummary> for Count {
856 fn add_summary(&mut self, summary: &IntegersSummary) {
857 self.0 += summary.count.0;
858 }
859 }
860
861 impl<'a> Dimension<'a, IntegersSummary> for Sum {
862 fn add_summary(&mut self, summary: &IntegersSummary) {
863 self.0 += summary.sum.0;
864 }
865 }
866
867 impl<'a> Add<&'a Self> for Sum {
868 type Output = Self;
869
870 fn add(mut self, other: &Self) -> Self {
871 self.0 += other.0;
872 self
873 }
874 }
875}