1#![doc(html_root_url = "https://docs.rs/rle_vec/0.4.1")]
2
3#[cfg(feature = "serde")]
18extern crate serde;
19#[cfg(feature = "serde")]
20#[macro_use]
21extern crate serde_derive;
22
23use std::io;
24use std::iter::FromIterator;
25use std::iter::{once, repeat};
26use std::cmp;
27use std::ops::Index;
28
29#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
126#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
127pub struct RleVec<T> {
128 runs: Vec<InternalRun<T>>,
129}
130
131#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
145pub struct Run<T> {
146 pub len: usize,
148 pub value: T,
150}
151
152#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
153#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
154struct InternalRun<T> {
155 end: usize,
156 value: T,
157}
158
159impl<T> RleVec<T> {
160 pub fn new() -> RleVec<T> {
171 RleVec { runs: Vec::new() }
172 }
173
174 pub fn with_capacity(capacity: usize) -> RleVec<T> {
201 RleVec { runs: Vec::with_capacity(capacity) }
202 }
203
204 pub fn len(&self) -> usize {
217 match self.runs.last() {
218 Some(run) => run.end + 1,
219 None => 0,
220 }
221 }
222
223 pub fn is_empty(&self) -> bool {
235 self.runs.is_empty()
236 }
237
238 pub fn clear(&mut self) {
251 self.runs.clear()
252 }
253
254 pub fn last(&self) -> Option<&T> {
266 match self.runs.last() {
267 Some(last) => Some(&last.value),
268 None => None,
269 }
270 }
271
272 pub fn last_run(&self) -> Option<Run<&T>> {
295 let previous_end = if self.runs.len() >= 2 {
296 self.runs[self.runs.len() - 2].end + 1
297 } else { 0 };
298
299 match self.runs.last() {
300 Some(last) => Some(Run {
301 len: last.end + 1 - previous_end,
302 value: &last.value
303 }),
304 None => None,
305 }
306 }
307
308 pub fn runs_len(&self) -> usize {
325 self.runs.len()
326 }
327
328 pub fn starts(&self) -> Vec<usize> {
344 if self.is_empty() { return Vec::new() }
345 once(0).chain(self.runs.iter().take(self.runs_len() - 1).map(|r| r.end + 1)).collect()
346 }
347
348 pub fn ends(&self) -> Vec<usize> {
350 self.runs.iter().map(|r| r.end).collect()
351 }
352
353 pub fn iter(&self) -> Iter<T> {
373 Iter {
374 rle: self,
375 run_index: 0,
376 index: 0,
377 run_index_back: self.runs.len().saturating_sub(1),
378 index_back: self.len(), }
380 }
381
382 pub fn runs(&self) -> Runs<T> {
401 Runs { rle: self, run_index: 0, last_end: 0 }
402 }
403
404 fn run_index(&self, index: usize) -> usize {
405 match self.runs.binary_search_by(|run| run.end.cmp(&index)) {
406 Ok(i) => i,
407 Err(i) if i < self.runs.len() => i,
408 _ => panic!("index out of bounds: the len is {} but the index is {}", self.len(), index)
409 }
410 }
411
412 fn index_info(&self, index: usize) -> (usize, usize, usize) {
413 match self.run_index(index) {
414 0 => (0, 0, self.runs[0].end),
415 index => (index, self.runs[index - 1].end + 1, self.runs[index].end),
416 }
417 }
418}
419
420impl<T: Eq> RleVec<T> {
421 #[inline]
434 pub fn push(&mut self, value: T) {
435 self.push_n(1, value);
436 }
437
438 pub fn push_n(&mut self, n: usize, value: T) {
453 if n == 0 { return; }
454
455 let end = match self.runs.last_mut() {
456 Some(ref mut last) if last.value == value => return last.end += n,
457 Some(last) => last.end + n,
458 None => n - 1,
459 };
460
461 self.runs.push(InternalRun { value, end });
462 }
463}
464
465impl<T: Clone> RleVec<T> {
466 pub fn to_vec(&self) -> Vec<T> {
481 let mut res = Vec::with_capacity(self.len());
482 let mut p = 0;
483 for r in &self.runs {
484 let n = r.end - p + 1;
485 res.extend(repeat(r.value.clone()).take(n));
486 p += n;
487 }
488 res
489 }
490}
491
492impl<T: Eq + Clone> RleVec<T> {
493 pub fn set(&mut self, index: usize, value: T) {
515 let (mut p, start, end) = self.index_info(index);
516
517 if self.runs[p].value == value { return }
518
519 if end - start == 0 {
521 if p > 0 && self.runs[p - 1].value == value {
523 self.runs.remove(p);
524 self.runs[p - 1].end += 1;
525 p -= 1;
526 }
527 if p < self.runs.len() - 1 && self.runs[p + 1].value == value {
529 self.runs.remove(p);
530 return;
531 }
532 self.runs[p].value = value;
534 return;
535 }
536
537 if index == start {
539 if p > 0 {
541 if self.runs[p - 1].value == value {
542 self.runs[p - 1].end += 1;
543 } else {
544 self.runs.insert(p, InternalRun { value, end: start });
545 }
546 } else {
547 self.runs.insert(0, InternalRun { value, end: 0 });
548 }
549 } else if index == end {
550 self.runs[p].end -= 1;
552
553 if p < self.runs.len() - 1 && self.runs[p + 1].value == value {
555 } else {
556 self.runs.insert(p + 1, InternalRun { value, end });
557 }
558 } else {
559 self.runs[p].end = index - 1;
561 let v = self.runs[p].value.clone();
562 self.runs.insert(p + 1, InternalRun { value, end: index });
565 self.runs.insert(p + 2, InternalRun { value: v, end });
566 }
567 }
568
569 pub fn remove(&mut self, index: usize) -> T {
584 let (p, start, end) = self.index_info(index);
585
586 for run in self.runs[p..].iter_mut() {
587 run.end -= 1;
588 }
589
590 if end - start == 0 {
592 let InternalRun { value, .. } = self.runs.remove(p); if p > 0 && self.runs_len() > 2 && self.runs[p - 1].value == self.runs[p].value {
595 let after_end = self.runs[p].end;
596 self.runs[p - 1].end = after_end;
597 self.runs.remove(p);
598 }
599 value
600 }
601 else { self.runs[p].value.clone() }
602 }
603
604 pub fn insert(&mut self, index: usize, value: T) {
622 if index == self.len() {
623 return self.push(value);
624 }
625
626 let (p, start, end) = self.index_info(index);
627 for run in self.runs[p..].iter_mut() {
629 run.end += 1;
630 }
631
632 if self.runs[p].value == value { return }
633
634 if index == start {
636 if p > 0 && self.runs[p - 1].value == value {
638 self.runs[p - 1].end += 1;
639 } else {
640 self.runs.insert(p, InternalRun { value, end: index });
641 }
642 } else {
643 self.runs[p].end = index - 1;
645 self.runs.insert(p + 1, InternalRun { value, end: index });
646 let value = self.runs[p].value.clone();
647 self.runs.insert(p + 2, InternalRun { value, end: end + 1 });
648 }
649 }
650}
651
652impl<T> Index<usize> for RleVec<T> {
653 type Output = T;
654
655 fn index(&self, index: usize) -> &T {
656 &self.runs[self.run_index(index)].value
657 }
658}
659
660impl<T: Clone> Into<Vec<T>> for RleVec<T> {
661 fn into(self) -> Vec<T> {
662 self.to_vec()
663 }
664}
665
666impl<'a, T: Eq + Clone> From<&'a [T]> for RleVec<T> {
667 fn from(slice: &'a [T]) -> Self {
668 if slice.is_empty() {
669 return RleVec::new()
670 }
671
672 let mut runs = Vec::new();
673 let mut last_value = slice[0].clone();
674 for (i, v) in slice[1..].iter().enumerate() {
675 if *v != last_value {
676 runs.push(InternalRun{
677 end: i,
678 value: last_value,
679 });
680 last_value = v.clone();
681 }
682 }
683
684 runs.push(InternalRun{
685 end: slice.len() - 1,
686 value: last_value,
687 });
688
689 RleVec { runs }
690 }
691}
692
693impl<T: Eq> FromIterator<T> for RleVec<T> {
694 fn from_iter<I>(iter: I) -> Self where I: IntoIterator<Item=T> {
695 let mut rle = RleVec::new();
696 rle.extend(iter);
697 rle
698 }
699}
700
701impl<T: Eq> FromIterator<Run<T>> for RleVec<T> {
702 fn from_iter<I>(iter: I) -> Self where I: IntoIterator<Item=Run<T>> {
703 let iter = iter.into_iter();
704 let (lower, _) = iter.size_hint();
705
706 let mut rle = RleVec::with_capacity(lower);
707 rle.extend(iter);
708 rle
709 }
710}
711
712impl<T> Default for RleVec<T> {
713 fn default() -> Self {
714 RleVec::new()
715 }
716}
717
718impl<T: Eq> Extend<T> for RleVec<T> {
719 fn extend<I>(&mut self, iter: I) where I: IntoIterator<Item=T> {
720 let mut iter = iter.into_iter();
721 if let Some(next_value) = iter.next() {
722 let (pop, end) = if let Some(last_run) = self.runs.last() {
726 if last_run.value == next_value {
727 (true, last_run.end + 1)
728 } else {
729 (false, last_run.end + 1)
730 }
731 } else {
732 (false, 0)
733 };
734
735 let mut rle_last = if pop {
736 let mut run = self.runs.pop().unwrap();
737 run.end = end;
738 run
739 } else {
740 InternalRun { value: next_value, end }
741 };
742
743 for value in iter {
744 if value != rle_last.value {
745 let next_end = rle_last.end;
746 self.runs.push(rle_last);
747 rle_last = InternalRun { value, end: next_end };
748 }
749 rle_last.end += 1;
750 }
751 self.runs.push(rle_last);
752 }
753 }
754}
755
756impl<T: Eq> Extend<Run<T>> for RleVec<T> {
757 fn extend<I>(&mut self, iter: I) where I: IntoIterator<Item=Run<T>> {
758 for Run{ len, value } in iter {
759 self.push_n(len, value)
760 }
761 }
762}
763
764impl io::Write for RleVec<u8> {
765 fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
766 self.extend(buf.iter().cloned());
767 Ok(buf.len())
768 }
769
770 fn write_all(&mut self, buf: &[u8]) -> io::Result<()> {
771 self.extend(buf.iter().cloned());
772 Ok( () )
773 }
774
775 fn flush(&mut self) -> io::Result<()> { Ok( () ) }
776}
777
778pub struct Iter<'a, T: 'a> {
798 rle: &'a RleVec<T>,
799 run_index: usize,
800 index: usize,
801 index_back: usize,
802 run_index_back: usize,
803}
804
805impl<'a, T: 'a> IntoIterator for &'a RleVec<T> {
806 type Item = &'a T;
807 type IntoIter = Iter<'a, T>;
808
809 fn into_iter(self) -> Self::IntoIter {
810 Iter {
811 rle: self,
812 run_index: 0,
813 index: 0,
814 run_index_back: self.runs.len().saturating_sub(1),
815 index_back: self.len(), }
817 }
818}
819
820impl<'a, T: 'a> Iterator for Iter<'a, T> {
821 type Item = &'a T;
822
823 fn next(&mut self) -> Option<Self::Item> {
824 if self.index == self.index_back {
825 return None
826 }
827 let run = &self.rle.runs[self.run_index];
828 self.index += 1;
829 if self.index > run.end {
830 self.run_index += 1;
831 }
832 Some(&run.value)
833 }
834
835 fn size_hint(&self) -> (usize, Option<usize>) {
836 let len = self.rle.len() - self.index;
837 (len, Some(len))
838 }
839
840 fn count(self) -> usize {
841 self.len()
843 }
844
845 fn last(self) -> Option<Self::Item> {
846 if self.index == self.rle.len() {
847 return None
848 }
849 self.rle.last()
850 }
851
852 fn nth(&mut self, n: usize) -> Option<Self::Item> {
853 self.index = cmp::min(self.index + n, self.rle.len());
854 self.run_index = if self.index < self.rle.len() {
855 self.rle.run_index(self.index)
856 } else {
857 self.rle.runs.len() - 1
858 };
859 self.next()
860 }
861}
862
863impl<'a, T: 'a> ExactSizeIterator for Iter<'a, T> { }
864
865impl<'a, T: 'a> DoubleEndedIterator for Iter<'a, T> {
866 fn next_back(&mut self) -> Option<Self::Item> {
867 if self.index_back == self.index {
868 return None
869 }
870 self.index_back -= 1;
871 if self.run_index_back > 0 && self.index_back <= self.rle.runs[self.run_index_back - 1].end {
872 self.run_index_back -= 1;
873 }
874 Some(&self.rle.runs[self.run_index_back].value)
875 }
876}
877
878pub struct Runs<'a, T:'a> {
896 rle: &'a RleVec<T>,
897 run_index: usize,
898 last_end: usize,
899}
900
901impl<'a, T: 'a> Iterator for Runs<'a, T> {
902 type Item = Run<&'a T>;
903
904 fn next(&mut self) -> Option<Self::Item> {
905 if self.run_index == self.rle.runs.len() {
906 return None
907 }
908 let &InternalRun { ref value, end } = self.rle.runs.index(self.run_index);
909 let len = end - self.last_end + 1;
910 self.run_index += 1;
911 self.last_end = end + 1;
912 Some(Run { len, value })
913 }
914
915 fn size_hint(&self) -> (usize, Option<usize>) {
916 let len = self.rle.runs.len() - self.run_index;
917 (len, Some(len))
918 }
919
920 fn count(self) -> usize {
921 self.len()
923 }
924
925 fn last(self) -> Option<Self::Item> {
926 if self.run_index == self.rle.runs.len() {
927 return None
928 }
929 self.rle.last_run()
930 }
931
932 fn nth(&mut self, n: usize) -> Option<Self::Item> {
933 self.run_index = cmp::min(self.run_index + n, self.rle.runs.len());
934 self.last_end = if self.run_index != 0 {
935 self.rle.runs[self.run_index - 1].end + 1
936 } else { 0 };
937 self.next()
938 }
939}
940
941impl<'a, T: 'a> ExactSizeIterator for Runs<'a, T> { }
942
943#[cfg(test)]
944mod tests {
945 use super::*;
946
947 #[test]
948 fn rare_usage() {
949 let rle: RleVec<i32> = RleVec::from(&[][..]);
952 assert_eq!(rle.to_vec(), vec![]);
953 let runs: Vec<_> = rle.runs().collect();
954 assert_eq!(runs, vec![]);
955
956 let rle: RleVec<i32> = RleVec::from(&[1][..]);
957 assert_eq!(rle.to_vec(), vec![1]);
958 let runs: Vec<_> = rle.runs().collect();
959 assert_eq!(runs, vec![Run{ len: 1, value: &1 }]);
960
961 let rle: RleVec<i32> = RleVec::from(&[1, 2][..]);
962 assert_eq!(rle.to_vec(), vec![1, 2]);
963 let runs: Vec<_> = rle.runs().collect();
964 assert_eq!(runs, vec![Run{ len: 1, value: &1 }, Run { len: 1, value: &2 }]);
965
966 let rle: RleVec<i32> = RleVec::from(&[1, 1][..]);
967 assert_eq!(rle.to_vec(), vec![1, 1]);
968 let runs: Vec<_> = rle.runs().collect();
969 assert_eq!(runs, vec![Run{ len: 2, value: &1 }]);
970
971 let rle: RleVec<i32> = RleVec::from_iter(0..0);
974 assert_eq!(rle.to_vec(), vec![]);
975 let runs: Vec<_> = rle.runs().collect();
976 assert_eq!(runs, vec![]);
977
978 let rle: RleVec<i32> = RleVec::from_iter(1..2);
979 assert_eq!(rle.to_vec(), vec![1]);
980 let runs: Vec<_> = rle.runs().collect();
981 assert_eq!(runs, vec![Run{ len: 1, value: &1 }]);
982
983 let rle: RleVec<i32> = RleVec::from_iter(1..3);
984 assert_eq!(rle.to_vec(), vec![1, 2]);
985 let runs: Vec<_> = rle.runs().collect();
986 assert_eq!(runs, vec![Run{ len: 1, value: &1 }, Run { len: 1, value: &2 }]);
987
988 use std::iter::repeat;
989 let rle: RleVec<i32> = RleVec::from_iter(repeat(1).take(2));
990 assert_eq!(rle.to_vec(), vec![1, 1]);
991 let runs: Vec<_> = rle.runs().collect();
992 assert_eq!(runs, vec![Run{ len: 2, value: &1 }]);
993 }
994
995 #[test]
996 fn basic_usage() {
997 let mut rle = RleVec::<i64>::new();
998 rle.push(1);
999 rle.push(1);
1000 rle.push(1);
1001 rle.push(1);
1002 rle.push(2);
1003 rle.push(2);
1004 rle.push(2);
1005 rle.push(3);
1006 rle.push(3);
1007 rle.push(4);
1008 assert_eq!(rle.len(), 10);
1009 assert_eq!(rle.runs_len(), 4);
1010
1011 rle.push_n(3, 4);
1012 assert_eq!(rle.len(), 13);
1013 assert_eq!(rle.runs_len(), 4);
1014 assert_eq!(rle.last(), Some(&4));
1015 rle.push_n(3, 5);
1016 assert_eq!(rle.len(), 16);
1017 assert_eq!(rle.runs_len(), 5);
1018 assert_eq!(rle.last(), Some(&5));
1019 assert_eq!(rle.last_run(), Some(Run {value: &5, len: 3}));
1020 rle.clear();
1021 assert_eq!(rle.len(), 0);
1022 assert_eq!(rle.runs_len(), 0);
1023 assert_eq!(rle.last(), None);
1024 assert_eq!(rle.last_run(), None);
1025
1026 let mut rle = RleVec::default();
1027 rle.push(1);
1028 assert_eq!(rle.len(), 1);
1029 }
1030
1031 #[test]
1032 fn setting_values() {
1033 let mut rle = RleVec::<i64>::new();
1034 rle.push(1);
1035 rle.set(0, 10);
1036 assert_eq!(rle.len(), 1);
1037 assert_eq!(rle.runs_len(), 1);
1038 assert_eq!(rle[0], 10);
1039
1040 let mut rle = RleVec::from(&[1, 1, 1, 1, 2, 2, 2, 3, 3, 4, 5][..]);
1041 assert_eq!(rle.to_vec(), vec![1,1,1,1,2,2,2,3,3,4, 5]);
1042
1043 rle.set(0, 1);
1046 assert_eq!(rle.to_vec(), vec![1,1,1,1,2,2,2,3,3,4, 5]);
1047 rle.set(2, 1);
1048 assert_eq!(rle.to_vec(), vec![1,1,1,1,2,2,2,3,3,4, 5]);
1049 rle.set(4, 2);
1050 assert_eq!(rle.to_vec(), vec![1,1,1,1,2,2,2,3,3,4, 5]);
1051 rle.set(6, 2);
1052 assert_eq!(rle.to_vec(), vec![1,1,1,1,2,2,2,3,3,4, 5]);
1053 rle.set(9, 4);
1055 assert_eq!(rle.to_vec(), vec![1,1,1,1,2,2,2,3,3,4, 5]);
1056 rle.set(10, 5);
1057 assert_eq!(rle.to_vec(), vec![1,1,1,1,2,2,2,3,3,4, 5]);
1058
1059 rle.set(0, 2);
1062 assert_eq!(rle.to_vec(), vec![2,1,1,1,2,2,2,3,3,4, 5]);
1063 rle.set(2, 2);
1064 assert_eq!(rle.to_vec(), vec![2,1,2,1,2,2,2,3,3,4, 5]);
1065 rle.set(4, 3);
1066 assert_eq!(rle.to_vec(), vec![2,1,2,1,3,2,2,3,3,4, 5]);
1067 rle.set(8, 7);
1068 assert_eq!(rle.to_vec(), vec![2,1,2,1,3,2,2,3,7,4, 5]);
1069 rle.set(0, 3);
1071 assert_eq!(rle.to_vec(), vec![3,1,2,1,3,2,2,3,7,4, 5]);
1072 rle.set(3, 4);
1073 assert_eq!(rle.to_vec(), vec![3,1,2,4,3,2,2,3,7,4, 5]);
1074 rle.set(10, 7);
1075 assert_eq!(rle.to_vec(), vec![3,1,2,4,3,2,2,3,7,4, 7]);
1076 assert_eq!(rle.runs_len(), 10);
1077
1078 rle.set(0, 1);
1080 assert_eq!(rle.to_vec(), vec![1,1,2,4,3,2,2,3,7,4, 7]);
1081 assert_eq!(rle.runs_len(), 9);
1082 rle.set(5, 3);
1083 assert_eq!(rle.runs_len(), 9);
1084 rle.set(6, 3);
1085 assert_eq!(rle.to_vec(), vec![1,1,2,4,3,3,3,3,7,4, 7]);
1086 assert_eq!(rle.runs_len(), 7);
1087 rle.set(10, 4);
1088 assert_eq!(rle.to_vec(), vec![1,1,2,4,3,3,3,3,7,4, 4]);
1089 assert_eq!(rle.runs_len(), 6);
1090 }
1091
1092 #[test]
1093 fn removing_values() {
1094 let mut rle = RleVec::from(&[1, 1, 1, 1, 1, 2, 1, 1, 1, 4, 4, 3, 3][..]);
1095 assert_eq!(rle.len(), 13);
1096 assert_eq!(rle.runs_len(), 5);
1097
1098 let value = rle.remove(5);
1099 assert_eq!(value, 2);
1100 assert_eq!(rle.len(), 12);
1101 assert_eq!(rle.runs_len(), 3);
1102 assert_eq!(rle.to_vec(), vec![1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 3, 3]);
1103
1104 let value = rle.remove(7);
1105 assert_eq!(value, 1);
1106 assert_eq!(rle.len(), 11);
1107 assert_eq!(rle.runs_len(), 3);
1108 assert_eq!(rle.to_vec(), vec![1, 1, 1, 1, 1, 1, 1, 4, 4, 3, 3]);
1109
1110 let value = rle.remove(10);
1111 assert_eq!(value, 3);
1112 assert_eq!(rle.len(), 10);
1113 assert_eq!(rle.runs_len(), 3);
1114 assert_eq!(rle.to_vec(), vec![1, 1, 1, 1, 1, 1, 1, 4, 4, 3]);
1115 }
1116
1117 #[test]
1118 fn inserting_values() {
1119 let mut v = vec![0,0,0,1,1,1,1,1,1,1,3,3,1,0,99,99,9];
1120 let mut rle = RleVec::from(&v[..]);
1121 rle.insert(0,1);
1122 v.insert(0,1);
1123 assert_eq!((0..rle.len()).map(|i| rle[i]).collect::<Vec<_>>(), v);
1124 assert_eq!(rle.len(),18);
1125 rle.insert(18,9);
1126 v.insert(18,9);
1127 assert_eq!((0..rle.len()).map(|i| rle[i]).collect::<Vec<_>>(), v);
1128 rle.insert(19,10);
1129 v.insert(19,10);
1130 assert_eq!((0..rle.len()).map(|i| rle[i]).collect::<Vec<_>>(), v);
1131
1132 rle.insert(2,0);
1133 v.insert(2,0);
1134 assert_eq!((0..rle.len()).map(|i| rle[i]).collect::<Vec<_>>(), v);
1135 assert_eq!(rle.runs_len(), 9);
1136
1137 rle.insert(8,0);
1138 v.insert(8,0);
1139 assert_eq!((0..rle.len()).map(|i| rle[i]).collect::<Vec<_>>(), v);
1140 assert_eq!(rle.runs_len(), 11);
1141
1142 rle.insert(13,4);
1143 v.insert(13,4);
1144 assert_eq!((0..rle.len()).map(|i| rle[i]).collect::<Vec<_>>(), v);
1145 assert_eq!(rle.runs_len(), 12);
1146
1147 let v = vec![0,0,0,1,1,1,1,2,2,3];
1148 let mut rle: RleVec<_> = v.into_iter().collect();
1149 rle.set(1,2);
1150 assert_eq!(rle.iter().cloned().collect::<Vec<_>>(), vec![0,2,0,1,1,1,1,2,2,3]);
1151 rle.insert(4,4);
1152 assert_eq!(rle.iter().cloned().collect::<Vec<_>>(), vec![0,2,0,1,4,1,1,1,2,2,3]);
1153 rle.insert(7,1);
1154 assert_eq!(rle.iter().cloned().collect::<Vec<_>>(), vec![0,2,0,1,4,1,1,1,1,2,2,3]);
1155 rle.insert(8,8);
1156 assert_eq!(rle.iter().cloned().collect::<Vec<_>>(), vec![0,2,0,1,4,1,1,1,8,1,2,2,3]);
1157 }
1158
1159 #[test]
1160 fn from_slice() {
1161 let v = vec![0,0,0,1,1,1,1,1,1,1,3,3,1,0,99,99,9];
1162 let rle = RleVec::from(&v[..]);
1163 assert_eq!((0..v.len()).map(|i| rle[i]).collect::<Vec<_>>(), v);
1164 assert_eq!(rle.len(),17);
1165
1166 let v2: Vec<_> = rle.into();
1167 assert_eq!(v2,v);
1168 }
1169
1170 #[test]
1171 fn iterators() {
1172 let v = vec![0,0,0,1,1,1,1,1,1,1,3,3,123,0,90,90,99];
1173 let rle = v.iter().cloned().collect::<RleVec<_>>();
1174 assert_eq!((0..v.len()).map(|i| rle[i]).collect::<Vec<_>>(), v);
1175 assert_eq!(rle.len(), 17);
1176
1177 assert_eq!(rle.iter().cloned().collect::<Vec<_>>(), v);
1178 assert_eq!(RleVec::<i64>::new().iter().next(), None);
1179
1180 let v2 = (0..100).collect::<Vec<usize>>();
1181 let rle2 = v2.iter().cloned().collect::<RleVec<_>>();
1182 assert_eq!(rle2.iter().cloned().collect::<Vec<_>>(), v2);
1183 assert_eq!(rle2.iter().skip(0).cloned().collect::<Vec<_>>(), v2);
1184
1185 assert_eq!(rle2.iter().nth(0), Some(&0));
1186 assert_eq!(rle2.iter().nth(5), Some(&5));
1187 assert_eq!(rle2.iter().nth(99), Some(&99));
1188 assert_eq!(rle2.iter().nth(100), None);
1189 let mut it = rle2.iter();
1190 it.nth(0);
1191 assert_eq!(it.nth(0), Some(&1));
1192
1193 assert_eq!(rle.iter().nth(3), Some(&1));
1194 assert_eq!(rle.iter().nth(14), Some(&90));
1195 assert_eq!(rle.iter().nth(15), Some(&90));
1196
1197 assert_eq!(rle.iter().skip(2).next(), Some(&0));
1198 assert_eq!(rle.iter().skip(3).next(), Some(&1));
1199
1200 assert_eq!(rle.iter().max(), Some(&123));
1201 assert_eq!(rle.iter().min(), Some(&0));
1202 assert_eq!(rle.iter().skip(13).max(), Some(&99));
1203 assert_eq!(rle.iter().skip(13).min(), Some(&0));
1204 assert_eq!(rle.iter().skip(13).take(2).max(), Some(&90));
1205 assert_eq!(rle.iter().skip(13).take(2).min(), Some(&0));
1206
1207 assert_eq!(rle.iter().count(), 17);
1208 assert_eq!(rle.iter().skip(10).last(), Some(&99));
1209 assert_eq!(rle.iter().skip(30).last(), None);
1210
1211 assert_eq!(rle.runs().map(|r| r.value).collect::<Vec<_>>(), vec![&0,&1,&3,&123,&0,&90,&99]);
1213 assert_eq!(rle.runs().map(|r| r.len).collect::<Vec<_>>(), vec![3,7,2,1,1,2,1]);
1214
1215 let mut copy = RleVec::new();
1216 for r in rle.runs() {
1217 copy.push_n(r.len, r.value.clone());
1218 }
1219 assert_eq!(copy.iter().cloned().collect::<Vec<_>>(), v);
1220 let copy2: RleVec<i32> = rle.runs().map(|r| Run { value: r.value.clone(), len: r.len }).collect();
1221 assert_eq!(copy2.iter().cloned().collect::<Vec<_>>(), v);
1222 }
1223
1224 #[test]
1225 fn back_iterators() {
1226 let rle = RleVec::from(&[0,1,1,3,3,9,99][..]);
1227
1228 let mut iter = rle.iter();
1230 assert_eq!(iter.next_back(), Some(&99));
1231 assert_eq!(iter.next_back(), Some(&9));
1232 assert_eq!(iter.next_back(), Some(&3));
1233 assert_eq!(iter.next_back(), Some(&3));
1234 assert_eq!(iter.next_back(), Some(&1));
1235 assert_eq!(iter.next_back(), Some(&1));
1236 assert_eq!(iter.next_back(), Some(&0));
1237 assert_eq!(iter.next_back(), None);
1238
1239 let mut iter = rle.iter();
1241 assert_eq!(iter.next_back(), Some(&99));
1242 assert_eq!(iter.next(), Some(&0));
1243 assert_eq!(iter.next(), Some(&1));
1244 assert_eq!(iter.next_back(), Some(&9));
1245 assert_eq!(iter.next_back(), Some(&3));
1246 assert_eq!(iter.next_back(), Some(&3));
1247 assert_eq!(iter.next(), Some(&1));
1248 assert_eq!(iter.next_back(), None);
1249 assert_eq!(iter.next(), None);
1250
1251 let rle = RleVec::from(&[0][..]);
1253 let mut iter = rle.iter();
1254 assert_eq!(iter.next_back(), Some(&0));
1255 assert_eq!(iter.next(), None);
1256
1257 let rle = RleVec::<i32>::from(&[][..]);
1258 let mut iter = rle.iter();
1259 assert_eq!(iter.next_back(), None);
1260 assert_eq!(iter.next(), None);
1261 }
1262
1263 #[test]
1264 fn run_iters() {
1265 let rle = RleVec::from(&[1,1,1,1,1,2,2,2,2,3,3,3,5,5,5,5][..]);
1266
1267 let mut iterator = rle.runs();
1268
1269 assert_eq!(iterator.next(), Some(Run{ len: 5, value: &1 }));
1270 assert_eq!(iterator.next(), Some(Run{ len: 4, value: &2 }));
1271 assert_eq!(iterator.next(), Some(Run{ len: 3, value: &3 }));
1272 assert_eq!(iterator.next(), Some(Run{ len: 4, value: &5 }));
1273 assert_eq!(iterator.next(), None);
1274 assert_eq!(iterator.next(), None);
1275
1276 let mut iterator = rle.runs();
1277
1278 assert_eq!(iterator.nth(0), Some(Run{ len: 5, value: &1 }));
1279 assert_eq!(iterator.nth(0), Some(Run{ len: 4, value: &2 }));
1280 assert_eq!(iterator.nth(0), Some(Run{ len: 3, value: &3 }));
1281 assert_eq!(iterator.nth(0), Some(Run{ len: 4, value: &5 }));
1282 assert_eq!(iterator.nth(0), None);
1283
1284 let mut iterator = rle.runs();
1285
1286 assert_eq!(iterator.nth(0), Some(Run{ len: 5, value: &1 }));
1287 assert_eq!(iterator.nth(1), Some(Run{ len: 3, value: &3 }));
1288 assert_eq!(iterator.nth(0), Some(Run{ len: 4, value: &5 }));
1289 assert_eq!(iterator.nth(0), None);
1290
1291 assert_eq!(rle.runs().count(), 4);
1292 assert_eq!(rle.runs().last(), Some(Run{ len: 4, value: &5 }));
1293 assert_eq!(rle.runs().skip(10).last(), None);
1294
1295 }
1296
1297 #[test]
1298 fn starts_ends() {
1299 let v = vec![0,0,0,1,1,1,1,1,1,1,3,3,1,0,99,99,9];
1300 let rle = v.iter().cloned().collect::<RleVec<_>>();
1301 assert_eq!(rle.starts(), vec![0,3,10,12,13,14,16]);
1302 assert_eq!(rle.ends(), vec![2,9,11,12,13,15,16]);
1303
1304 let rle = RleVec::<i64>::new();
1305 assert!(rle.starts().is_empty());
1306 assert!(rle.ends().is_empty());
1307 }
1308
1309 #[test]
1310 fn write_trait() {
1311 use std::io::Write;
1312 let data_in = vec![1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3];
1313 let mut rle = RleVec::new();
1314 rle.write_all(data_in.as_slice()).unwrap();
1315 assert_eq!(rle.runs_len(),3);
1316 assert_eq!(rle.len(),11);
1317
1318 rle.write(&data_in[6..]).unwrap();
1319 assert_eq!(rle.runs_len(),5);
1320 assert_eq!(rle.len(),16);
1321
1322 rle.write(&[3,3,3]).unwrap();
1323 assert_eq!(rle.runs_len(),5);
1324 assert_eq!(rle.len(),19);
1325 }
1326}