Skip to main content

pvec/core/
mod.rs

1//! A module providing persistent vector types based on RrbTree.
2
3#[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/// A persistent vector based on the balanced RbTree.
79#[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/// A persistent vector based on the relaxed RrbTree.
87#[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            /// Constructs a new, empty vector.
104            /// The vector allocates a buffer equal to
105            /// the selected branching factor size.
106            pub fn new() -> Self {
107                $vec {
108                    tree: RrbTree::new(),
109                    tail: new_branch!(),
110                    tail_len: 0,
111                }
112            }
113
114            /// Adds an element to the back of a collection.
115            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            /// Removes the last element from a vector and
133            /// returns it, or None if it is empty.
134            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            /// Returns a reference to an element at the given
153            /// position or None if out of bounds.
154            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            /// Returns a mutable reference to an element at the given
163            /// position or None if out of bounds.
164            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            /// Returns the number of elements in the vector.
173            pub fn len(&self) -> usize {
174                self.tree.len() + self.tail_len
175            }
176
177            /// Returns true if the vector has a length of 0.
178            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    /// Splits the collection into two at the given index.
216    ///
217    /// Returns a newly allocated vector containing the elements
218    /// in the range [at, len). After the call, the original vector
219    /// will be left containing the elements [0, at).
220    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    /// Moves all the elements of `that` into
284    /// `Self`, leaving `other` empty.
285    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    /// Splits the collection into two at the given index.
314    ///
315    /// Returns a vector containing the elements in the range [at, len).
316    /// After the call, the original vector will be left
317    /// containing the elements [0, at).
318    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                        // all values can fit into a single tail
339                        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                        // root is leaf, but it is not fully dense
350                        // hence, some of the values should be redistributed to the actual leaf
351
352                        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    /// Moves all the elements of `that` into `Self` by concatenating
405    /// the underlying tree structures, leaving `other` empty.
406    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                // the second half ought to be untouched
582                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);