1extern crate alloc;
2
3use core::ops::RangeBounds;
4use std::assert_eq;
5use std::fmt::Display;
6
7use crate::generic_impl::gap_buffer::MAX_STRING_SIZE;
8use crate::rle::Sliceable;
9use crate::{BTree, BTreeTrait, LeafIndex, LengthFinder, QueryResult};
10
11use super::gap_buffer::GapBuffer;
12use super::len_finder::UseLengthFinder;
13
14#[derive(Debug)]
15struct RopeTrait;
16
17#[derive(Debug)]
18struct Cursor {
19 pos: usize,
20 leaf: LeafIndex,
21}
22
23#[derive(Debug)]
25pub struct Rope {
26 tree: BTree<RopeTrait>,
27 cursor: Option<Cursor>,
28}
29
30impl UseLengthFinder<RopeTrait> for RopeTrait {
31 #[inline(always)]
32 fn get_len(cache: &<Self as BTreeTrait>::Cache) -> usize {
33 *cache as usize
34 }
35}
36
37impl Rope {
38 #[inline(always)]
39 pub fn len(&self) -> usize {
40 self.tree.root_cache as usize
41 }
42
43 #[inline(always)]
44 pub fn is_empty(&self) -> bool {
45 self.tree.root_cache == 0
46 }
47
48 pub fn insert(&mut self, index: usize, elem: &str) {
49 if index > self.len() {
50 panic!("index {} out of range len={}", index, self.len());
51 }
52
53 if self.is_empty() {
54 for chunk in GapBuffer::from_str(elem) {
55 self.tree.push(chunk);
56 }
57 return;
58 }
59
60 if let Some(Cursor { pos, leaf }) = self.cursor {
61 if pos <= index {
62 let node = self.tree.leaf_nodes.get(leaf.0).unwrap();
63 if index <= pos + node.elem.len() {
64 let mut success = true;
65 let offset = index - pos;
66 let valid = self
67 .tree
68 .update_leaf(leaf, |leaf| {
69 if leaf.len() + elem.len() < MAX_STRING_SIZE {
70 leaf.insert_bytes(offset, elem.as_bytes()).unwrap();
71 (true, None, None)
72 } else {
73 let mut right = leaf.split(offset);
74 if leaf.len() + elem.len() < MAX_STRING_SIZE {
75 success = leaf.push_bytes(elem.as_bytes()).is_ok();
76 } else {
77 success = right.insert_bytes(0, elem.as_bytes()).is_ok();
78 }
79
80 (true, Some(right), None)
81 }
82 })
83 .0;
84
85 if !valid {
86 self.cursor = None;
87 }
88
89 if success {
90 return;
91 }
92 }
93 }
94 }
95
96 let (q, f) = self.tree.query_with_finder_return::<LengthFinder>(&index);
97 self.cursor = q.and_then(|q| {
98 if q.offset() == 0 {
99 if f.slot == 0 || f.parent.is_none() {
100 None
101 } else {
102 let node = self.tree.in_nodes.get(f.parent.unwrap()).unwrap();
103 let child = &node.children[f.slot as usize - 1];
104 Some(Cursor {
105 pos: index - child.cache as usize,
106 leaf: child.arena.unwrap().into(),
107 })
108 }
109 } else {
110 Some(Cursor {
111 pos: index - q.offset(),
112 leaf: q.leaf(),
113 })
114 }
115 });
116
117 self.tree
118 .insert_many_by_cursor(q.map(|x| x.cursor), GapBuffer::from_str(elem));
119 }
120
121 pub fn delete_range(&mut self, range: impl RangeBounds<usize>) {
122 if self.is_empty() {
123 return;
124 }
125
126 let start = match range.start_bound() {
127 core::ops::Bound::Included(x) => *x,
128 core::ops::Bound::Excluded(x) => *x + 1,
129 core::ops::Bound::Unbounded => 0,
130 };
131 let end = match range.end_bound() {
132 core::ops::Bound::Included(&x) => x + 1,
133 core::ops::Bound::Excluded(&x) => x,
134 core::ops::Bound::Unbounded => self.len(),
135 };
136 let end = end.min(self.len());
137 let start = start.min(end);
138 if start == end {
139 return;
140 }
141
142 if let Some(Cursor { pos, leaf }) = self.cursor {
143 if pos <= start {
144 let node = self.tree.leaf_nodes.get(leaf.0).unwrap();
145 if end <= pos + node.elem.len() {
146 let start_offset = start - pos;
147 let end_offset = end - pos;
148 let valid = self
149 .tree
150 .update_leaf(leaf, |leaf| {
151 leaf.delete(start_offset..end_offset);
152 (true, None, None)
153 })
154 .0;
155
156 if !valid {
157 self.cursor = None;
158 }
159
160 return;
161 }
162 }
163 }
164
165 if end - start == 1 {
166 let q = self
167 .tree
168 .update_leaf_by_search::<LengthFinder>(&start, |leaf, pos| {
169 leaf.delete(pos.cursor.offset..pos.cursor.offset + 1);
170 Some((-1, None, None))
171 });
172 self.cursor = q.0.map(|q| Cursor {
173 pos: start - q.offset,
174 leaf: q.leaf,
175 });
176
177 return;
178 }
179
180 self.cursor = None;
181 let from = self.tree.query::<LengthFinder>(&start);
182 let to = self.tree.query::<LengthFinder>(&end);
183 match (from, to) {
184 (Some(from), Some(to)) if from.cursor.leaf == to.cursor.leaf => {
185 let leaf = self.tree.leaf_nodes.get_mut(from.arena()).unwrap();
186 if from.cursor.offset == 0 && to.cursor.offset == leaf.elem.len() {
187 self.tree.remove_leaf(from.cursor);
189 } else {
190 leaf.elem.delete(from.cursor.offset..to.cursor.offset);
191 self.tree.recursive_update_cache(
192 from.leaf().into(),
193 true,
194 Some(start as isize - end as isize),
195 );
196 }
197 }
198 _ => {
199 crate::iter::Drain::new(&mut self.tree, from, to);
200 }
201 }
202 }
203
204 fn iter(&self) -> impl Iterator<Item = &GapBuffer> {
205 let mut node_iter = self
206 .tree
207 .first_path()
208 .map(|first| crate::iter::Iter::new(&self.tree, first, self.tree.last_path().unwrap()));
209 std::iter::from_fn(move || match &mut node_iter {
210 Some(node_iter) => {
211 if let Some(node) = node_iter.next() {
212 Some(&node.1.elem)
213 } else {
214 None
215 }
216 }
217 None => None,
218 })
219 }
220
221 pub fn slice(&mut self, _range: impl RangeBounds<usize>) {
222 unimplemented!()
223 }
224
225 pub fn new() -> Self {
226 Self {
227 tree: BTree::new(),
228 cursor: None,
229 }
230 }
231
232 #[allow(unused)]
233 fn node_len(&self) -> usize {
234 self.tree.node_len()
235 }
236
237 #[allow(unused)]
238 fn update_in_place(&mut self, pos: usize, new: &str) {
239 todo!()
240 }
241
242 pub fn clear(&mut self) {
243 self.tree.clear();
244 }
245
246 #[allow(unused)]
247 pub fn check(&self) {
248 self.tree.check()
250 }
251
252 pub fn diagnose(&self) {
253 self.tree.diagnose_balance();
254 }
255}
256
257impl Default for Rope {
258 fn default() -> Self {
259 Self::new()
260 }
261}
262
263impl Display for Rope {
264 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
265 let mut ans = Vec::with_capacity(self.len());
266 for elem in self.iter() {
267 let (left, right) = elem.as_bytes();
268 ans.extend_from_slice(left);
269 ans.extend_from_slice(right);
270 }
271
272 f.write_str(std::str::from_utf8(ans.as_slice()).unwrap())
273 }
274}
275
276impl BTreeTrait for RopeTrait {
277 type Elem = GapBuffer;
278 type Cache = isize;
279 type CacheDiff = isize;
280
281 #[inline(always)]
282 fn calc_cache_internal(cache: &mut Self::Cache, caches: &[crate::Child<Self>]) -> isize {
283 let new_cache = caches.iter().map(|x| x.cache).sum::<isize>();
284 let diff = new_cache - *cache;
285 *cache = new_cache;
286 diff
287 }
288
289 #[inline(always)]
290 fn apply_cache_diff(cache: &mut Self::Cache, diff: &Self::CacheDiff) {
291 *cache += *diff;
292 }
293
294 #[inline(always)]
295 fn merge_cache_diff(diff1: &mut Self::CacheDiff, diff2: &Self::CacheDiff) {
296 *diff1 += diff2;
297 }
298
299 #[inline(always)]
300 fn get_elem_cache(elem: &Self::Elem) -> Self::Cache {
301 elem.len() as isize
302 }
303
304 #[inline(always)]
305 fn new_cache_to_diff(cache: &Self::Cache) -> Self::CacheDiff {
306 *cache
307 }
308
309 fn sub_cache(cache_lhs: &Self::Cache, cache_rhs: &Self::Cache) -> Self::CacheDiff {
310 cache_lhs - cache_rhs
311 }
312}
313
314#[allow(unused)]
315fn test_prev_length(rope: &Rope, q: QueryResult) -> usize {
316 let mut count = 0;
317 rope.tree
318 .visit_previous_caches(q.cursor(), |cache| match cache {
319 crate::PreviousCache::NodeCache(cache) => {
320 count += *cache as usize;
321 }
322 crate::PreviousCache::PrevSiblingElem(p) => {
323 count += p.len();
324 }
325 crate::PreviousCache::ThisElemAndOffset { offset, .. } => {
326 count += offset;
327 }
328 });
329 count
330}
331
332#[allow(unused)]
333fn test_index(rope: &Rope) {
334 for index in 0..rope.len() {
335 let q = rope.tree.query::<LengthFinder>(&index).unwrap();
336 let i = test_prev_length(rope, q);
337 assert_eq!(i, index);
338 }
339}
340
341#[cfg(test)]
342mod test {
343
344 use Action::*;
345
346 use crate::HeapVec;
347
348 use super::*;
349
350 #[test]
351 fn test() {
352 let mut rope = Rope::new();
353 rope.insert(0, "123");
354 assert_eq!(rope.len(), 3);
355 rope.insert(1, "x");
356 test_index(&rope);
357 assert_eq!(rope.len(), 4);
358 rope.delete_range(2..4);
359 assert_eq!(&rope.to_string(), "1x");
360 rope.delete_range(..1);
361 assert_eq!(&rope.to_string(), "x");
362 rope.delete_range(..);
363 assert_eq!(&rope.to_string(), "");
364 assert_eq!(rope.len(), 0);
365 }
366
367 #[test]
368 fn test_delete_middle() {
369 let mut rope = Rope::new();
370 rope.insert(0, "135");
371 rope.delete_range(1..2);
372 assert_eq!(&rope.to_string(), "15");
373 }
374
375 #[test]
376 fn test_insert_repeatedly() {
377 let mut rope = Rope::new();
378 rope.insert(0, "123");
379 rope.insert(1, "x");
380 rope.insert(2, "y");
381 rope.insert(3, "z");
382 test_index(&rope);
383 assert_eq!(&rope.to_string(), "1xyz23");
384 }
385
386 #[test]
387 #[ignore]
388 fn test_update() {
389 let mut rope = Rope::new();
390 rope.insert(0, "123");
391 rope.insert(3, "xyz");
392 rope.update_in_place(1, "kkkk");
393 assert_eq!(&rope.to_string(), "1kkkkz");
394 }
395
396 #[test]
397 fn test_clear() {
398 let mut rope = Rope::new();
399 rope.insert(0, "123");
400 assert_eq!(rope.len(), 3);
401 rope.clear();
402 assert_eq!(rope.len(), 0);
403 assert_eq!(&rope.to_string(), "");
404 rope.insert(0, "kkk");
405 assert_eq!(&rope.to_string(), "kkk");
406 }
407
408 #[test]
409 fn test_insert_many() {
410 let mut rope = Rope::new();
411 let s = "_12345678_".repeat(10);
412 let mut expected = String::new();
413 for i in 0..100 {
414 expected.insert_str(i, &s);
415 rope.insert(i, &s);
416 assert_eq!(&rope.to_string(), &expected)
417 }
418 }
419
420 #[test]
421 fn test_repeat_insert() {
422 let mut rope = Rope::new();
423 rope.insert(0, "123");
424 for _ in 0..10000 {
425 rope.insert(rope.len() / 2, "k");
426 }
427 }
428
429 #[test]
430 #[ignore]
431 fn test_update_1() {
432 let mut rope = Rope::new();
433 for i in 0..100 {
434 rope.insert(i, &(i % 10).to_string());
435 }
436
437 rope.update_in_place(15, "kkkkk");
438 assert_eq!(&rope.to_string()[10..20], "01234kkkkk");
439 test_index(&rope);
440 }
441
442 #[derive(Debug)]
443 enum Action {
444 Insert { pos: u8, content: u8 },
445 Delete { pos: u8, len: u8 },
446 }
447
448 fn fuzz(data: HeapVec<Action>) {
449 let mut rope = Rope::new();
450 let mut truth = String::new();
451 for action in data {
452 match action {
453 Action::Insert { pos, content } => {
454 let pos = pos as usize % (truth.len() + 1);
455 let s = content.to_string();
456 dbg!("INS", pos, &s);
457 dbg!(&rope);
458 truth.insert_str(pos, &s);
459 rope.insert(pos, &s);
460 dbg!(&rope);
461 rope.check();
462 assert_eq!(rope.len(), truth.len());
463 assert_eq!(rope.to_string(), truth, "{:#?}", &rope.tree);
464 }
465 Action::Delete { pos, len } => {
466 let pos = pos as usize % (truth.len() + 1);
467 let mut len = len as usize % 10;
468 len = len.min(truth.len() - pos);
469 dbg!("DEL", pos, len);
470 dbg!(&rope);
471 rope.delete_range(pos..(pos + len));
472 dbg!(&rope);
473 truth.drain(pos..pos + len);
474 rope.check();
475 assert_eq!(rope.len(), truth.len());
476 assert_eq!(rope.to_string(), truth, "{:#?}", &rope.tree);
477 }
478 }
479 }
480
481 assert_eq!(rope.to_string(), truth);
482 }
483
484 #[test]
485 fn fuzz_0() {
486 fuzz(vec![
487 Insert {
488 pos: 0,
489 content: 128,
490 },
491 Insert {
492 pos: 0,
493 content: 249,
494 },
495 Insert {
496 pos: 108,
497 content: 108,
498 },
499 Delete { pos: 192, len: 193 },
500 Insert {
501 pos: 106,
502 content: 108,
503 },
504 Insert {
505 pos: 108,
506 content: 108,
507 },
508 Insert {
509 pos: 100,
510 content: 108,
511 },
512 Insert {
513 pos: 108,
514 content: 108,
515 },
516 Insert {
517 pos: 108,
518 content: 108,
519 },
520 Insert {
521 pos: 108,
522 content: 108,
523 },
524 Insert { pos: 0, content: 8 },
525 Insert {
526 pos: 108,
527 content: 108,
528 },
529 Insert {
530 pos: 108,
531 content: 108,
532 },
533 Insert {
534 pos: 111,
535 content: 127,
536 },
537 Delete { pos: 255, len: 255 },
538 Delete { pos: 255, len: 36 },
539 Delete { pos: 255, len: 255 },
540 Delete { pos: 255, len: 255 },
541 Delete { pos: 255, len: 255 },
542 Delete { pos: 135, len: 169 },
543 Delete { pos: 255, len: 255 },
544 Delete { pos: 255, len: 255 },
545 Delete { pos: 255, len: 255 },
546 Delete { pos: 255, len: 255 },
547 ])
548 }
549
550 #[test]
551 fn fuzz_1() {
552 fuzz(vec![
553 Insert {
554 pos: 157,
555 content: 108,
556 },
557 Insert {
558 pos: 255,
559 content: 255,
560 },
561 Insert {
562 pos: 108,
563 content: 108,
564 },
565 Insert {
566 pos: 108,
567 content: 108,
568 },
569 Insert {
570 pos: 8,
571 content: 101,
572 },
573 Insert {
574 pos: 111,
575 content: 127,
576 },
577 Delete { pos: 255, len: 169 },
578 ])
579 }
580
581 #[test]
582 fn fuzz_2() {
583 fuzz(vec![
584 Insert {
585 pos: 0,
586 content: 128,
587 },
588 Insert {
589 pos: 0,
590 content: 249,
591 },
592 Insert {
593 pos: 108,
594 content: 108,
595 },
596 Insert {
597 pos: 108,
598 content: 108,
599 },
600 Insert {
601 pos: 108,
602 content: 108,
603 },
604 Insert {
605 pos: 108,
606 content: 108,
607 },
608 Insert {
609 pos: 108,
610 content: 108,
611 },
612 Insert {
613 pos: 108,
614 content: 108,
615 },
616 Insert {
617 pos: 108,
618 content: 0,
619 },
620 Insert {
621 pos: 108,
622 content: 108,
623 },
624 Insert {
625 pos: 108,
626 content: 249,
627 },
628 Insert {
629 pos: 135,
630 content: 255,
631 },
632 Delete { pos: 255, len: 255 },
633 Delete { pos: 169, len: 169 },
634 ])
635 }
636
637 #[test]
638 fn fuzz_3() {
639 fuzz(vec![
640 Insert {
641 pos: 111,
642 content: 140,
643 },
644 Insert {
645 pos: 111,
646 content: 107,
647 },
648 Insert {
649 pos: 35,
650 content: 102,
651 },
652 Insert {
653 pos: 102,
654 content: 102,
655 },
656 Insert {
657 pos: 102,
658 content: 102,
659 },
660 Insert {
661 pos: 102,
662 content: 102,
663 },
664 Insert {
665 pos: 64,
666 content: 64,
667 },
668 Insert {
669 pos: 64,
670 content: 64,
671 },
672 Insert {
673 pos: 64,
674 content: 64,
675 },
676 Insert {
677 pos: 64,
678 content: 0,
679 },
680 Insert {
681 pos: 64,
682 content: 64,
683 },
684 Insert {
685 pos: 93,
686 content: 93,
687 },
688 Insert {
689 pos: 93,
690 content: 93,
691 },
692 Insert {
693 pos: 93,
694 content: 93,
695 },
696 Insert {
697 pos: 93,
698 content: 93,
699 },
700 Insert {
701 pos: 93,
702 content: 93,
703 },
704 Insert {
705 pos: 93,
706 content: 93,
707 },
708 Insert {
709 pos: 93,
710 content: 93,
711 },
712 Insert {
713 pos: 93,
714 content: 93,
715 },
716 Insert {
717 pos: 93,
718 content: 93,
719 },
720 Insert {
721 pos: 93,
722 content: 93,
723 },
724 Insert {
725 pos: 93,
726 content: 93,
727 },
728 Insert {
729 pos: 93,
730 content: 93,
731 },
732 Insert {
733 pos: 93,
734 content: 93,
735 },
736 Insert {
737 pos: 93,
738 content: 93,
739 },
740 Insert {
741 pos: 93,
742 content: 93,
743 },
744 Insert {
745 pos: 64,
746 content: 64,
747 },
748 Insert {
749 pos: 64,
750 content: 64,
751 },
752 Insert {
753 pos: 64,
754 content: 64,
755 },
756 Insert {
757 pos: 102,
758 content: 119,
759 },
760 Insert {
761 pos: 119,
762 content: 119,
763 },
764 Insert {
765 pos: 119,
766 content: 119,
767 },
768 Insert {
769 pos: 119,
770 content: 119,
771 },
772 Insert {
773 pos: 119,
774 content: 119,
775 },
776 Insert {
777 pos: 119,
778 content: 111,
779 },
780 Insert {
781 pos: 102,
782 content: 102,
783 },
784 Insert {
785 pos: 102,
786 content: 101,
787 },
788 Insert {
789 pos: 36,
790 content: 146,
791 },
792 Delete { pos: 74, len: 102 },
793 Insert {
794 pos: 119,
795 content: 119,
796 },
797 Insert {
798 pos: 119,
799 content: 119,
800 },
801 Insert {
802 pos: 17,
803 content: 17,
804 },
805 Insert {
806 pos: 17,
807 content: 17,
808 },
809 Insert {
810 pos: 64,
811 content: 64,
812 },
813 Insert {
814 pos: 64,
815 content: 64,
816 },
817 Insert {
818 pos: 64,
819 content: 64,
820 },
821 Insert {
822 pos: 64,
823 content: 64,
824 },
825 Insert {
826 pos: 64,
827 content: 64,
828 },
829 Insert {
830 pos: 64,
831 content: 64,
832 },
833 Insert {
834 pos: 64,
835 content: 64,
836 },
837 Insert { pos: 0, content: 0 },
838 Insert {
839 pos: 102,
840 content: 119,
841 },
842 Insert {
843 pos: 119,
844 content: 119,
845 },
846 Insert {
847 pos: 119,
848 content: 119,
849 },
850 Insert {
851 pos: 119,
852 content: 119,
853 },
854 Insert {
855 pos: 119,
856 content: 119,
857 },
858 Insert {
859 pos: 119,
860 content: 111,
861 },
862 Insert {
863 pos: 102,
864 content: 102,
865 },
866 Insert { pos: 0, content: 0 },
867 Insert {
868 pos: 3,
869 content: 73,
870 },
871 Insert {
872 pos: 146,
873 content: 74,
874 },
875 Insert {
876 pos: 119,
877 content: 119,
878 },
879 Insert {
880 pos: 119,
881 content: 119,
882 },
883 Insert {
884 pos: 119,
885 content: 119,
886 },
887 Insert {
888 pos: 119,
889 content: 119,
890 },
891 Insert {
892 pos: 21,
893 content: 119,
894 },
895 Insert {
896 pos: 119,
897 content: 119,
898 },
899 Insert {
900 pos: 119,
901 content: 119,
902 },
903 Insert {
904 pos: 111,
905 content: 111,
906 },
907 Insert { pos: 0, content: 8 },
908 Insert {
909 pos: 102,
910 content: 102,
911 },
912 Insert {
913 pos: 102,
914 content: 102,
915 },
916 Insert {
917 pos: 102,
918 content: 3,
919 },
920 Insert {
921 pos: 36,
922 content: 146,
923 },
924 Insert {
925 pos: 119,
926 content: 119,
927 },
928 Delete { pos: 111, len: 119 },
929 Insert {
930 pos: 119,
931 content: 119,
932 },
933 Insert {
934 pos: 102,
935 content: 102,
936 },
937 Insert {
938 pos: 102,
939 content: 102,
940 },
941 Insert {
942 pos: 73,
943 content: 36,
944 },
945 Delete { pos: 74, len: 102 },
946 Delete { pos: 255, len: 255 },
947 Insert {
948 pos: 42,
949 content: 64,
950 },
951 Insert {
952 pos: 64,
953 content: 64,
954 },
955 Insert {
956 pos: 64,
957 content: 64,
958 },
959 Insert {
960 pos: 64,
961 content: 64,
962 },
963 Insert {
964 pos: 102,
965 content: 102,
966 },
967 Insert {
968 pos: 119,
969 content: 119,
970 },
971 Insert {
972 pos: 42,
973 content: 42,
974 },
975 Insert {
976 pos: 42,
977 content: 42,
978 },
979 Insert {
980 pos: 42,
981 content: 42,
982 },
983 Insert {
984 pos: 0,
985 content: 15,
986 },
987 Insert {
988 pos: 42,
989 content: 42,
990 },
991 Insert {
992 pos: 42,
993 content: 42,
994 },
995 Insert {
996 pos: 42,
997 content: 42,
998 },
999 Insert {
1000 pos: 42,
1001 content: 42,
1002 },
1003 Insert {
1004 pos: 42,
1005 content: 42,
1006 },
1007 Insert {
1008 pos: 42,
1009 content: 42,
1010 },
1011 Insert {
1012 pos: 42,
1013 content: 42,
1014 },
1015 Insert {
1016 pos: 42,
1017 content: 42,
1018 },
1019 Insert {
1020 pos: 42,
1021 content: 42,
1022 },
1023 Insert {
1024 pos: 119,
1025 content: 119,
1026 },
1027 Insert {
1028 pos: 102,
1029 content: 102,
1030 },
1031 Insert {
1032 pos: 102,
1033 content: 102,
1034 },
1035 Insert {
1036 pos: 102,
1037 content: 3,
1038 },
1039 Insert {
1040 pos: 36,
1041 content: 146,
1042 },
1043 Insert {
1044 pos: 255,
1045 content: 255,
1046 },
1047 Insert {
1048 pos: 42,
1049 content: 42,
1050 },
1051 Insert {
1052 pos: 64,
1053 content: 64,
1054 },
1055 Insert {
1056 pos: 64,
1057 content: 64,
1058 },
1059 Insert {
1060 pos: 64,
1061 content: 64,
1062 },
1063 Insert {
1064 pos: 64,
1065 content: 64,
1066 },
1067 Insert {
1068 pos: 119,
1069 content: 119,
1070 },
1071 Insert {
1072 pos: 119,
1073 content: 119,
1074 },
1075 Insert {
1076 pos: 42,
1077 content: 42,
1078 },
1079 Insert {
1080 pos: 42,
1081 content: 38,
1082 },
1083 Insert { pos: 0, content: 0 },
1084 Insert {
1085 pos: 89,
1086 content: 89,
1087 },
1088 Insert {
1089 pos: 89,
1090 content: 89,
1091 },
1092 Insert {
1093 pos: 89,
1094 content: 89,
1095 },
1096 Insert {
1097 pos: 89,
1098 content: 89,
1099 },
1100 Insert {
1101 pos: 89,
1102 content: 89,
1103 },
1104 Insert {
1105 pos: 89,
1106 content: 89,
1107 },
1108 Insert {
1109 pos: 89,
1110 content: 89,
1111 },
1112 Insert {
1113 pos: 89,
1114 content: 89,
1115 },
1116 Insert {
1117 pos: 89,
1118 content: 89,
1119 },
1120 Insert {
1121 pos: 89,
1122 content: 89,
1123 },
1124 Insert {
1125 pos: 89,
1126 content: 89,
1127 },
1128 Insert {
1129 pos: 89,
1130 content: 89,
1131 },
1132 Insert {
1133 pos: 89,
1134 content: 89,
1135 },
1136 Insert {
1137 pos: 89,
1138 content: 89,
1139 },
1140 Insert {
1141 pos: 89,
1142 content: 89,
1143 },
1144 Insert {
1145 pos: 89,
1146 content: 89,
1147 },
1148 Insert {
1149 pos: 42,
1150 content: 42,
1151 },
1152 Insert {
1153 pos: 42,
1154 content: 42,
1155 },
1156 Insert {
1157 pos: 42,
1158 content: 42,
1159 },
1160 Insert {
1161 pos: 42,
1162 content: 42,
1163 },
1164 Insert {
1165 pos: 42,
1166 content: 42,
1167 },
1168 Insert {
1169 pos: 119,
1170 content: 119,
1171 },
1172 Insert {
1173 pos: 119,
1174 content: 37,
1175 },
1176 Insert {
1177 pos: 101,
1178 content: 102,
1179 },
1180 Insert { pos: 0, content: 0 },
1181 Delete { pos: 193, len: 63 },
1182 Insert {
1183 pos: 108,
1184 content: 108,
1185 },
1186 Insert {
1187 pos: 108,
1188 content: 0,
1189 },
1190 Insert {
1191 pos: 108,
1192 content: 108,
1193 },
1194 Insert {
1195 pos: 108,
1196 content: 108,
1197 },
1198 Insert {
1199 pos: 108,
1200 content: 108,
1201 },
1202 Insert { pos: 0, content: 8 },
1203 Insert {
1204 pos: 108,
1205 content: 108,
1206 },
1207 Insert {
1208 pos: 102,
1209 content: 102,
1210 },
1211 Insert {
1212 pos: 119,
1213 content: 119,
1214 },
1215 Insert {
1216 pos: 119,
1217 content: 119,
1218 },
1219 Insert {
1220 pos: 119,
1221 content: 119,
1222 },
1223 Insert {
1224 pos: 119,
1225 content: 119,
1226 },
1227 Delete { pos: 199, len: 199 },
1228 Delete { pos: 199, len: 199 },
1229 Delete { pos: 199, len: 199 },
1230 Delete { pos: 199, len: 199 },
1231 Delete { pos: 199, len: 199 },
1232 Delete { pos: 199, len: 187 },
1233 Delete { pos: 187, len: 187 },
1234 Delete { pos: 187, len: 187 },
1235 Delete { pos: 187, len: 187 },
1236 Delete { pos: 187, len: 187 },
1237 Delete { pos: 187, len: 187 },
1238 Delete { pos: 187, len: 187 },
1239 Delete { pos: 187, len: 187 },
1240 Delete { pos: 187, len: 187 },
1241 Insert {
1242 pos: 3,
1243 content: 119,
1244 },
1245 Insert {
1246 pos: 102,
1247 content: 102,
1248 },
1249 Delete { pos: 163, len: 163 },
1250 Delete { pos: 163, len: 163 },
1251 Delete { pos: 163, len: 102 },
1252 Insert {
1253 pos: 102,
1254 content: 102,
1255 },
1256 Insert {
1257 pos: 108,
1258 content: 249,
1259 },
1260 Insert {
1261 pos: 135,
1262 content: 169,
1263 },
1264 Delete { pos: 255, len: 255 },
1265 Delete { pos: 255, len: 255 },
1266 Delete { pos: 111, len: 255 },
1267 Insert {
1268 pos: 111,
1269 content: 111,
1270 },
1271 Insert {
1272 pos: 255,
1273 content: 255,
1274 },
1275 ])
1276 }
1277
1278 #[test]
1279 fn fuzz_4() {
1280 fuzz(vec![
1281 Insert {
1282 pos: 0,
1283 content: 128,
1284 },
1285 Insert {
1286 pos: 0,
1287 content: 249,
1288 },
1289 Insert { pos: 8, content: 0 },
1290 Insert {
1291 pos: 108,
1292 content: 108,
1293 },
1294 Insert {
1295 pos: 108,
1296 content: 108,
1297 },
1298 Insert {
1299 pos: 108,
1300 content: 108,
1301 },
1302 Insert {
1303 pos: 108,
1304 content: 108,
1305 },
1306 Insert {
1307 pos: 108,
1308 content: 108,
1309 },
1310 Insert {
1311 pos: 108,
1312 content: 0,
1313 },
1314 Insert {
1315 pos: 108,
1316 content: 108,
1317 },
1318 ])
1319 }
1320
1321 #[test]
1322 fn fuzz_5() {
1323 fuzz(vec![
1324 Insert {
1325 pos: 123,
1326 content: 123,
1327 },
1328 Insert {
1329 pos: 123,
1330 content: 123,
1331 },
1332 Insert {
1333 pos: 123,
1334 content: 123,
1335 },
1336 Insert {
1337 pos: 0,
1338 content: 123,
1339 },
1340 Delete { pos: 108, len: 108 },
1341 Insert {
1342 pos: 108,
1343 content: 108,
1344 },
1345 Insert {
1346 pos: 108,
1347 content: 108,
1348 },
1349 Insert {
1350 pos: 108,
1351 content: 108,
1352 },
1353 Insert {
1354 pos: 108,
1355 content: 108,
1356 },
1357 Insert {
1358 pos: 12,
1359 content: 0,
1360 },
1361 Insert { pos: 0, content: 0 },
1362 Insert {
1363 pos: 127,
1364 content: 135,
1365 },
1366 Delete { pos: 255, len: 246 },
1367 Delete { pos: 246, len: 246 },
1368 Delete { pos: 246, len: 246 },
1369 Delete { pos: 246, len: 246 },
1370 Insert {
1371 pos: 101,
1372 content: 101,
1373 },
1374 Insert {
1375 pos: 101,
1376 content: 101,
1377 },
1378 Delete { pos: 255, len: 255 },
1379 Delete { pos: 169, len: 169 },
1380 ])
1381 }
1382
1383 #[test]
1384 fn fuzz_6() {
1385 fuzz(vec![
1386 Insert {
1387 pos: 0,
1388 content: 128,
1389 },
1390 Insert { pos: 0, content: 0 },
1391 Insert {
1392 pos: 108,
1393 content: 108,
1394 },
1395 Insert {
1396 pos: 108,
1397 content: 108,
1398 },
1399 Insert {
1400 pos: 108,
1401 content: 108,
1402 },
1403 Insert {
1404 pos: 108,
1405 content: 108,
1406 },
1407 Insert {
1408 pos: 108,
1409 content: 108,
1410 },
1411 Insert {
1412 pos: 0,
1413 content: 249,
1414 },
1415 Insert {
1416 pos: 108,
1417 content: 108,
1418 },
1419 Insert {
1420 pos: 108,
1421 content: 108,
1422 },
1423 Insert {
1424 pos: 108,
1425 content: 108,
1426 },
1427 Insert {
1428 pos: 108,
1429 content: 108,
1430 },
1431 Insert {
1432 pos: 171,
1433 content: 171,
1434 },
1435 Delete { pos: 171, len: 0 },
1436 Insert {
1437 pos: 108,
1438 content: 108,
1439 },
1440 Insert {
1441 pos: 108,
1442 content: 108,
1443 },
1444 Insert {
1445 pos: 108,
1446 content: 108,
1447 },
1448 Insert {
1449 pos: 108,
1450 content: 108,
1451 },
1452 Insert {
1453 pos: 108,
1454 content: 171,
1455 },
1456 Delete { pos: 187, len: 171 },
1457 Delete { pos: 171, len: 171 },
1458 Delete { pos: 171, len: 171 },
1459 Delete { pos: 171, len: 171 },
1460 Delete { pos: 171, len: 171 },
1461 Insert {
1462 pos: 108,
1463 content: 108,
1464 },
1465 Insert {
1466 pos: 108,
1467 content: 108,
1468 },
1469 Insert {
1470 pos: 108,
1471 content: 108,
1472 },
1473 Insert {
1474 pos: 108,
1475 content: 108,
1476 },
1477 Insert {
1478 pos: 171,
1479 content: 171,
1480 },
1481 Insert { pos: 0, content: 0 },
1482 Insert {
1483 pos: 108,
1484 content: 108,
1485 },
1486 Insert {
1487 pos: 108,
1488 content: 108,
1489 },
1490 Insert {
1491 pos: 110,
1492 content: 108,
1493 },
1494 Insert {
1495 pos: 108,
1496 content: 108,
1497 },
1498 Insert {
1499 pos: 108,
1500 content: 171,
1501 },
1502 Delete { pos: 187, len: 171 },
1503 Delete { pos: 171, len: 171 },
1504 Delete { pos: 171, len: 171 },
1505 Delete { pos: 171, len: 171 },
1506 Delete { pos: 171, len: 171 },
1507 Delete { pos: 171, len: 171 },
1508 Delete { pos: 171, len: 171 },
1509 Delete { pos: 171, len: 171 },
1510 Insert {
1511 pos: 8,
1512 content: 108,
1513 },
1514 Insert {
1515 pos: 108,
1516 content: 108,
1517 },
1518 Insert {
1519 pos: 50,
1520 content: 108,
1521 },
1522 Delete { pos: 108, len: 108 },
1523 Insert {
1524 pos: 108,
1525 content: 87,
1526 },
1527 Insert {
1528 pos: 249,
1529 content: 1,
1530 },
1531 Delete { pos: 169, len: 235 },
1532 Delete { pos: 171, len: 171 },
1533 Delete { pos: 171, len: 171 },
1534 Delete { pos: 163, len: 171 },
1535 Delete { pos: 171, len: 171 },
1536 Insert { pos: 8, content: 0 },
1537 Insert { pos: 0, content: 0 },
1538 Delete { pos: 171, len: 171 },
1539 Delete { pos: 171, len: 171 },
1540 Delete { pos: 41, len: 164 },
1541 Delete { pos: 171, len: 171 },
1542 Delete { pos: 171, len: 171 },
1543 Delete { pos: 171, len: 171 },
1544 Delete { pos: 171, len: 171 },
1545 Delete { pos: 171, len: 171 },
1546 Delete { pos: 171, len: 171 },
1547 Delete { pos: 171, len: 171 },
1548 Delete { pos: 171, len: 171 },
1549 Insert { pos: 0, content: 0 },
1550 Insert {
1551 pos: 108,
1552 content: 108,
1553 },
1554 Insert {
1555 pos: 108,
1556 content: 108,
1557 },
1558 Delete { pos: 171, len: 171 },
1559 Delete { pos: 171, len: 171 },
1560 Insert {
1561 pos: 123,
1562 content: 123,
1563 },
1564 Insert {
1565 pos: 123,
1566 content: 123,
1567 },
1568 Insert {
1569 pos: 123,
1570 content: 2,
1571 },
1572 Insert {
1573 pos: 254,
1574 content: 123,
1575 },
1576 Insert {
1577 pos: 123,
1578 content: 123,
1579 },
1580 Insert {
1581 pos: 123,
1582 content: 123,
1583 },
1584 Insert {
1585 pos: 123,
1586 content: 123,
1587 },
1588 Insert {
1589 pos: 0,
1590 content: 123,
1591 },
1592 Delete { pos: 238, len: 238 },
1593 Delete { pos: 238, len: 238 },
1594 Delete { pos: 238, len: 238 },
1595 Delete { pos: 238, len: 238 },
1596 Delete { pos: 238, len: 238 },
1597 Delete { pos: 238, len: 238 },
1598 Delete { pos: 238, len: 238 },
1599 Delete { pos: 238, len: 238 },
1600 Insert {
1601 pos: 238,
1602 content: 238,
1603 },
1604 Delete { pos: 238, len: 238 },
1605 Delete { pos: 238, len: 238 },
1606 Insert { pos: 0, content: 0 },
1607 Insert {
1608 pos: 238,
1609 content: 238,
1610 },
1611 Delete { pos: 238, len: 238 },
1612 Delete { pos: 238, len: 238 },
1613 Delete { pos: 238, len: 238 },
1614 Delete { pos: 238, len: 238 },
1615 Delete { pos: 238, len: 238 },
1616 Insert {
1617 pos: 123,
1618 content: 123,
1619 },
1620 Insert {
1621 pos: 86,
1622 content: 86,
1623 },
1624 Insert {
1625 pos: 123,
1626 content: 2,
1627 },
1628 Insert {
1629 pos: 254,
1630 content: 123,
1631 },
1632 Insert {
1633 pos: 123,
1634 content: 123,
1635 },
1636 Insert {
1637 pos: 123,
1638 content: 123,
1639 },
1640 Insert {
1641 pos: 123,
1642 content: 123,
1643 },
1644 Insert {
1645 pos: 0,
1646 content: 238,
1647 },
1648 Delete { pos: 238, len: 238 },
1649 Delete { pos: 238, len: 238 },
1650 Delete { pos: 238, len: 238 },
1651 Delete { pos: 238, len: 238 },
1652 Insert {
1653 pos: 238,
1654 content: 123,
1655 },
1656 Delete { pos: 123, len: 123 },
1657 Insert {
1658 pos: 86,
1659 content: 254,
1660 },
1661 Insert {
1662 pos: 33,
1663 content: 238,
1664 },
1665 Delete { pos: 238, len: 238 },
1666 Delete { pos: 238, len: 238 },
1667 Insert {
1668 pos: 123,
1669 content: 2,
1670 },
1671 Insert { pos: 0, content: 0 },
1672 Delete { pos: 238, len: 238 },
1673 Delete { pos: 123, len: 123 },
1674 Insert {
1675 pos: 0,
1676 content: 121,
1677 },
1678 Insert {
1679 pos: 26,
1680 content: 0,
1681 },
1682 Insert { pos: 0, content: 0 },
1683 Insert {
1684 pos: 123,
1685 content: 123,
1686 },
1687 Delete { pos: 238, len: 254 },
1688 Insert {
1689 pos: 144,
1690 content: 238,
1691 },
1692 Delete { pos: 91, len: 238 },
1693 Delete { pos: 238, len: 238 },
1694 Insert {
1695 pos: 123,
1696 content: 238,
1697 },
1698 Delete { pos: 238, len: 238 },
1699 Delete { pos: 0, len: 51 },
1700 Insert {
1701 pos: 123,
1702 content: 123,
1703 },
1704 Insert {
1705 pos: 102,
1706 content: 102,
1707 },
1708 Insert {
1709 pos: 102,
1710 content: 102,
1711 },
1712 Insert {
1713 pos: 123,
1714 content: 123,
1715 },
1716 Delete { pos: 238, len: 238 },
1717 Delete { pos: 238, len: 123 },
1718 Insert {
1719 pos: 123,
1720 content: 123,
1721 },
1722 Insert {
1723 pos: 123,
1724 content: 123,
1725 },
1726 Insert {
1727 pos: 123,
1728 content: 123,
1729 },
1730 Insert {
1731 pos: 123,
1732 content: 86,
1733 },
1734 Delete { pos: 101, len: 144 },
1735 Delete { pos: 238, len: 91 },
1736 Delete { pos: 238, len: 238 },
1737 Insert { pos: 0, content: 0 },
1738 Insert {
1739 pos: 108,
1740 content: 108,
1741 },
1742 Insert { pos: 3, content: 0 },
1743 Insert { pos: 0, content: 0 },
1744 Insert {
1745 pos: 171,
1746 content: 63,
1747 },
1748 Delete { pos: 171, len: 171 },
1749 Delete { pos: 171, len: 171 },
1750 Delete { pos: 171, len: 171 },
1751 Delete { pos: 171, len: 171 },
1752 Delete { pos: 171, len: 171 },
1753 Delete { pos: 171, len: 171 },
1754 Insert { pos: 0, content: 0 },
1755 Insert {
1756 pos: 108,
1757 content: 108,
1758 },
1759 Insert { pos: 0, content: 0 },
1760 Delete { pos: 235, len: 235 },
1761 Insert {
1762 pos: 108,
1763 content: 108,
1764 },
1765 Insert { pos: 8, content: 0 },
1766 Insert {
1767 pos: 127,
1768 content: 135,
1769 },
1770 Delete { pos: 171, len: 171 },
1771 Delete { pos: 0, len: 171 },
1772 Delete { pos: 171, len: 171 },
1773 Delete { pos: 171, len: 171 },
1774 Insert {
1775 pos: 0,
1776 content: 171,
1777 },
1778 Delete { pos: 1, len: 126 },
1779 Delete { pos: 235, len: 154 },
1780 Delete { pos: 171, len: 171 },
1781 Delete { pos: 171, len: 171 },
1782 Insert {
1783 pos: 84,
1784 content: 84,
1785 },
1786 Delete { pos: 171, len: 171 },
1787 Delete { pos: 171, len: 171 },
1788 Delete { pos: 171, len: 171 },
1789 Delete { pos: 171, len: 171 },
1790 Delete { pos: 238, len: 238 },
1791 Delete { pos: 238, len: 238 },
1792 Insert { pos: 0, content: 0 },
1793 Delete { pos: 91, len: 238 },
1794 Delete { pos: 238, len: 238 },
1795 Delete { pos: 238, len: 238 },
1796 Delete { pos: 238, len: 238 },
1797 Delete { pos: 238, len: 238 },
1798 Delete { pos: 171, len: 171 },
1799 Insert {
1800 pos: 249,
1801 content: 1,
1802 },
1803 Insert {
1804 pos: 108,
1805 content: 108,
1806 },
1807 Insert { pos: 0, content: 0 },
1808 Insert {
1809 pos: 108,
1810 content: 108,
1811 },
1812 Delete { pos: 171, len: 171 },
1813 Delete { pos: 171, len: 171 },
1814 Delete { pos: 171, len: 171 },
1815 Delete { pos: 171, len: 171 },
1816 Delete { pos: 171, len: 171 },
1817 Delete { pos: 171, len: 171 },
1818 Delete { pos: 171, len: 171 },
1819 Insert { pos: 0, content: 8 },
1820 Insert {
1821 pos: 108,
1822 content: 32,
1823 },
1824 Insert { pos: 0, content: 0 },
1825 Delete { pos: 235, len: 108 },
1826 Insert {
1827 pos: 108,
1828 content: 108,
1829 },
1830 Delete { pos: 255, len: 6 },
1831 Insert {
1832 pos: 135,
1833 content: 169,
1834 },
1835 Delete { pos: 171, len: 171 },
1836 Insert {
1837 pos: 171,
1838 content: 171,
1839 },
1840 Delete { pos: 171, len: 171 },
1841 Delete { pos: 171, len: 171 },
1842 Insert {
1843 pos: 171,
1844 content: 171,
1845 },
1846 Insert {
1847 pos: 126,
1848 content: 111,
1849 },
1850 Delete { pos: 154, len: 171 },
1851 Delete { pos: 171, len: 171 },
1852 Delete { pos: 171, len: 171 },
1853 Insert {
1854 pos: 84,
1855 content: 171,
1856 },
1857 Delete { pos: 171, len: 171 },
1858 Delete { pos: 171, len: 171 },
1859 Delete { pos: 171, len: 171 },
1860 Delete { pos: 171, len: 171 },
1861 Delete { pos: 171, len: 171 },
1862 Insert {
1863 pos: 108,
1864 content: 108,
1865 },
1866 Insert {
1867 pos: 108,
1868 content: 108,
1869 },
1870 Insert {
1871 pos: 108,
1872 content: 235,
1873 },
1874 Insert {
1875 pos: 108,
1876 content: 108,
1877 },
1878 Insert {
1879 pos: 87,
1880 content: 0,
1881 },
1882 Delete { pos: 1, len: 111 },
1883 Delete { pos: 238, len: 238 },
1884 Insert {
1885 pos: 123,
1886 content: 123,
1887 },
1888 Insert {
1889 pos: 121,
1890 content: 86,
1891 },
1892 Insert {
1893 pos: 123,
1894 content: 123,
1895 },
1896 Insert {
1897 pos: 86,
1898 content: 254,
1899 },
1900 Insert {
1901 pos: 123,
1902 content: 123,
1903 },
1904 Insert {
1905 pos: 123,
1906 content: 123,
1907 },
1908 Insert {
1909 pos: 123,
1910 content: 123,
1911 },
1912 Insert {
1913 pos: 86,
1914 content: 0,
1915 },
1916 Delete { pos: 238, len: 238 },
1917 Delete { pos: 238, len: 238 },
1918 Delete { pos: 254, len: 193 },
1919 Delete { pos: 63, len: 64 },
1920 Insert { pos: 0, content: 0 },
1921 Delete { pos: 235, len: 235 },
1922 Insert {
1923 pos: 108,
1924 content: 108,
1925 },
1926 Insert { pos: 0, content: 8 },
1927 Insert {
1928 pos: 111,
1929 content: 127,
1930 },
1931 Delete { pos: 171, len: 171 },
1932 Delete { pos: 171, len: 0 },
1933 Delete { pos: 171, len: 171 },
1934 Delete { pos: 171, len: 171 },
1935 Delete { pos: 8, len: 0 },
1936 Delete { pos: 249, len: 1 },
1937 Delete { pos: 169, len: 235 },
1938 Delete { pos: 171, len: 171 },
1939 Delete { pos: 171, len: 171 },
1940 Delete { pos: 171, len: 171 },
1941 Delete { pos: 171, len: 171 },
1942 Insert {
1943 pos: 8,
1944 content: 108,
1945 },
1946 Insert {
1947 pos: 108,
1948 content: 108,
1949 },
1950 Insert {
1951 pos: 50,
1952 content: 108,
1953 },
1954 Delete { pos: 108, len: 108 },
1955 Insert {
1956 pos: 108,
1957 content: 8,
1958 },
1959 Insert { pos: 0, content: 0 },
1960 Delete { pos: 169, len: 235 },
1961 Delete { pos: 171, len: 171 },
1962 Delete { pos: 171, len: 171 },
1963 Delete { pos: 171, len: 171 },
1964 Delete { pos: 171, len: 171 },
1965 Insert { pos: 8, content: 0 },
1966 Insert { pos: 0, content: 0 },
1967 Delete { pos: 171, len: 171 },
1968 Delete { pos: 171, len: 171 },
1969 Delete { pos: 41, len: 164 },
1970 Delete { pos: 171, len: 171 },
1971 Delete { pos: 171, len: 171 },
1972 Delete { pos: 171, len: 171 },
1973 Delete { pos: 171, len: 171 },
1974 Delete { pos: 171, len: 171 },
1975 Delete { pos: 171, len: 171 },
1976 Delete { pos: 171, len: 171 },
1977 Delete { pos: 171, len: 171 },
1978 Insert { pos: 0, content: 0 },
1979 Insert {
1980 pos: 108,
1981 content: 108,
1982 },
1983 Insert {
1984 pos: 108,
1985 content: 108,
1986 },
1987 Delete { pos: 235, len: 235 },
1988 Insert {
1989 pos: 108,
1990 content: 108,
1991 },
1992 Insert { pos: 8, content: 0 },
1993 Insert {
1994 pos: 171,
1995 content: 171,
1996 },
1997 Insert { pos: 8, content: 0 },
1998 Insert {
1999 pos: 127,
2000 content: 135,
2001 },
2002 Delete { pos: 171, len: 171 },
2003 Delete { pos: 171, len: 171 },
2004 Delete { pos: 41, len: 171 },
2005 Delete { pos: 171, len: 171 },
2006 Delete { pos: 171, len: 171 },
2007 Delete { pos: 171, len: 41 },
2008 Insert {
2009 pos: 171,
2010 content: 171,
2011 },
2012 Delete { pos: 171, len: 171 },
2013 Delete { pos: 165, len: 171 },
2014 Delete { pos: 171, len: 171 },
2015 Delete { pos: 171, len: 171 },
2016 Delete { pos: 171, len: 171 },
2017 Delete { pos: 171, len: 170 },
2018 Delete { pos: 171, len: 171 },
2019 Delete { pos: 235, len: 235 },
2020 Insert {
2021 pos: 108,
2022 content: 108,
2023 },
2024 Insert {
2025 pos: 108,
2026 content: 108,
2027 },
2028 Insert {
2029 pos: 108,
2030 content: 108,
2031 },
2032 Insert {
2033 pos: 0,
2034 content: 108,
2035 },
2036 Delete { pos: 171, len: 171 },
2037 Delete { pos: 171, len: 171 },
2038 Insert {
2039 pos: 171,
2040 content: 171,
2041 },
2042 Insert { pos: 0, content: 0 },
2043 Insert {
2044 pos: 108,
2045 content: 108,
2046 },
2047 Insert {
2048 pos: 108,
2049 content: 108,
2050 },
2051 Delete { pos: 235, len: 235 },
2052 Insert {
2053 pos: 108,
2054 content: 108,
2055 },
2056 Insert { pos: 8, content: 0 },
2057 Insert {
2058 pos: 127,
2059 content: 135,
2060 },
2061 Delete { pos: 171, len: 171 },
2062 Delete { pos: 171, len: 171 },
2063 Delete { pos: 171, len: 171 },
2064 Insert {
2065 pos: 123,
2066 content: 2,
2067 },
2068 Insert {
2069 pos: 254,
2070 content: 123,
2071 },
2072 Insert {
2073 pos: 123,
2074 content: 123,
2075 },
2076 Insert {
2077 pos: 123,
2078 content: 123,
2079 },
2080 Delete { pos: 238, len: 238 },
2081 Delete { pos: 238, len: 238 },
2082 Insert {
2083 pos: 123,
2084 content: 123,
2085 },
2086 Insert {
2087 pos: 123,
2088 content: 123,
2089 },
2090 Insert {
2091 pos: 123,
2092 content: 123,
2093 },
2094 Insert {
2095 pos: 123,
2096 content: 123,
2097 },
2098 Delete { pos: 255, len: 255 },
2099 Delete { pos: 238, len: 238 },
2100 Delete { pos: 238, len: 238 },
2101 Delete { pos: 238, len: 238 },
2102 Insert {
2103 pos: 123,
2104 content: 123,
2105 },
2106 Insert {
2107 pos: 121,
2108 content: 86,
2109 },
2110 Insert { pos: 0, content: 0 },
2111 Delete { pos: 238, len: 238 },
2112 Insert {
2113 pos: 123,
2114 content: 123,
2115 },
2116 Delete { pos: 255, len: 255 },
2117 Delete { pos: 8, len: 238 },
2118 Delete { pos: 238, len: 238 },
2119 Insert {
2120 pos: 123,
2121 content: 123,
2122 },
2123 Insert {
2124 pos: 123,
2125 content: 123,
2126 },
2127 Insert {
2128 pos: 123,
2129 content: 123,
2130 },
2131 Insert {
2132 pos: 123,
2133 content: 123,
2134 },
2135 Delete { pos: 255, len: 255 },
2136 Delete { pos: 238, len: 238 },
2137 Delete { pos: 238, len: 238 },
2138 Delete { pos: 238, len: 238 },
2139 Delete { pos: 238, len: 238 },
2140 Delete { pos: 238, len: 238 },
2141 Insert {
2142 pos: 238,
2143 content: 238,
2144 },
2145 Insert { pos: 0, content: 0 },
2146 Delete { pos: 91, len: 238 },
2147 Delete { pos: 238, len: 238 },
2148 Delete { pos: 238, len: 238 },
2149 Delete { pos: 238, len: 18 },
2150 Delete { pos: 238, len: 238 },
2151 Delete { pos: 238, len: 238 },
2152 Insert {
2153 pos: 123,
2154 content: 123,
2155 },
2156 Insert {
2157 pos: 121,
2158 content: 86,
2159 },
2160 Insert {
2161 pos: 123,
2162 content: 123,
2163 },
2164 Insert {
2165 pos: 86,
2166 content: 254,
2167 },
2168 Insert {
2169 pos: 123,
2170 content: 123,
2171 },
2172 Insert {
2173 pos: 123,
2174 content: 123,
2175 },
2176 Insert {
2177 pos: 123,
2178 content: 123,
2179 },
2180 Insert {
2181 pos: 0,
2182 content: 123,
2183 },
2184 Delete { pos: 238, len: 238 },
2185 Delete { pos: 238, len: 238 },
2186 Delete { pos: 91, len: 238 },
2187 Delete { pos: 238, len: 238 },
2188 Delete { pos: 238, len: 238 },
2189 Delete { pos: 238, len: 238 },
2190 Delete { pos: 238, len: 123 },
2191 Delete { pos: 238, len: 238 },
2192 Insert {
2193 pos: 121,
2194 content: 86,
2195 },
2196 Insert {
2197 pos: 123,
2198 content: 123,
2199 },
2200 Delete { pos: 238, len: 238 },
2201 Delete { pos: 238, len: 238 },
2202 Insert {
2203 pos: 123,
2204 content: 123,
2205 },
2206 Insert {
2207 pos: 86,
2208 content: 86,
2209 },
2210 Insert {
2211 pos: 202,
2212 content: 238,
2213 },
2214 Delete { pos: 238, len: 238 },
2215 Insert {
2216 pos: 123,
2217 content: 2,
2218 },
2219 Insert {
2220 pos: 254,
2221 content: 123,
2222 },
2223 Insert { pos: 0, content: 0 },
2224 Insert {
2225 pos: 123,
2226 content: 123,
2227 },
2228 Delete { pos: 238, len: 238 },
2229 Delete { pos: 255, len: 101 },
2230 Delete { pos: 238, len: 238 },
2231 Delete { pos: 238, len: 238 },
2232 Insert {
2233 pos: 238,
2234 content: 123,
2235 },
2236 Delete { pos: 123, len: 238 },
2237 Delete { pos: 238, len: 238 },
2238 Insert {
2239 pos: 123,
2240 content: 123,
2241 },
2242 Insert {
2243 pos: 102,
2244 content: 102,
2245 },
2246 Insert {
2247 pos: 102,
2248 content: 102,
2249 },
2250 Insert {
2251 pos: 102,
2252 content: 123,
2253 },
2254 Insert {
2255 pos: 238,
2256 content: 238,
2257 },
2258 Delete { pos: 238, len: 238 },
2259 Insert {
2260 pos: 123,
2261 content: 123,
2262 },
2263 Insert {
2264 pos: 123,
2265 content: 123,
2266 },
2267 Insert {
2268 pos: 123,
2269 content: 123,
2270 },
2271 Insert {
2272 pos: 123,
2273 content: 123,
2274 },
2275 Delete { pos: 255, len: 255 },
2276 Delete { pos: 238, len: 238 },
2277 Delete { pos: 238, len: 238 },
2278 Delete { pos: 1, len: 0 },
2279 Insert { pos: 0, content: 7 },
2280 Insert {
2281 pos: 108,
2282 content: 108,
2283 },
2284 Insert { pos: 0, content: 0 },
2285 Insert {
2286 pos: 108,
2287 content: 108,
2288 },
2289 Delete { pos: 171, len: 171 },
2290 Delete { pos: 171, len: 171 },
2291 Delete { pos: 171, len: 171 },
2292 Delete { pos: 171, len: 171 },
2293 Delete { pos: 171, len: 171 },
2294 Delete { pos: 171, len: 171 },
2295 Delete { pos: 171, len: 108 },
2296 Insert {
2297 pos: 108,
2298 content: 108,
2299 },
2300 Insert { pos: 0, content: 0 },
2301 Insert {
2302 pos: 235,
2303 content: 235,
2304 },
2305 Insert {
2306 pos: 108,
2307 content: 108,
2308 },
2309 Insert { pos: 0, content: 0 },
2310 Insert {
2311 pos: 111,
2312 content: 111,
2313 },
2314 Delete { pos: 154, len: 171 },
2315 Delete { pos: 171, len: 171 },
2316 Delete { pos: 171, len: 171 },
2317 Delete { pos: 171, len: 171 },
2318 Insert {
2319 pos: 171,
2320 content: 8,
2321 },
2322 Delete { pos: 171, len: 249 },
2323 Insert {
2324 pos: 135,
2325 content: 169,
2326 },
2327 Delete { pos: 171, len: 171 },
2328 Delete { pos: 171, len: 171 },
2329 Insert {
2330 pos: 87,
2331 content: 84,
2332 },
2333 Delete { pos: 171, len: 171 },
2334 Delete { pos: 171, len: 171 },
2335 Delete { pos: 171, len: 171 },
2336 Delete { pos: 171, len: 171 },
2337 Delete { pos: 238, len: 238 },
2338 Delete { pos: 11, len: 238 },
2339 Insert { pos: 0, content: 0 },
2340 Delete { pos: 41, len: 238 },
2341 Delete { pos: 238, len: 238 },
2342 Delete { pos: 238, len: 238 },
2343 Delete { pos: 238, len: 238 },
2344 Delete { pos: 238, len: 238 },
2345 Delete { pos: 238, len: 238 },
2346 Delete { pos: 171, len: 0 },
2347 Insert {
2348 pos: 108,
2349 content: 108,
2350 },
2351 Insert { pos: 0, content: 0 },
2352 Insert {
2353 pos: 0,
2354 content: 108,
2355 },
2356 Delete { pos: 63, len: 171 },
2357 Delete { pos: 171, len: 171 },
2358 Delete { pos: 171, len: 171 },
2359 Delete { pos: 171, len: 171 },
2360 Delete { pos: 157, len: 157 },
2361 Delete { pos: 171, len: 171 },
2362 Delete { pos: 171, len: 171 },
2363 Delete { pos: 108, len: 0 },
2364 Insert {
2365 pos: 108,
2366 content: 108,
2367 },
2368 Insert { pos: 0, content: 0 },
2369 Delete { pos: 235, len: 235 },
2370 Insert {
2371 pos: 108,
2372 content: 108,
2373 },
2374 Insert {
2375 pos: 0,
2376 content: 248,
2377 },
2378 Delete { pos: 154, len: 127 },
2379 Delete { pos: 171, len: 171 },
2380 Delete { pos: 171, len: 0 },
2381 Delete { pos: 171, len: 171 },
2382 Delete { pos: 171, len: 171 },
2383 Delete { pos: 8, len: 0 },
2384 Delete { pos: 249, len: 1 },
2385 Delete { pos: 169, len: 235 },
2386 Delete { pos: 171, len: 171 },
2387 Delete { pos: 171, len: 171 },
2388 Insert {
2389 pos: 84,
2390 content: 84,
2391 },
2392 Delete { pos: 171, len: 171 },
2393 Delete { pos: 171, len: 171 },
2394 Delete { pos: 171, len: 171 },
2395 Delete { pos: 171, len: 171 },
2396 Delete { pos: 171, len: 171 },
2397 Insert { pos: 0, content: 8 },
2398 Insert {
2399 pos: 108,
2400 content: 108,
2401 },
2402 Insert {
2403 pos: 108,
2404 content: 49,
2405 },
2406 Delete { pos: 235, len: 108 },
2407 Insert {
2408 pos: 108,
2409 content: 108,
2410 },
2411 Insert {
2412 pos: 0,
2413 content: 249,
2414 },
2415 Insert {
2416 pos: 135,
2417 content: 169,
2418 },
2419 Delete { pos: 238, len: 123 },
2420 Insert { pos: 2, content: 0 },
2421 Insert { pos: 0, content: 0 },
2422 Insert {
2423 pos: 121,
2424 content: 86,
2425 },
2426 Insert {
2427 pos: 123,
2428 content: 123,
2429 },
2430 Insert {
2431 pos: 123,
2432 content: 123,
2433 },
2434 Insert {
2435 pos: 123,
2436 content: 123,
2437 },
2438 Insert {
2439 pos: 123,
2440 content: 1,
2441 },
2442 Delete { pos: 238, len: 238 },
2443 Insert {
2444 pos: 238,
2445 content: 238,
2446 },
2447 Delete { pos: 238, len: 238 },
2448 Insert {
2449 pos: 193,
2450 content: 192,
2451 },
2452 Delete { pos: 63, len: 127 },
2453 Insert {
2454 pos: 0,
2455 content: 235,
2456 },
2457 Insert {
2458 pos: 108,
2459 content: 108,
2460 },
2461 Insert {
2462 pos: 87,
2463 content: 0,
2464 },
2465 Delete { pos: 1, len: 111 },
2466 Delete { pos: 235, len: 154 },
2467 Delete { pos: 171, len: 171 },
2468 Delete { pos: 171, len: 171 },
2469 Delete { pos: 171, len: 171 },
2470 Delete { pos: 0, len: 171 },
2471 Delete { pos: 171, len: 171 },
2472 Insert {
2473 pos: 127,
2474 content: 135,
2475 },
2476 Delete { pos: 171, len: 171 },
2477 Delete { pos: 171, len: 171 },
2478 Delete { pos: 171, len: 171 },
2479 Delete { pos: 171, len: 171 },
2480 Insert { pos: 0, content: 0 },
2481 Insert {
2482 pos: 108,
2483 content: 108,
2484 },
2485 Insert {
2486 pos: 108,
2487 content: 108,
2488 },
2489 Delete { pos: 235, len: 235 },
2490 Insert {
2491 pos: 108,
2492 content: 108,
2493 },
2494 Insert { pos: 0, content: 0 },
2495 Insert {
2496 pos: 127,
2497 content: 135,
2498 },
2499 Delete { pos: 171, len: 171 },
2500 Delete { pos: 171, len: 172 },
2501 Delete { pos: 171, len: 171 },
2502 Delete { pos: 171, len: 171 },
2503 Delete { pos: 171, len: 0 },
2504 Insert { pos: 0, content: 0 },
2505 Insert {
2506 pos: 0,
2507 content: 171,
2508 },
2509 Delete { pos: 171, len: 171 },
2510 Delete { pos: 171, len: 171 },
2511 Delete { pos: 171, len: 171 },
2512 Delete { pos: 171, len: 171 },
2513 Delete { pos: 171, len: 171 },
2514 Delete { pos: 171, len: 171 },
2515 Delete { pos: 171, len: 171 },
2516 Delete { pos: 171, len: 171 },
2517 Delete { pos: 171, len: 171 },
2518 Delete { pos: 171, len: 171 },
2519 Delete { pos: 171, len: 108 },
2520 Insert {
2521 pos: 108,
2522 content: 108,
2523 },
2524 Insert {
2525 pos: 108,
2526 content: 108,
2527 },
2528 Insert {
2529 pos: 235,
2530 content: 235,
2531 },
2532 Insert {
2533 pos: 108,
2534 content: 108,
2535 },
2536 Insert { pos: 0, content: 0 },
2537 Insert {
2538 pos: 111,
2539 content: 111,
2540 },
2541 Delete { pos: 171, len: 0 },
2542 Insert {
2543 pos: 48,
2544 content: 111,
2545 },
2546 Delete { pos: 154, len: 171 },
2547 Delete { pos: 171, len: 171 },
2548 Delete { pos: 171, len: 171 },
2549 Delete { pos: 171, len: 171 },
2550 Delete { pos: 171, len: 171 },
2551 Delete { pos: 171, len: 171 },
2552 Insert {
2553 pos: 84,
2554 content: 84,
2555 },
2556 Delete { pos: 171, len: 171 },
2557 Delete { pos: 171, len: 171 },
2558 Delete { pos: 171, len: 171 },
2559 Delete { pos: 171, len: 171 },
2560 Delete { pos: 171, len: 171 },
2561 Delete { pos: 171, len: 171 },
2562 Delete { pos: 171, len: 171 },
2563 Delete { pos: 171, len: 235 },
2564 Delete { pos: 254, len: 86 },
2565 Insert {
2566 pos: 108,
2567 content: 108,
2568 },
2569 Insert {
2570 pos: 108,
2571 content: 108,
2572 },
2573 Insert { pos: 0, content: 8 },
2574 Insert {
2575 pos: 108,
2576 content: 171,
2577 },
2578 Delete { pos: 171, len: 171 },
2579 Delete { pos: 171, len: 20 },
2580 Delete { pos: 171, len: 108 },
2581 Insert {
2582 pos: 108,
2583 content: 108,
2584 },
2585 Insert {
2586 pos: 108,
2587 content: 108,
2588 },
2589 Insert {
2590 pos: 235,
2591 content: 235,
2592 },
2593 Insert {
2594 pos: 108,
2595 content: 108,
2596 },
2597 Insert { pos: 0, content: 0 },
2598 Insert {
2599 pos: 111,
2600 content: 111,
2601 },
2602 Delete { pos: 154, len: 171 },
2603 Delete { pos: 171, len: 171 },
2604 Delete { pos: 171, len: 171 },
2605 Delete { pos: 123, len: 123 },
2606 Insert {
2607 pos: 86,
2608 content: 86,
2609 },
2610 Insert {
2611 pos: 123,
2612 content: 123,
2613 },
2614 Insert {
2615 pos: 123,
2616 content: 123,
2617 },
2618 Insert {
2619 pos: 123,
2620 content: 238,
2621 },
2622 Delete { pos: 238, len: 238 },
2623 Insert {
2624 pos: 123,
2625 content: 36,
2626 },
2627 Insert {
2628 pos: 123,
2629 content: 123,
2630 },
2631 Insert {
2632 pos: 123,
2633 content: 123,
2634 },
2635 Insert {
2636 pos: 123,
2637 content: 123,
2638 },
2639 Insert {
2640 pos: 254,
2641 content: 255,
2642 },
2643 Delete { pos: 238, len: 238 },
2644 Delete { pos: 238, len: 238 },
2645 Delete { pos: 238, len: 238 },
2646 Delete { pos: 238, len: 123 },
2647 Insert { pos: 0, content: 0 },
2648 Insert { pos: 0, content: 0 },
2649 Delete { pos: 238, len: 238 },
2650 Delete { pos: 238, len: 238 },
2651 Delete { pos: 238, len: 238 },
2652 Delete { pos: 123, len: 123 },
2653 Insert {
2654 pos: 238,
2655 content: 238,
2656 },
2657 Delete { pos: 238, len: 238 },
2658 Delete { pos: 238, len: 238 },
2659 Insert {
2660 pos: 238,
2661 content: 238,
2662 },
2663 Insert { pos: 0, content: 0 },
2664 Delete { pos: 91, len: 238 },
2665 Delete { pos: 238, len: 238 },
2666 Delete { pos: 238, len: 238 },
2667 Delete { pos: 238, len: 238 },
2668 Insert { pos: 0, content: 0 },
2669 Delete { pos: 238, len: 238 },
2670 Delete { pos: 238, len: 238 },
2671 Insert { pos: 0, content: 0 },
2672 Insert {
2673 pos: 238,
2674 content: 238,
2675 },
2676 Insert {
2677 pos: 108,
2678 content: 108,
2679 },
2680 Delete { pos: 238, len: 238 },
2681 Delete { pos: 238, len: 238 },
2682 Insert {
2683 pos: 123,
2684 content: 2,
2685 },
2686 Insert { pos: 0, content: 0 },
2687 Insert {
2688 pos: 238,
2689 content: 238,
2690 },
2691 Insert {
2692 pos: 0,
2693 content: 238,
2694 },
2695 Delete { pos: 238, len: 238 },
2696 Delete { pos: 0, len: 249 },
2697 Insert {
2698 pos: 135,
2699 content: 255,
2700 },
2701 Delete { pos: 255, len: 255 },
2702 Delete { pos: 144, len: 255 },
2703 Delete { pos: 169, len: 169 },
2704 ])
2705 }
2706
2707 #[test]
2708 fn ben() {
2709 use arbitrary::Arbitrary;
2710 #[derive(Arbitrary, Debug, Clone, Copy)]
2711 enum Action {
2712 Insert { pos: u8, content: u8 },
2713 Delete { pos: u8, len: u8 },
2714 }
2715
2716 use rand::{Rng, SeedableRng};
2717 let mut rng = rand::rngs::StdRng::seed_from_u64(123);
2718 let mut expected = String::new();
2719 let unstructured: Vec<u8> = (0..10_000).map(|_| rng.gen()).collect();
2720 let mut gen = arbitrary::Unstructured::new(&unstructured);
2721 let actions: [Action; 1_000] = gen.arbitrary().unwrap();
2722 let mut rope = Rope::new();
2723 for action in actions.iter() {
2724 match *action {
2725 Action::Insert { pos, content } => {
2726 let pos = pos as usize % (rope.len() + 1);
2727 let s = content.to_string();
2728 expected.insert_str(pos, &s);
2729 rope.insert(pos, &s);
2730 assert_eq!(expected.len(), rope.len());
2731 }
2732 Action::Delete { pos, len } => {
2733 let pos = pos as usize % (rope.len() + 1);
2734 let mut len = len as usize % 10;
2735 len = len.min(rope.len() - pos);
2736 expected.drain(pos..pos + len);
2737 rope.delete_range(pos..(pos + len));
2738 assert_eq!(expected.len(), rope.len());
2739 }
2740 }
2741 }
2742 assert_eq!(rope.to_string(), expected);
2743 }
2744
2745 #[test]
2746 fn fuzz_7() {
2747 fuzz(vec![
2748 Insert {
2749 pos: 111,
2750 content: 111,
2751 },
2752 Insert { pos: 0, content: 0 },
2753 Insert { pos: 0, content: 0 },
2754 Insert { pos: 0, content: 0 },
2755 Insert { pos: 0, content: 0 },
2756 Insert { pos: 0, content: 0 },
2757 Insert {
2758 pos: 108,
2759 content: 108,
2760 },
2761 Insert {
2762 pos: 108,
2763 content: 108,
2764 },
2765 Insert {
2766 pos: 108,
2767 content: 255,
2768 },
2769 Delete { pos: 255, len: 0 },
2770 Insert {
2771 pos: 140,
2772 content: 140,
2773 },
2774 Insert {
2775 pos: 102,
2776 content: 101,
2777 },
2778 Insert {
2779 pos: 36,
2780 content: 146,
2781 },
2782 Insert {
2783 pos: 102,
2784 content: 119,
2785 },
2786 Insert {
2787 pos: 118,
2788 content: 119,
2789 },
2790 Insert {
2791 pos: 119,
2792 content: 119,
2793 },
2794 Insert {
2795 pos: 21,
2796 content: 0,
2797 },
2798 Insert {
2799 pos: 140,
2800 content: 140,
2801 },
2802 Insert {
2803 pos: 107,
2804 content: 19,
2805 },
2806 Insert {
2807 pos: 102,
2808 content: 47,
2809 },
2810 Insert { pos: 0, content: 0 },
2811 Insert {
2812 pos: 0,
2813 content: 102,
2814 },
2815 Insert { pos: 0, content: 0 },
2816 Insert {
2817 pos: 0,
2818 content: 102,
2819 },
2820 Insert {
2821 pos: 102,
2822 content: 64,
2823 },
2824 Insert {
2825 pos: 64,
2826 content: 64,
2827 },
2828 Insert {
2829 pos: 64,
2830 content: 64,
2831 },
2832 Insert {
2833 pos: 64,
2834 content: 64,
2835 },
2836 Insert {
2837 pos: 64,
2838 content: 64,
2839 },
2840 Insert {
2841 pos: 64,
2842 content: 64,
2843 },
2844 Insert {
2845 pos: 64,
2846 content: 64,
2847 },
2848 Insert {
2849 pos: 123,
2850 content: 123,
2851 },
2852 Delete { pos: 255, len: 136 },
2853 Delete { pos: 119, len: 111 },
2854 Insert {
2855 pos: 102,
2856 content: 102,
2857 },
2858 Insert {
2859 pos: 3,
2860 content: 73,
2861 },
2862 Insert {
2863 pos: 146,
2864 content: 74,
2865 },
2866 Delete { pos: 255, len: 255 },
2867 Delete { pos: 0, len: 102 },
2868 Insert {
2869 pos: 102,
2870 content: 102,
2871 },
2872 Insert {
2873 pos: 102,
2874 content: 102,
2875 },
2876 Insert {
2877 pos: 119,
2878 content: 119,
2879 },
2880 Insert {
2881 pos: 119,
2882 content: 119,
2883 },
2884 Insert { pos: 0, content: 0 },
2885 Delete { pos: 255, len: 255 },
2886 Insert { pos: 0, content: 0 },
2887 Insert {
2888 pos: 0,
2889 content: 255,
2890 },
2891 Delete { pos: 111, len: 108 },
2892 Insert {
2893 pos: 119,
2894 content: 119,
2895 },
2896 Insert {
2897 pos: 119,
2898 content: 119,
2899 },
2900 Insert {
2901 pos: 119,
2902 content: 119,
2903 },
2904 Insert {
2905 pos: 102,
2906 content: 102,
2907 },
2908 Insert {
2909 pos: 83,
2910 content: 108,
2911 },
2912 Insert {
2913 pos: 111,
2914 content: 111,
2915 },
2916 Insert {
2917 pos: 119,
2918 content: 21,
2919 },
2920 Insert {
2921 pos: 119,
2922 content: 119,
2923 },
2924 Insert {
2925 pos: 64,
2926 content: 64,
2927 },
2928 Insert {
2929 pos: 64,
2930 content: 64,
2931 },
2932 Insert {
2933 pos: 64,
2934 content: 64,
2935 },
2936 Insert {
2937 pos: 55,
2938 content: 119,
2939 },
2940 Insert {
2941 pos: 119,
2942 content: 119,
2943 },
2944 Insert { pos: 0, content: 0 },
2945 Insert {
2946 pos: 119,
2947 content: 119,
2948 },
2949 Insert {
2950 pos: 123,
2951 content: 123,
2952 },
2953 Insert {
2954 pos: 121,
2955 content: 86,
2956 },
2957 Insert {
2958 pos: 123,
2959 content: 123,
2960 },
2961 Insert {
2962 pos: 125,
2963 content: 125,
2964 },
2965 Insert {
2966 pos: 125,
2967 content: 125,
2968 },
2969 Insert {
2970 pos: 125,
2971 content: 125,
2972 },
2973 Insert {
2974 pos: 125,
2975 content: 125,
2976 },
2977 Insert {
2978 pos: 125,
2979 content: 125,
2980 },
2981 Insert {
2982 pos: 125,
2983 content: 125,
2984 },
2985 Insert {
2986 pos: 125,
2987 content: 125,
2988 },
2989 Insert {
2990 pos: 125,
2991 content: 125,
2992 },
2993 Insert {
2994 pos: 125,
2995 content: 125,
2996 },
2997 Insert {
2998 pos: 125,
2999 content: 125,
3000 },
3001 Insert {
3002 pos: 125,
3003 content: 125,
3004 },
3005 Insert {
3006 pos: 125,
3007 content: 125,
3008 },
3009 Insert {
3010 pos: 125,
3011 content: 125,
3012 },
3013 Insert {
3014 pos: 125,
3015 content: 125,
3016 },
3017 Insert {
3018 pos: 125,
3019 content: 125,
3020 },
3021 Delete { pos: 130, len: 130 },
3022 Insert {
3023 pos: 125,
3024 content: 125,
3025 },
3026 Insert {
3027 pos: 125,
3028 content: 125,
3029 },
3030 Insert {
3031 pos: 125,
3032 content: 125,
3033 },
3034 Insert {
3035 pos: 123,
3036 content: 123,
3037 },
3038 Insert {
3039 pos: 123,
3040 content: 123,
3041 },
3042 Insert {
3043 pos: 119,
3044 content: 119,
3045 },
3046 Insert {
3047 pos: 96,
3048 content: 102,
3049 },
3050 Insert {
3051 pos: 119,
3052 content: 119,
3053 },
3054 Insert {
3055 pos: 156,
3056 content: 111,
3057 },
3058 Insert {
3059 pos: 123,
3060 content: 37,
3061 },
3062 Insert {
3063 pos: 123,
3064 content: 123,
3065 },
3066 Insert {
3067 pos: 123,
3068 content: 123,
3069 },
3070 Insert {
3071 pos: 37,
3072 content: 121,
3073 },
3074 Insert {
3075 pos: 123,
3076 content: 123,
3077 },
3078 Insert {
3079 pos: 125,
3080 content: 125,
3081 },
3082 Insert {
3083 pos: 125,
3084 content: 125,
3085 },
3086 Insert {
3087 pos: 125,
3088 content: 125,
3089 },
3090 Insert {
3091 pos: 125,
3092 content: 125,
3093 },
3094 Insert {
3095 pos: 125,
3096 content: 125,
3097 },
3098 Insert {
3099 pos: 125,
3100 content: 125,
3101 },
3102 Insert {
3103 pos: 125,
3104 content: 125,
3105 },
3106 Insert {
3107 pos: 125,
3108 content: 125,
3109 },
3110 Insert {
3111 pos: 125,
3112 content: 125,
3113 },
3114 Insert {
3115 pos: 125,
3116 content: 125,
3117 },
3118 Insert {
3119 pos: 123,
3120 content: 123,
3121 },
3122 Insert {
3123 pos: 121,
3124 content: 86,
3125 },
3126 Insert {
3127 pos: 123,
3128 content: 123,
3129 },
3130 Insert {
3131 pos: 125,
3132 content: 125,
3133 },
3134 Insert {
3135 pos: 125,
3136 content: 125,
3137 },
3138 Insert {
3139 pos: 125,
3140 content: 125,
3141 },
3142 Insert {
3143 pos: 125,
3144 content: 125,
3145 },
3146 Insert {
3147 pos: 125,
3148 content: 125,
3149 },
3150 Insert {
3151 pos: 125,
3152 content: 125,
3153 },
3154 Insert {
3155 pos: 125,
3156 content: 125,
3157 },
3158 Insert {
3159 pos: 125,
3160 content: 125,
3161 },
3162 Insert {
3163 pos: 125,
3164 content: 125,
3165 },
3166 Insert {
3167 pos: 125,
3168 content: 125,
3169 },
3170 Insert {
3171 pos: 125,
3172 content: 125,
3173 },
3174 Insert {
3175 pos: 125,
3176 content: 125,
3177 },
3178 Insert {
3179 pos: 125,
3180 content: 125,
3181 },
3182 Insert {
3183 pos: 125,
3184 content: 125,
3185 },
3186 Insert {
3187 pos: 125,
3188 content: 125,
3189 },
3190 Insert {
3191 pos: 125,
3192 content: 125,
3193 },
3194 Insert {
3195 pos: 125,
3196 content: 125,
3197 },
3198 Insert {
3199 pos: 125,
3200 content: 125,
3201 },
3202 Insert {
3203 pos: 125,
3204 content: 125,
3205 },
3206 Insert {
3207 pos: 125,
3208 content: 125,
3209 },
3210 Insert {
3211 pos: 125,
3212 content: 125,
3213 },
3214 Insert {
3215 pos: 125,
3216 content: 125,
3217 },
3218 Insert {
3219 pos: 125,
3220 content: 125,
3221 },
3222 Insert {
3223 pos: 125,
3224 content: 125,
3225 },
3226 Insert {
3227 pos: 125,
3228 content: 125,
3229 },
3230 Insert {
3231 pos: 125,
3232 content: 123,
3233 },
3234 Insert {
3235 pos: 125,
3236 content: 125,
3237 },
3238 Insert {
3239 pos: 125,
3240 content: 125,
3241 },
3242 Insert {
3243 pos: 125,
3244 content: 125,
3245 },
3246 Insert {
3247 pos: 125,
3248 content: 125,
3249 },
3250 Insert {
3251 pos: 125,
3252 content: 125,
3253 },
3254 Insert {
3255 pos: 125,
3256 content: 125,
3257 },
3258 Insert {
3259 pos: 125,
3260 content: 125,
3261 },
3262 Insert {
3263 pos: 125,
3264 content: 125,
3265 },
3266 Delete { pos: 239, len: 239 },
3267 Insert {
3268 pos: 125,
3269 content: 125,
3270 },
3271 Insert {
3272 pos: 125,
3273 content: 125,
3274 },
3275 Insert {
3276 pos: 125,
3277 content: 125,
3278 },
3279 Insert {
3280 pos: 125,
3281 content: 125,
3282 },
3283 Insert {
3284 pos: 125,
3285 content: 125,
3286 },
3287 Insert {
3288 pos: 125,
3289 content: 125,
3290 },
3291 Insert {
3292 pos: 125,
3293 content: 125,
3294 },
3295 Insert {
3296 pos: 125,
3297 content: 125,
3298 },
3299 Insert {
3300 pos: 125,
3301 content: 125,
3302 },
3303 Insert {
3304 pos: 125,
3305 content: 125,
3306 },
3307 Insert {
3308 pos: 125,
3309 content: 125,
3310 },
3311 Insert {
3312 pos: 125,
3313 content: 125,
3314 },
3315 Insert {
3316 pos: 125,
3317 content: 125,
3318 },
3319 Insert {
3320 pos: 125,
3321 content: 125,
3322 },
3323 Insert {
3324 pos: 125,
3325 content: 125,
3326 },
3327 Insert {
3328 pos: 125,
3329 content: 125,
3330 },
3331 Insert {
3332 pos: 125,
3333 content: 123,
3334 },
3335 Insert {
3336 pos: 123,
3337 content: 123,
3338 },
3339 Insert {
3340 pos: 123,
3341 content: 0,
3342 },
3343 Delete { pos: 255, len: 255 },
3344 Delete { pos: 255, len: 255 },
3345 Delete { pos: 255, len: 255 },
3346 Delete { pos: 255, len: 255 },
3347 Delete { pos: 255, len: 255 },
3348 Delete { pos: 255, len: 255 },
3349 Delete { pos: 255, len: 255 },
3350 Delete { pos: 125, len: 125 },
3351 Insert {
3352 pos: 125,
3353 content: 125,
3354 },
3355 Insert {
3356 pos: 125,
3357 content: 125,
3358 },
3359 Insert {
3360 pos: 125,
3361 content: 125,
3362 },
3363 Insert {
3364 pos: 125,
3365 content: 125,
3366 },
3367 Insert {
3368 pos: 123,
3369 content: 123,
3370 },
3371 Insert {
3372 pos: 118,
3373 content: 118,
3374 },
3375 Insert {
3376 pos: 255,
3377 content: 255,
3378 },
3379 Insert {
3380 pos: 119,
3381 content: 119,
3382 },
3383 Insert {
3384 pos: 102,
3385 content: 102,
3386 },
3387 Delete { pos: 209, len: 255 },
3388 Delete { pos: 255, len: 255 },
3389 ])
3390 }
3391
3392 #[test]
3393 fn from_str() {
3394 for i in 0..100000 {
3395 let s = i.to_string();
3396 let mut g = GapBuffer::from_str(&s);
3397 assert_eq!(s.len(), g.next().unwrap().len());
3398 }
3399 }
3400
3401 #[test]
3402 fn from_iter() {
3403 let mut v = vec![];
3404 for i in 0..100000 {
3405 v.push(i.to_string());
3406 }
3407
3408 let rope = Rope {
3409 tree: v
3410 .iter()
3411 .flat_map(|x| GapBuffer::from_str(x.as_str()))
3412 .collect(),
3413 cursor: None,
3414 };
3415
3416 let s = v.join("");
3417 assert_eq!(rope.to_string(), s);
3418 assert_eq!(rope.len(), s.len());
3419 rope.tree.check();
3420 }
3421
3422 #[test]
3423 fn drain() {
3424 let mut rope = Rope::new();
3425 for i in 0..100000 {
3426 rope.insert(0, &i.to_string());
3427 }
3428
3429 while !rope.is_empty() {
3430 let leaf = rope.tree.first_leaf();
3431 rope.tree.update_leaf(leaf.unwrap(), |elem| {
3432 elem.slice_(1..1);
3433 (true, None, None)
3434 });
3435 }
3436 }
3437
3438 #[test]
3439 fn fuzz_empty() {
3440 fuzz(vec![])
3441 }
3442}