1#[cfg(all(feature = "arc", feature = "rayon_iter"))]
4extern crate rayon;
5
6#[cfg(feature = "serde_serializer")]
7extern crate serde;
8
9use rrbtree::RrbTree;
10use rrbtree::BRANCH_FACTOR;
11use std::fmt::Debug;
12use std::mem;
13use std::ops;
14
15pub mod iter;
16mod sharedptr;
17
18#[macro_use]
19mod rrbtree;
20
21#[cfg(feature = "serde_serializer")]
22pub mod serializer;
23
24#[cfg(not(feature = "small_branch"))]
25macro_rules! clone_arr {
26 ($source:expr) => {{
27 let s = $source;
28 [
29 Some(s[0x00].clone()),
30 Some(s[0x01].clone()),
31 Some(s[0x02].clone()),
32 Some(s[0x03].clone()),
33 Some(s[0x04].clone()),
34 Some(s[0x05].clone()),
35 Some(s[0x06].clone()),
36 Some(s[0x07].clone()),
37 Some(s[0x08].clone()),
38 Some(s[0x09].clone()),
39 Some(s[0x0A].clone()),
40 Some(s[0x0B].clone()),
41 Some(s[0x0C].clone()),
42 Some(s[0x0D].clone()),
43 Some(s[0x0E].clone()),
44 Some(s[0x0F].clone()),
45 Some(s[0x10].clone()),
46 Some(s[0x11].clone()),
47 Some(s[0x12].clone()),
48 Some(s[0x13].clone()),
49 Some(s[0x14].clone()),
50 Some(s[0x15].clone()),
51 Some(s[0x16].clone()),
52 Some(s[0x17].clone()),
53 Some(s[0x18].clone()),
54 Some(s[0x19].clone()),
55 Some(s[0x1A].clone()),
56 Some(s[0x1B].clone()),
57 Some(s[0x1C].clone()),
58 Some(s[0x1D].clone()),
59 Some(s[0x1E].clone()),
60 Some(s[0x1F].clone()),
61 ]
62 }};
63}
64
65#[cfg(feature = "small_branch")]
66macro_rules! clone_arr {
67 ($source:expr) => {{
68 let s = $source;
69 [
70 Some(s[0x00].clone()),
71 Some(s[0x01].clone()),
72 Some(s[0x02].clone()),
73 Some(s[0x03].clone()),
74 ]
75 }};
76}
77
78#[derive(Clone, Debug, Ord, PartialOrd, Eq, PartialEq)]
80pub struct RbVec<T> {
81 tree: RrbTree<T>,
82 tail: [Option<T>; BRANCH_FACTOR],
83 tail_len: usize,
84}
85
86#[derive(Clone, Debug, Ord, PartialOrd, Eq, PartialEq)]
88pub struct RrbVec<T> {
89 tree: RrbTree<T>,
90 tail: [Option<T>; BRANCH_FACTOR],
91 tail_len: usize,
92}
93
94macro_rules! impl_vec {
95 ($vec:ident) => {
96 impl<T: Clone + Debug> Default for $vec<T> {
97 fn default() -> Self {
98 $vec::new()
99 }
100 }
101
102 impl<T: Clone + Debug> $vec<T> {
103 pub fn new() -> Self {
107 $vec {
108 tree: RrbTree::new(),
109 tail: new_branch!(),
110 tail_len: 0,
111 }
112 }
113
114 pub fn push(&mut self, item: T) {
116 self.tail[self.tail_len] = Some(item);
117 self.tail_len += 1;
118
119 self.push_tail();
120 }
121
122 #[inline(always)]
123 fn push_tail(&mut self) {
124 if self.tail_len == BRANCH_FACTOR {
125 let tail = mem::replace(&mut self.tail, new_branch!());
126
127 self.tree.push(tail, self.tail_len);
128 self.tail_len = 0;
129 }
130 }
131
132 pub fn pop(&mut self) -> Option<T> {
135 if self.is_empty() {
136 return None;
137 }
138
139 if self.tail_len == 0 {
140 let (new_tail, new_tail_len) = self.tree.pop();
141 mem::replace(&mut self.tail, new_tail);
142
143 self.tail_len = new_tail_len;
144 }
145
146 let item = self.tail[self.tail_len - 1].take();
147 self.tail_len -= 1;
148
149 item
150 }
151
152 pub fn get(&self, index: usize) -> Option<&T> {
155 if self.tree.len() > index {
156 self.tree.get(index)
157 } else {
158 self.tail[index - self.tree.len()].as_ref()
159 }
160 }
161
162 pub fn get_mut(&mut self, index: usize) -> Option<&mut T> {
165 if self.tree.len() > index {
166 self.tree.get_mut(index)
167 } else {
168 self.tail[index - self.tree.len()].as_mut()
169 }
170 }
171
172 pub fn len(&self) -> usize {
174 self.tree.len() + self.tail_len
175 }
176
177 pub fn is_empty(&self) -> bool {
179 self.len() == 0
180 }
181 }
182
183 impl<T: Clone + Debug> ops::Index<usize> for $vec<T> {
184 type Output = T;
185
186 fn index(&self, index: usize) -> &T {
187 self.get(index).unwrap_or_else(|| {
188 panic!(
189 "index `{}` out of bounds in RrbVec of length `{}`",
190 index,
191 self.len()
192 )
193 })
194 }
195 }
196
197 impl<T: Clone + Debug> ops::IndexMut<usize> for $vec<T> {
198 fn index_mut(&mut self, index: usize) -> &mut T {
199 let len = self.len();
200 self.get_mut(index).unwrap_or_else(|| {
201 panic!(
202 "index `{}` out of bounds in RrbVec of length `{}`",
203 index, len
204 )
205 })
206 }
207 }
208 };
209}
210
211impl_vec!(RbVec);
212impl_vec!(RrbVec);
213
214impl<T: Clone + Debug> RbVec<T> {
215 pub fn split_off(&mut self, mid: usize) -> Self {
221 if mid == 0 {
222 mem::replace(self, Self::new())
223 } else if mid < self.len() {
224 if self.tree.len() > mid {
225 let chunks_count = (self.tree.len() - mid) / BRANCH_FACTOR;
226 let mut chunks = Vec::with_capacity(chunks_count);
227
228 while self.tree.len() - BRANCH_FACTOR > mid {
229 chunks.push(self.tree.pop());
230 }
231
232 let (mut left_tail, mut left_tail_len) = self.tree.pop();
233
234 let from_i = mid - self.tree.len();
235 let to_len = left_tail_len;
236
237 let mut right = Self::new();
238 for i in from_i..to_len {
239 right.push(left_tail[i].take().unwrap());
240 left_tail_len -= 1;
241 }
242
243 let mut right_tail = mem::replace(&mut self.tail, left_tail);
244 let right_tail_len = mem::replace(&mut self.tail_len, left_tail_len);
245
246 for (mut chunk, chunk_len) in chunks.into_iter().rev() {
247 for i in 0..chunk_len {
248 right.push(chunk[i].take().unwrap());
249 }
250 }
251
252 for i in 0..right_tail_len {
253 right.push(right_tail[i].take().unwrap());
254 }
255
256 right
257 } else {
258 let left_tail_len = mid - self.tree.len();
259
260 let mut right_tail = new_branch!();
261 let mut right_tail_len = 0;
262
263 for i in left_tail_len..self.tail_len {
264 right_tail[right_tail_len] = self.tail[i].take();
265 right_tail_len += 1;
266 }
267
268 self.tail_len = left_tail_len;
269
270 RbVec {
271 tree: RrbTree::new(),
272 tail: right_tail,
273 tail_len: right_tail_len,
274 }
275 }
276 } else if mid == self.len() {
277 Self::new()
278 } else {
279 panic!()
280 }
281 }
282
283 pub fn append(&mut self, that: &mut RbVec<T>) {
286 let that_is_empty = that.is_empty();
287
288 if self.is_empty() {
289 mem::swap(&mut self.tree, &mut that.tree);
290 mem::swap(&mut self.tail, &mut that.tail);
291 mem::swap(&mut self.tail_len, &mut that.tail_len);
292 } else if !that_is_empty {
293 let that_tree = mem::replace(&mut that.tree, RrbTree::new());
294 let that_tail = mem::replace(&mut that.tail, new_branch!());
295
296 let that_tail_len = that.tail_len;
297 that.tail_len = 0;
298
299 let that_vec = RbVec {
300 tree: that_tree,
301 tail: that_tail,
302 tail_len: that_tail_len,
303 };
304
305 for value in that_vec.into_iter() {
306 self.push(value);
307 }
308 }
309 }
310}
311
312impl<T: Clone + Debug> RrbVec<T> {
313 pub fn split_off(&mut self, mid: usize) -> Self {
319 if mid == 0 {
320 mem::replace(self, RrbVec::new())
321 } else if mid < self.len() {
322 if self.tree.len() > mid {
323 let right_tree = self.tree.split_off(mid);
324
325 let (left_tail, left_tail_len) = self.tree.pop();
326
327 let right_tail = mem::replace(&mut self.tail, left_tail);
328 let right_tail_len = mem::replace(&mut self.tail_len, left_tail_len);
329
330 let mut right = RrbVec {
331 tree: right_tree,
332 tail: right_tail,
333 tail_len: right_tail_len,
334 };
335
336 if right.tree.is_root_leaf() {
337 if right.len() <= BRANCH_FACTOR {
338 let (mut new_tail, mut new_tail_len) = right.tree.pop();
340
341 for i in 0..right.tail_len {
342 new_tail[new_tail_len] = right.tail[i].take();
343 new_tail_len += 1;
344 }
345
346 right.tail = new_tail;
347 right.tail_len = new_tail_len;
348 } else if right.tree.len() < BRANCH_FACTOR {
349 let (mut root, mut root_len) = right.tree.pop();
353 let mut index = 0;
354
355 while root_len < BRANCH_FACTOR && index < right.tail_len {
356 root[root_len] = right.tail[index].take();
357
358 root_len += 1;
359 index += 1;
360 }
361
362 right.tree.push(root, root_len);
363
364 let (mut new_tail, mut new_tail_len) = (new_branch!(), 0);
365 while index < right.tail_len {
366 new_tail[new_tail_len] = right.tail[index].take();
367
368 new_tail_len += 1;
369 index += 1;
370 }
371
372 right.tail = new_tail;
373 right.tail_len = new_tail_len;
374 }
375 }
376
377 right
378 } else {
379 let left_tail_len = mid - self.tree.len();
380
381 let mut right_tail = new_branch!();
382 let mut right_tail_len = 0;
383
384 for i in left_tail_len..self.tail_len {
385 right_tail[right_tail_len] = self.tail[i].take();
386 right_tail_len += 1;
387 }
388
389 self.tail_len = left_tail_len;
390
391 RrbVec {
392 tree: RrbTree::new(),
393 tail: right_tail,
394 tail_len: right_tail_len,
395 }
396 }
397 } else if mid == self.len() {
398 RrbVec::new()
399 } else {
400 panic!()
401 }
402 }
403
404 pub fn append(&mut self, that: &mut RrbVec<T>) {
407 if self.is_empty() {
408 self.tail = mem::replace(&mut that.tail, new_branch!());
409 self.tree = mem::replace(&mut that.tree, RrbTree::new());
410
411 self.tail_len = that.tail_len;
412 that.tail_len = 0;
413 } else if !that.is_empty() {
414 let mut that_tail = mem::replace(&mut that.tail, new_branch!());
415 let that_tail_len = that.tail_len;
416
417 that.tail_len = 0;
418
419 if that.tree.is_empty() {
420 if self.tail_len == BRANCH_FACTOR {
421 let self_tail = mem::replace(&mut self.tail, that_tail);
422 let self_tail_len = self.tail_len;
423
424 self.tail_len = that_tail_len;
425 self.tree.push(self_tail, self_tail_len);
426 } else if self.tail_len + that_tail_len <= BRANCH_FACTOR {
427 for item in that_tail.iter_mut().take(that_tail_len) {
428 self.tail[self.tail_len] = item.take();
429 self.tail_len += 1;
430 }
431 } else {
432 let mut self_tail = mem::replace(&mut self.tail, new_branch!());
433 let mut self_tail_i = mem::replace(&mut self.tail_len, 0);
434 let mut that_tail_i = 0;
435
436 while self_tail_i < BRANCH_FACTOR && that_tail_i < that_tail_len {
437 self_tail[self_tail_i] = that_tail[that_tail_i].take();
438
439 self_tail_i += 1;
440 that_tail_i += 1;
441 }
442
443 self.tree.push(self_tail, self_tail_i);
444
445 let that_tail_elements_left = that_tail_len - that_tail_i;
446 for i in 0..that_tail_elements_left {
447 self.tail[i] = that_tail[that_tail_i].take();
448 that_tail_i += 1;
449 }
450
451 self.tail_len = that_tail_elements_left;
452 }
453 } else {
454 if self.tail_len == 0 {
455 self.tail = that_tail;
456 self.tail_len = that_tail_len;
457 } else {
458 let self_tail = mem::replace(&mut self.tail, that_tail);
459 let self_tail_len = self.tail_len;
460
461 self.tail_len = that_tail_len;
462 self.tree.push(self_tail, self_tail_len);
463 }
464
465 self.tree.append(&mut that.tree);
466 }
467 }
468
469 self.push_tail();
470 }
471}
472
473impl<T: Clone + Debug> From<&Vec<T>> for RrbVec<T> {
474 #[inline(always)]
475 fn from(vec: &Vec<T>) -> RrbVec<T> {
476 let mut tree = RrbTree::new();
477
478 let mut chunks = vec.chunks_exact(BRANCH_FACTOR);
479 for chunk in chunks.by_ref() {
480 tree.push(clone_arr!(chunk), chunk.len());
481 }
482
483 let mut tail = new_branch!();
484 let mut tail_len = 0;
485
486 for item in chunks.remainder() {
487 tail[tail_len] = Some(item.clone());
488 tail_len += 1;
489 }
490
491 RrbVec {
492 tree,
493 tail,
494 tail_len,
495 }
496 }
497}
498
499macro_rules! make_tests {
500 ($vec:ident, $module:ident) => {
501
502 #[cfg(test)]
503 mod $module {
504 use super::$vec;
505 use super::BRANCH_FACTOR;
506
507 #[test]
508 fn len_matches_actual_size() {
509 const N: usize = 5000;
510
511 let mut vec = $vec::new();
512
513 for i in 0..N {
514 vec.push(i);
515 }
516
517 assert_eq!(vec.len(), N);
518
519 for i in 0..N {
520 assert_eq!(*vec.get(i).unwrap(), i);
521 }
522 }
523
524 #[test]
525 fn len_matches_len_cloned() {
526 const N: usize = 5000;
527
528 let mut vec = $vec::new();
529
530 for i in 0..N {
531 vec.push(i);
532 }
533
534 let vec_0 = vec.clone();
535 assert_eq!(vec.len(), N);
536 assert_eq!(vec_0.len(), N);
537
538 for i in 0..N {
539 vec.push(i);
540 }
541
542 assert_eq!(vec.len(), 2 * N);
543 assert_eq!(vec_0.len(), N);
544
545 for i in 0..N {
546 assert_eq!(*vec.get(i).unwrap(), i);
547 assert_eq!(*vec_0.get(i).unwrap(), i);
548 }
549
550 for i in 0..N {
551 assert_eq!(*vec.get(i + N).unwrap(), i);
552 }
553 }
554
555 #[test]
556 fn mutate_in_place_must_not_mutate_cloned_vec() {
557 const N: usize = 32 * 4;
558
559 let mut vec = $vec::new();
560
561 for i in 0..N {
562 vec.push(i);
563 }
564
565 let vec_0 = vec.clone();
566 assert_eq!(vec.len(), N);
567 assert_eq!(vec_0.len(), N);
568
569 for i in 0..(N / 2) {
570 *vec.get_mut(i).unwrap() += 1;
571 }
572
573 assert_eq!(vec.len(), N);
574 assert_eq!(vec_0.len(), N);
575
576 for i in 0..(N / 2) {
577 assert_eq!(*vec.get(i).unwrap(), i + 1);
578 assert_eq!(*vec_0.get(i).unwrap(), i);
579 }
580
581 for i in N / 2..N {
583 assert_eq!(*vec.get(i).unwrap(), i);
584 assert_eq!(*vec_0.get(i).unwrap(), i);
585 assert_eq!(
586 vec.get(i).unwrap() as *const usize,
587 vec_0.get(i).unwrap() as *const usize
588 );
589 }
590 }
591
592 #[test]
593 fn pop_must_not_mutate_cloned_vec() {
594 const N: usize = 32 * 4;
595
596 let mut vec = $vec::new();
597
598 for i in 0..N {
599 vec.push(i);
600 }
601
602 let vec_0 = vec.clone();
603 assert_eq!(vec.len(), N);
604 assert_eq!(vec_0.len(), N);
605
606 for _ in 0..(N / 2) {
607 vec.pop();
608 }
609
610 assert_eq!(vec.len(), N / 2);
611 assert_eq!(vec_0.len(), N);
612
613 for i in 0..(N / 2) {
614 assert_eq!(*vec.get(i).unwrap(), i);
615 assert_eq!(*vec_0.get(i).unwrap(), i);
616 }
617
618 for i in N / 2..N {
619 assert_eq!(*vec_0.get(i).unwrap(), i);
620 }
621 }
622
623 #[test]
624 fn push_pop_must_return_expected_values() {
625 const N: usize = 32 * 4;
626
627 let mut vec = $vec::new();
628
629 for i in 0..N {
630 vec.push(i)
631 }
632
633 assert_eq!(vec.len(), N);
634
635 for i in (0..N).rev() {
636 assert_eq!(vec.pop().unwrap(), i);
637 }
638
639 for i in 0..N {
640 vec.push(i)
641 }
642
643 assert_eq!(vec.len(), N);
644
645 for i in (0..N).rev() {
646 assert_eq!(vec.pop().unwrap(), i);
647 }
648
649 assert_eq!(vec.len(), 0);
650 }
651
652 #[test]
653 fn append_must_maintain_vectors_in_correct_state_after_clone() {
654 let mut vec_l = $vec::new();
655 let mut vec_c = $vec::new();
656 let mut vec_r = $vec::new();
657
658 let mut branch_value = 0;
659
660 for _ in 0..BRANCH_FACTOR * BRANCH_FACTOR * BRANCH_FACTOR {
661 vec_l.push(branch_value);
662 branch_value += 1;
663 }
664
665 for _ in 0..BRANCH_FACTOR * BRANCH_FACTOR {
666 vec_c.push(branch_value);
667 branch_value += 1;
668 }
669
670 for _ in 0..BRANCH_FACTOR * BRANCH_FACTOR {
671 vec_r.push(branch_value);
672 branch_value += 1;
673 }
674
675 let vec_l_clone = vec_l.clone();
676 let vec_c_clone = vec_c.clone();
677 let vec_r_clone = vec_r.clone();
678
679 vec_l.append(&mut vec_c);
680 vec_l.append(&mut vec_r);
681
682 assert_eq!(
683 vec_l.len(),
684 vec_l_clone.len() + vec_c_clone.len() + vec_r_clone.len()
685 );
686
687 let mut branch_test_value = 0;
688
689 for i in 0..vec_l_clone.len() {
690 assert_eq!(*vec_l_clone.get(i).unwrap(), branch_test_value);
691 branch_test_value += 1;
692 }
693
694 for i in 0..vec_c_clone.len() {
695 assert_eq!(*vec_c_clone.get(i).unwrap(), branch_test_value);
696 branch_test_value += 1;
697 }
698
699 for i in 0..vec_r_clone.len() {
700 assert_eq!(*vec_r_clone.get(i).unwrap(), branch_test_value);
701 branch_test_value += 1;
702 }
703 }
704
705 fn interleaving_different_operations_must_maintain_correct_internal_state(vec_size: usize) {
706 let mut vec = $vec::new();
707 let mut vec_item = 0;
708
709 for i in 0..128 {
710 if i % 2 == 0 {
711 let mut vec_temp = $vec::new();
712
713 for _ in 0..vec_size {
714 vec_temp.push(vec_item);
715 vec_item += 1;
716 }
717
718 assert_eq!(vec_temp.len(), vec_size);
719
720 vec.append(&mut vec_temp);
721
722 assert_eq!(vec_temp.len(), 0);
723 } else {
724 for _ in 0..(vec_size + vec_size) {
725 vec.push(vec_item);
726 vec_item += 1;
727 }
728 }
729
730 assert_eq!(vec.len(), vec_item);
731
732 for i in 0..vec.len() {
733 assert_eq!(*vec.get(i).unwrap(), i);
734 assert_eq!(*vec.get_mut(i).unwrap(), i);
735 }
736
737 let mut vec_one_clone = vec.clone();
738 for i in (0..vec_item).rev() {
739 assert_eq!(vec_one_clone.pop().unwrap(), i);
740 }
741
742 assert_eq!(vec_one_clone.len(), 0);
743 }
744
745 assert_eq!(vec.len(), vec_item);
746
747 let mut vec_clone = vec.clone();
748 for i in (0..vec_item).rev() {
749 assert_eq!(vec_clone.pop().unwrap(), i);
750
751 for j in 0..vec_clone.len() {
752 assert_eq!(*vec_clone.get(j).unwrap(), j);
753 assert_eq!(*vec_clone.get_mut(j).unwrap(), j);
754 }
755 }
756 }
757
758 #[test]
759 fn interleaving_different_operations_must_maintain_correct_internal_state_for_var_sizes_4() {
760 interleaving_different_operations_must_maintain_correct_internal_state(4);
761 }
762
763 #[test]
764 fn interleaving_different_operations_must_maintain_correct_internal_state_for_var_sizes_5() {
765 interleaving_different_operations_must_maintain_correct_internal_state(5);
766 }
767
768 #[test]
769 fn interleaving_different_operations_must_maintain_correct_internal_state_for_var_sizes_16() {
770 interleaving_different_operations_must_maintain_correct_internal_state(16);
771 }
772
773 #[test]
774 fn interleaving_different_operations_must_maintain_correct_internal_state_for_var_sizes_17() {
775 interleaving_different_operations_must_maintain_correct_internal_state(17);
776 }
777
778 #[test]
779 fn interleaving_different_operations_must_maintain_correct_internal_state_for_var_sizes_32() {
780 interleaving_different_operations_must_maintain_correct_internal_state(32);
781 }
782
783 #[test]
784 fn interleaving_different_operations_must_maintain_correct_internal_state_for_var_sizes_33() {
785 interleaving_different_operations_must_maintain_correct_internal_state(33);
786 }
787
788 #[test]
789 fn interleaving_push_and_append_operations_must_maintain_correct_internal_state_for_var_sizes_32() {
790 let mut vec_one = $vec::new();
791
792 for i in 0..32 {
793 vec_one.push(i);
794 }
795
796 let mut vec_two = $vec::new();
797
798 for i in 0..1024 {
799 if i % 2 == 0 {
800 vec_two.push(i);
801 } else {
802 vec_two.append(&mut vec_one.clone());
803 }
804
805 for k in 0..vec_two.len() {
806 vec_two.get(k).unwrap();
807 }
808 }
809 }
810
811 #[test]
812 fn zero_sized_values() {
813 let mut v = $vec::new();
814 assert_eq!(v.len(), 0);
815
816 v.push(());
817 assert_eq!(v.len(), 1);
818
819 v.push(());
820 assert_eq!(v.len(), 2);
821 assert_eq!(v.pop(), Some(()));
822 assert_eq!(v.pop(), Some(()));
823 assert_eq!(v.pop(), None);
824
825 assert_eq!(v.len(), 0);
826
827 v.push(());
828 assert_eq!(v.len(), 1);
829
830 v.push(());
831 assert_eq!(v.len(), 2);
832
833 for i in 0..v.len() {
834 v.get(i);
835 }
836 assert_eq!(v.len(), 2);
837
838 v.push(());
839 assert_eq!(v.len(), 3);
840
841 v.push(());
842 assert_eq!(v.len(), 4);
843
844 for i in 0..v.len() {
845 v.get_mut(i);
846 }
847 assert_eq!(v.len(), 4);
848 }
849
850 #[test]
851 fn interleaving_append_split_off_operations() {
852 let mut vec = $vec::new();
853 let mut value = 0;
854
855 for size in 1..(BRANCH_FACTOR * 8 + BRANCH_FACTOR) {
856 let mut another_vec = $vec::new();
857 for _ in 0..size {
858 another_vec.push(value);
859 value += 1;
860 }
861
862 vec.append(&mut another_vec);
863
864 let mid = vec.len() / 2;
865 let mut right = vec.split_off(mid);
866
867 vec.append(&mut right);
868 value = vec.len();
869 }
870
871 for i in 0..value {
872 assert_eq!(vec.get(i).cloned(), Some(i));
873 }
874 }
875
876 #[test]
877 fn split_off_by_one() {
878 let mut vec = $vec::new();
879
880 for i in 0..(BRANCH_FACTOR * BRANCH_FACTOR * BRANCH_FACTOR + (BRANCH_FACTOR / 2)) {
881 vec.push(i);
882 }
883
884 for i in (0..BRANCH_FACTOR * BRANCH_FACTOR * BRANCH_FACTOR + (BRANCH_FACTOR / 2)).rev() {
885 let mut other = vec.split_off(i);
886 assert_eq!(other.pop(), Some(i));
887 }
888
889 assert!(vec.is_empty());
890 }
891 }
892 };
893}
894
895make_tests!(RbVec, rbvec);
896make_tests!(RrbVec, rrbvec);