1use std::borrow::Borrow;
4use std::fmt::{Debug, Display};
5use std::ops::{
6 Add, AddAssign, BitAnd, BitAndAssign, BitOr, BitOrAssign, Not, RangeInclusive, Sub, SubAssign,
7};
8
9use serde::Serialize;
10use smallvec::SmallVec;
11
12pub type BlockRange = RangeInclusive<u64>;
16
17#[derive(Debug, thiserror::Error, PartialEq, Eq)]
19pub enum BlockRangesError {
20 #[error("Block ranges are not sorted")]
22 UnsortedBlockRanges,
23
24 #[error("Invalid block range: {}", .0.display())]
26 InvalidBlockRange(BlockRange),
27
28 #[error("Insertion constrain not satisfied: Provided range ({}) overlaps with {}", .0.display(), .1.display())]
30 BlockRangeOverlap(BlockRange, BlockRange),
31
32 #[error(
34 "Insertion constrain not satified: Provided range ({}) do not have any adjacent neighbors", .0.display()
35 )]
36 NoAdjacentNeighbors(BlockRange),
37}
38
39type Result<T, E = BlockRangesError> = std::result::Result<T, E>;
40
41pub(crate) trait BlockRangeExt {
42 fn display(&self) -> BlockRangeDisplay<'_>;
43 fn validate(&self) -> Result<()>;
44 fn len(&self) -> u64;
45 fn is_adjacent(&self, other: &BlockRange) -> bool;
46 fn is_overlapping(&self, other: &BlockRange) -> bool;
47 fn is_left_of(&self, other: &BlockRange) -> bool;
48 fn is_right_of(&self, other: &BlockRange) -> bool;
49 fn headn(&self, limit: u64) -> Self;
50 fn tailn(&self, limit: u64) -> Self;
51}
52
53pub(crate) struct BlockRangeDisplay<'a>(&'a RangeInclusive<u64>);
54
55impl Display for BlockRangeDisplay<'_> {
56 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
57 write!(f, "{}-{}", self.0.start(), self.0.end())
58 }
59}
60
61impl BlockRangeExt for BlockRange {
62 fn display(&self) -> BlockRangeDisplay<'_> {
63 BlockRangeDisplay(self)
64 }
65
66 fn validate(&self) -> Result<()> {
67 if *self.start() > 0 && self.start() <= self.end() {
68 Ok(())
69 } else {
70 Err(BlockRangesError::InvalidBlockRange(self.to_owned()))
71 }
72 }
73
74 fn len(&self) -> u64 {
75 match self.end().checked_sub(*self.start()) {
76 Some(difference) => difference + 1,
77 None => 0,
78 }
79 }
80
81 fn is_adjacent(&self, other: &BlockRange) -> bool {
82 debug_assert!(self.validate().is_ok());
83 debug_assert!(other.validate().is_ok());
84
85 if *self.end() == other.start().saturating_sub(1) {
90 return true;
91 }
92
93 if self.start().saturating_sub(1) == *other.end() {
98 return true;
99 }
100
101 false
102 }
103
104 fn is_overlapping(&self, other: &BlockRange) -> bool {
105 debug_assert!(self.validate().is_ok());
106 debug_assert!(other.validate().is_ok());
107
108 if self.start() < other.start() && other.contains(self.end()) {
113 return true;
114 }
115
116 if self.end() > other.end() && other.contains(self.start()) {
121 return true;
122 }
123
124 if self.start() >= other.start() && self.end() <= other.end() {
129 return true;
130 }
131
132 if self.start() <= other.start() && self.end() >= other.end() {
137 return true;
138 }
139
140 false
141 }
142
143 fn is_left_of(&self, other: &BlockRange) -> bool {
145 debug_assert!(self.validate().is_ok());
146 debug_assert!(other.validate().is_ok());
147 self.end() < other.start()
148 }
149
150 fn is_right_of(&self, other: &BlockRange) -> bool {
152 debug_assert!(self.validate().is_ok());
153 debug_assert!(other.validate().is_ok());
154 other.end() < self.start()
155 }
156
157 fn headn(&self, limit: u64) -> Self {
159 if self.is_empty() {
160 return RangeInclusive::new(1, 0);
161 }
162 let start = *self.start();
163 let end = *self.end();
164
165 let Some(adjusted_start) = end.saturating_sub(limit).checked_add(1) else {
166 return RangeInclusive::new(1, 0);
168 };
169
170 u64::max(start, adjusted_start)..=end
171 }
172
173 fn tailn(&self, limit: u64) -> Self {
175 if self.is_empty() {
176 return RangeInclusive::new(1, 0);
177 }
178 let start = *self.start();
179 let end = *self.end();
180
181 let Some(adjusted_end) = start.saturating_add(limit).checked_sub(1) else {
182 return RangeInclusive::new(1, 0);
183 };
184
185 start..=u64::min(end, adjusted_end)
186 }
187}
188
189#[derive(Debug, Clone, PartialEq, Default, Serialize)]
191#[serde(transparent)]
192pub struct BlockRanges(SmallVec<[BlockRange; 2]>);
193
194impl<'de> serde::Deserialize<'de> for BlockRanges {
196 fn deserialize<D>(deserializer: D) -> Result<BlockRanges, D::Error>
197 where
198 D: serde::de::Deserializer<'de>,
199 {
200 let raw_ranges = SmallVec::<[RangeInclusive<u64>; 2]>::deserialize(deserializer)?;
201 let ranges = BlockRanges::from_vec(raw_ranges)
202 .map_err(|e| serde::de::Error::custom(e.to_string()))?;
203 Ok(ranges)
204 }
205}
206
207impl BlockRanges {
208 pub fn new() -> BlockRanges {
210 BlockRanges(SmallVec::new())
211 }
212
213 pub fn from_vec(ranges: SmallVec<[BlockRange; 2]>) -> Result<Self> {
215 let mut prev: Option<&RangeInclusive<u64>> = None;
216
217 for range in &ranges {
218 range.validate()?;
219
220 if let Some(prev) = prev {
221 if range.start() <= prev.end() {
222 return Err(BlockRangesError::UnsortedBlockRanges);
223 }
224 }
225
226 prev = Some(range);
227 }
228
229 Ok(BlockRanges(ranges))
230 }
231
232 pub fn into_inner(self) -> SmallVec<[BlockRange; 2]> {
234 self.0
235 }
236
237 pub fn contains(&self, height: u64) -> bool {
239 self.0.iter().any(|r| r.contains(&height))
240 }
241
242 pub fn len(&self) -> u64 {
244 self.0.iter().map(|r| r.len()).sum()
245 }
246
247 pub fn is_empty(&self) -> bool {
249 self.0.iter().all(|r| r.is_empty())
250 }
251
252 pub fn head(&self) -> Option<u64> {
254 self.0.last().map(|r| *r.end())
255 }
256
257 pub(crate) fn headn(&self, limit: u64) -> BlockRanges {
258 let mut truncated = BlockRanges::new();
259 let mut len = 0;
260
261 for range in self.0.iter().rev() {
262 if len == limit {
263 break;
264 }
265
266 let r = range.headn(limit - len);
267
268 len += r.len();
269 truncated
270 .insert_relaxed(r)
271 .expect("BlockRanges always holds valid ranges");
272
273 debug_assert_eq!(truncated.len(), len);
274 debug_assert!(len <= limit);
275 }
276
277 truncated
278 }
279
280 pub fn tail(&self) -> Option<u64> {
282 self.0.first().map(|r| *r.start())
283 }
284
285 #[allow(unused)]
286 pub(crate) fn tailn(&self, limit: u64) -> BlockRanges {
287 let mut truncated = BlockRanges::new();
288 let mut len = 0;
289
290 for range in self.0.iter() {
291 if len == limit {
292 break;
293 }
294
295 let r = range.tailn(limit - len);
296
297 len += r.len();
298 truncated
299 .insert_relaxed(r)
300 .expect("BlockRanges always holds valid ranges");
301
302 debug_assert_eq!(truncated.len(), len);
303 debug_assert!(len <= limit);
304 }
305
306 truncated
307 }
308
309 fn find_affected_ranges(&self, range: impl Borrow<BlockRange>) -> Option<(usize, usize)> {
311 let range = range.borrow();
312 debug_assert!(range.validate().is_ok());
313
314 let mut start_idx = None;
315 let mut end_idx = None;
316
317 for (i, r) in self.0.iter().enumerate() {
318 if r.is_overlapping(range) || r.is_adjacent(range) {
319 if start_idx.is_none() {
320 start_idx = Some(i);
321 }
322
323 end_idx = Some(i);
324 } else if end_idx.is_some() {
325 break;
327 }
328 }
329
330 Some((start_idx?, end_idx?))
331 }
332
333 pub fn check_insertion_constraints(
355 &self,
356 to_insert: impl Borrow<BlockRange>,
357 ) -> Result<(bool, bool)> {
358 let to_insert = to_insert.borrow();
359 to_insert.validate()?;
360
361 let Some(head_range) = self.0.last() else {
362 return Ok((false, false));
364 };
365
366 if head_range.is_left_of(to_insert) {
367 let prev_exists = head_range.is_adjacent(to_insert);
369 return Ok((prev_exists, false));
370 }
371
372 let Some((first_idx, last_idx)) = self.find_affected_ranges(to_insert) else {
373 return Err(BlockRangesError::NoAdjacentNeighbors(to_insert.to_owned()));
374 };
375
376 let first = &self.0[first_idx];
377 let last = &self.0[last_idx];
378 let num_of_ranges = last_idx - first_idx + 1;
379
380 match num_of_ranges {
381 0 => unreachable!(),
382 1 => {
383 if first.is_overlapping(to_insert) {
384 Err(BlockRangesError::BlockRangeOverlap(
385 to_insert.to_owned(),
386 calc_overlap(to_insert, first, last),
387 ))
388 } else if first.is_left_of(to_insert) {
389 Ok((true, false))
390 } else {
391 Ok((false, true))
392 }
393 }
394 2 => {
395 if first.is_adjacent(to_insert) && last.is_adjacent(to_insert) {
396 Ok((true, true))
397 } else {
398 Err(BlockRangesError::BlockRangeOverlap(
399 to_insert.to_owned(),
400 calc_overlap(to_insert, first, last),
401 ))
402 }
403 }
404 _ => Err(BlockRangesError::BlockRangeOverlap(
405 to_insert.to_owned(),
406 calc_overlap(to_insert, first, last),
407 )),
408 }
409 }
410
411 pub fn pop_head(&mut self) -> Option<u64> {
413 let last = self.0.last_mut()?;
414 let head = *last.end();
415
416 if last.len() == 1 {
417 self.0.remove(self.0.len() - 1);
418 } else {
419 *last = *last.start()..=*last.end() - 1;
420 }
421
422 Some(head)
423 }
424
425 pub fn pop_tail(&mut self) -> Option<u64> {
427 let first = self.0.first_mut()?;
428 let tail = *first.start();
429
430 if first.len() == 1 {
431 self.0.remove(0);
432 } else {
433 *first = *first.start() + 1..=*first.end();
434 }
435
436 Some(tail)
437 }
438
439 pub fn insert_relaxed(&mut self, range: impl Borrow<BlockRange>) -> Result<()> {
443 let range = range.borrow();
444 range.validate()?;
445
446 match self.find_affected_ranges(range) {
447 Some((start_idx, end_idx)) => {
449 let start = *self.0[start_idx].start().min(range.start());
450 let end = *self.0[end_idx].end().max(range.end());
451
452 self.0.drain(start_idx..=end_idx);
453 self.0.insert(start_idx, start..=end);
454 }
455 None => {
457 for (i, r) in self.0.iter().enumerate() {
458 if range.end() < r.start() {
459 self.0.insert(i, range.to_owned());
460 return Ok(());
461 }
462 }
463
464 self.0.push(range.to_owned());
465 }
466 }
467
468 Ok(())
469 }
470
471 pub fn remove_relaxed(&mut self, range: impl Borrow<BlockRange>) -> Result<()> {
475 let range = range.borrow();
476 range.validate()?;
477
478 let Some((start_idx, end_idx)) = self.find_affected_ranges(range) else {
479 return Ok(());
481 };
482
483 let old_ranges = self
485 .0
486 .drain(start_idx..=end_idx)
487 .collect::<SmallVec<[_; 2]>>();
488
489 let first_range = old_ranges.first().expect("non empty");
493 let last_range = old_ranges.last().expect("non empty");
494
495 if range.end() < last_range.end() {
496 self.0
498 .insert(start_idx, *range.end() + 1..=*last_range.end());
499 }
500
501 if first_range.start() < range.start() {
502 self.0
504 .insert(start_idx, *first_range.start()..=*range.start() - 1);
505 }
506
507 Ok(())
508 }
509
510 pub(crate) fn edges(&self) -> BlockRanges {
511 let mut edges = BlockRanges::new();
512
513 for range in self.0.iter() {
514 let start = *range.start();
515 let end = *range.end();
516
517 edges
518 .insert_relaxed(start..=start)
519 .expect("BlockRanges always holds valid ranges");
520 edges
521 .insert_relaxed(end..=end)
522 .expect("BlockRanges always holds valid ranges");
523 }
524
525 edges
526 }
527
528 pub(crate) fn partitions(&self) -> Option<(BlockRanges, u64, BlockRanges)> {
530 let len = self.len();
531
532 if len == 0 {
533 return None;
534 }
535
536 let mut left = BlockRanges::new();
537 let mut right = BlockRanges::new();
538
539 let middle = len / 2;
540 let mut left_len = 0;
541
542 for range in self.0.iter() {
543 let range_len = range.len();
544
545 if left_len + range_len <= middle {
546 left.insert_relaxed(range.to_owned())
548 .expect("BlockRanges always holds valid ranges");
549 left_len += range_len;
550 } else if left_len < middle {
551 let start = *range.start();
553 let end = *range.end();
554
555 let left_end = start + middle - left_len;
556 let left_range = start..=left_end;
557
558 left_len += left_range.len();
559 left.insert_relaxed(left_range)
560 .expect("BlockRanges always holds valid ranges");
561
562 if left_end < end {
563 right
564 .insert_relaxed(left_end + 1..=end)
565 .expect("BlockRanges always holds valid ranges");
566 }
567 } else {
568 right
570 .insert_relaxed(range.to_owned())
571 .expect("BlockRanges always holds valid ranges");
572 }
573 }
574
575 let middle_height = if left_len < right.len() {
576 right.pop_tail()?
577 } else {
578 left.pop_head()?
579 };
580
581 Some((left, middle_height, right))
582 }
583
584 pub(crate) fn left_of(&self, height: u64) -> Option<u64> {
586 for r in self.0.iter().rev() {
587 if r.is_left_of(&(height..=height)) {
588 return Some(*r.end());
589 } else if r.contains(&height) && *r.start() != height {
590 return Some(height - 1);
591 }
592 }
593
594 None
595 }
596
597 pub(crate) fn right_of(&self, height: u64) -> Option<u64> {
599 for r in self.0.iter() {
600 if r.is_right_of(&(height..=height)) {
601 return Some(*r.start());
602 } else if r.contains(&height) && *r.end() != height {
603 return Some(height + 1);
604 }
605 }
606
607 None
608 }
609}
610
611impl TryFrom<RangeInclusive<u64>> for BlockRanges {
612 type Error = BlockRangesError;
613
614 fn try_from(value: RangeInclusive<u64>) -> Result<Self, Self::Error> {
615 let mut ranges = BlockRanges::new();
616 ranges.insert_relaxed(value)?;
617 Ok(ranges)
618 }
619}
620
621impl<const N: usize> TryFrom<[RangeInclusive<u64>; N]> for BlockRanges {
622 type Error = BlockRangesError;
623
624 fn try_from(value: [RangeInclusive<u64>; N]) -> Result<Self, Self::Error> {
625 BlockRanges::from_vec(value.into_iter().collect())
626 }
627}
628
629impl TryFrom<&[RangeInclusive<u64>]> for BlockRanges {
630 type Error = BlockRangesError;
631
632 fn try_from(value: &[RangeInclusive<u64>]) -> Result<Self, Self::Error> {
633 BlockRanges::from_vec(value.iter().cloned().collect())
634 }
635}
636
637impl AsRef<[RangeInclusive<u64>]> for BlockRanges {
638 fn as_ref(&self) -> &[RangeInclusive<u64>] {
639 &self.0
640 }
641}
642
643impl AddAssign for BlockRanges {
644 fn add_assign(&mut self, rhs: BlockRanges) {
645 self.add_assign(&rhs);
646 }
647}
648
649impl AddAssign<&BlockRanges> for BlockRanges {
650 fn add_assign(&mut self, rhs: &BlockRanges) {
651 for range in rhs.0.iter() {
652 self.insert_relaxed(range)
653 .expect("BlockRanges always holds valid ranges");
654 }
655 }
656}
657
658impl Add for BlockRanges {
659 type Output = Self;
660
661 fn add(mut self, rhs: BlockRanges) -> Self::Output {
662 self.add_assign(&rhs);
663 self
664 }
665}
666
667impl Add<&BlockRanges> for BlockRanges {
668 type Output = Self;
669
670 fn add(mut self, rhs: &BlockRanges) -> Self::Output {
671 self.add_assign(rhs);
672 self
673 }
674}
675
676impl SubAssign for BlockRanges {
677 fn sub_assign(&mut self, rhs: BlockRanges) {
678 self.sub_assign(&rhs);
679 }
680}
681
682impl SubAssign<&BlockRanges> for BlockRanges {
683 fn sub_assign(&mut self, rhs: &BlockRanges) {
684 for range in rhs.0.iter() {
685 self.remove_relaxed(range)
686 .expect("BlockRanges always holds valid ranges");
687 }
688 }
689}
690
691impl Sub for BlockRanges {
692 type Output = Self;
693
694 fn sub(mut self, rhs: BlockRanges) -> Self::Output {
695 self.sub_assign(&rhs);
696 self
697 }
698}
699
700impl Sub<&BlockRanges> for BlockRanges {
701 type Output = Self;
702
703 fn sub(mut self, rhs: &BlockRanges) -> Self::Output {
704 self.sub_assign(rhs);
705 self
706 }
707}
708
709impl Not for BlockRanges {
710 type Output = Self;
711
712 fn not(self) -> Self::Output {
713 let mut inverse = BlockRanges::new();
714
715 inverse.insert_relaxed(1..=u64::MAX).expect("valid ranges");
717
718 for range in self.0.iter() {
720 inverse
721 .remove_relaxed(range)
722 .expect("BlockRanges always holds valid ranges");
723 }
724
725 inverse
726 }
727}
728
729impl BitOrAssign for BlockRanges {
730 fn bitor_assign(&mut self, rhs: BlockRanges) {
731 self.add_assign(&rhs);
732 }
733}
734
735impl BitOrAssign<&BlockRanges> for BlockRanges {
736 fn bitor_assign(&mut self, rhs: &BlockRanges) {
737 self.add_assign(rhs);
738 }
739}
740
741impl BitOr for BlockRanges {
742 type Output = Self;
743
744 fn bitor(mut self, rhs: BlockRanges) -> Self::Output {
745 self.add_assign(&rhs);
746 self
747 }
748}
749
750impl BitOr<&BlockRanges> for BlockRanges {
751 type Output = Self;
752
753 fn bitor(mut self, rhs: &BlockRanges) -> Self::Output {
754 self.add_assign(rhs);
755 self
756 }
757}
758
759impl BitAndAssign for BlockRanges {
760 fn bitand_assign(&mut self, rhs: BlockRanges) {
761 self.bitand_assign(&rhs);
762 }
763}
764
765impl BitAndAssign<&BlockRanges> for BlockRanges {
766 fn bitand_assign(&mut self, rhs: &BlockRanges) {
767 *self = !(!self.clone() | !rhs.clone());
769 }
770}
771
772impl BitAnd for BlockRanges {
773 type Output = Self;
774
775 fn bitand(mut self, rhs: BlockRanges) -> Self::Output {
776 self.bitand_assign(&rhs);
777 self
778 }
779}
780
781impl BitAnd<&BlockRanges> for BlockRanges {
782 type Output = Self;
783
784 fn bitand(mut self, rhs: &BlockRanges) -> Self::Output {
785 self.bitand_assign(rhs);
786 self
787 }
788}
789
790impl Iterator for BlockRanges {
791 type Item = u64;
792
793 fn next(&mut self) -> Option<Self::Item> {
794 self.pop_tail()
795 }
796}
797
798impl DoubleEndedIterator for BlockRanges {
799 fn next_back(&mut self) -> Option<Self::Item> {
800 self.pop_head()
801 }
802}
803
804impl Display for BlockRanges {
805 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
806 write!(f, "[")?;
807 for (idx, range) in self.0.iter().enumerate() {
808 if idx == 0 {
809 write!(f, "{}", range.display())?;
810 } else {
811 write!(f, ", {}", range.display())?;
812 }
813 }
814 write!(f, "]")
815 }
816}
817
818fn calc_overlap(
819 to_insert: &BlockRange,
820 first_range: &BlockRange,
821 last_range: &BlockRange,
822) -> BlockRange {
823 let start = first_range.start().max(to_insert.start());
824 let end = last_range.end().min(to_insert.end());
825 *start..=*end
826}
827
828#[cfg(test)]
829mod tests {
830 use super::*;
831
832 use crate::test_utils::new_block_ranges;
833
834 #[test]
835 fn range_len() {
836 assert_eq!((0u64..=0).len(), 1);
837 assert_eq!((0u64..=5).len(), 6);
838 assert_eq!((1u64..=2).len(), 2);
839 assert_eq!(RangeInclusive::new(2u64, 1).len(), 0);
840 assert_eq!((10001u64..=20000).len(), 10000);
841 }
842
843 #[test]
844 fn block_ranges_empty() {
845 assert!(new_block_ranges([]).is_empty());
846 assert!(!new_block_ranges([1..=3]).is_empty());
847 }
848
849 #[test]
850 fn block_ranges_head() {
851 assert_eq!(new_block_ranges([]).head(), None);
852 assert_eq!(new_block_ranges([1..=3]).head(), Some(3));
853 assert_eq!(new_block_ranges([1..=3, 6..=9]).head(), Some(9));
854 assert_eq!(new_block_ranges([1..=3, 5..=5, 8..=9]).head(), Some(9));
855 }
856
857 #[test]
858 fn block_ranges_tail() {
859 assert_eq!(new_block_ranges([]).tail(), None);
860 assert_eq!(new_block_ranges([1..=3]).tail(), Some(1));
861 assert_eq!(new_block_ranges([1..=3, 6..=9]).tail(), Some(1));
862 assert_eq!(new_block_ranges([1..=3, 5..=5, 8..=9]).tail(), Some(1));
863 }
864
865 #[test]
866 fn check_range_insert_append() {
867 let (prev_exists, next_exists) = new_block_ranges([])
868 .check_insertion_constraints(1..=5)
869 .unwrap();
870 assert!(!prev_exists);
871 assert!(!next_exists);
872
873 let (prev_exists, next_exists) = new_block_ranges([1..=4])
874 .check_insertion_constraints(5..=5)
875 .unwrap();
876 assert!(prev_exists);
877 assert!(!next_exists);
878
879 let (prev_exists, next_exists) = new_block_ranges([1..=5])
880 .check_insertion_constraints(6..=9)
881 .unwrap();
882 assert!(prev_exists);
883 assert!(!next_exists);
884
885 let (prev_exists, next_exists) = new_block_ranges([6..=8])
886 .check_insertion_constraints(2..=5)
887 .unwrap();
888 assert!(!prev_exists);
889 assert!(next_exists);
890
891 let (prev_exists, next_exists) = new_block_ranges([1..=5])
893 .check_insertion_constraints(7..=9)
894 .unwrap();
895 assert!(!prev_exists);
896 assert!(!next_exists);
897 }
898
899 #[test]
900 fn check_range_insert_with_consolidation() {
901 let (prev_exists, next_exists) = new_block_ranges([1..=3, 6..=9])
902 .check_insertion_constraints(4..=5)
903 .unwrap();
904 assert!(prev_exists);
905 assert!(next_exists);
906
907 let (prev_exists, next_exists) = new_block_ranges([1..=2, 5..=5, 8..=9])
908 .check_insertion_constraints(3..=4)
909 .unwrap();
910 assert!(prev_exists);
911 assert!(next_exists);
912
913 let (prev_exists, next_exists) = new_block_ranges([1..=2, 4..=4, 8..=9])
914 .check_insertion_constraints(5..=7)
915 .unwrap();
916 assert!(prev_exists);
917 assert!(next_exists);
918 }
919
920 #[test]
921 fn check_range_insert_overlapping() {
922 let result = new_block_ranges([1..=2])
923 .check_insertion_constraints(1..=1)
924 .unwrap_err();
925 assert_eq!(result, BlockRangesError::BlockRangeOverlap(1..=1, 1..=1));
926
927 let result = new_block_ranges([1..=2])
928 .check_insertion_constraints(2..=2)
929 .unwrap_err();
930 assert_eq!(result, BlockRangesError::BlockRangeOverlap(2..=2, 2..=2));
931
932 let result = new_block_ranges([1..=4])
933 .check_insertion_constraints(2..=8)
934 .unwrap_err();
935 assert_eq!(result, BlockRangesError::BlockRangeOverlap(2..=8, 2..=4));
936
937 let result = new_block_ranges([1..=4])
938 .check_insertion_constraints(2..=3)
939 .unwrap_err();
940 assert_eq!(result, BlockRangesError::BlockRangeOverlap(2..=3, 2..=3));
941
942 let result = new_block_ranges([5..=9])
943 .check_insertion_constraints(1..=5)
944 .unwrap_err();
945 assert_eq!(result, BlockRangesError::BlockRangeOverlap(1..=5, 5..=5));
946
947 let result = new_block_ranges([5..=8])
948 .check_insertion_constraints(2..=8)
949 .unwrap_err();
950 assert_eq!(result, BlockRangesError::BlockRangeOverlap(2..=8, 5..=8));
951
952 let result = new_block_ranges([1..=3, 6..=9])
953 .check_insertion_constraints(3..=6)
954 .unwrap_err();
955 assert_eq!(result, BlockRangesError::BlockRangeOverlap(3..=6, 3..=6));
956
957 let result = new_block_ranges([1..=3, 5..=6])
958 .check_insertion_constraints(3..=9)
959 .unwrap_err();
960 assert_eq!(result, BlockRangesError::BlockRangeOverlap(3..=9, 3..=6));
961
962 let result = new_block_ranges([2..=3, 5..=6])
963 .check_insertion_constraints(1..=5)
964 .unwrap_err();
965 assert_eq!(result, BlockRangesError::BlockRangeOverlap(1..=5, 2..=5));
966 }
967
968 #[test]
969 fn check_range_insert_invalid_placement() {
970 let result = new_block_ranges([1..=2, 7..=9])
971 .check_insertion_constraints(4..=4)
972 .unwrap_err();
973 assert_eq!(result, BlockRangesError::NoAdjacentNeighbors(4..=4));
974
975 let result = new_block_ranges([1..=2, 8..=9])
976 .check_insertion_constraints(4..=6)
977 .unwrap_err();
978 assert_eq!(result, BlockRangesError::NoAdjacentNeighbors(4..=6));
979
980 let result = new_block_ranges([4..=5, 7..=8])
981 .check_insertion_constraints(1..=2)
982 .unwrap_err();
983 assert_eq!(result, BlockRangesError::NoAdjacentNeighbors(1..=2));
984 }
985
986 #[test]
987 fn test_header_range_creation_ok() {
988 new_block_ranges([1..=3, 5..=8]);
989 new_block_ranges([]);
990 new_block_ranges([1..=1, 1000000..=2000000]);
991 }
992
993 #[test]
994 #[should_panic]
995 fn test_header_range_creation_overlap() {
996 new_block_ranges([1..=3, 2..=5]);
997 }
998
999 #[test]
1000 #[should_panic]
1001 fn test_header_range_creation_inverse() {
1002 new_block_ranges([1..=3, RangeInclusive::new(9, 5)]);
1003 }
1004
1005 #[test]
1006 #[should_panic]
1007 fn test_header_range_creation_wrong_order() {
1008 new_block_ranges([10..=15, 1..=5]);
1009 }
1010
1011 #[test]
1012 fn pop_head() {
1013 let mut ranges = new_block_ranges([]);
1014 assert_eq!(ranges.pop_head(), None);
1015
1016 let mut ranges = new_block_ranges([1..=4, 6..=8, 10..=10]);
1017 assert_eq!(ranges.pop_head(), Some(10));
1018 assert_eq!(ranges.pop_head(), Some(8));
1019 assert_eq!(ranges.pop_head(), Some(7));
1020 assert_eq!(ranges.pop_head(), Some(6));
1021 assert_eq!(ranges.pop_head(), Some(4));
1022 assert_eq!(ranges.pop_head(), Some(3));
1023 assert_eq!(ranges.pop_head(), Some(2));
1024 assert_eq!(ranges.pop_head(), Some(1));
1025 assert_eq!(ranges.pop_head(), None);
1026 }
1027
1028 #[test]
1029 fn pop_tail() {
1030 let mut ranges = new_block_ranges([]);
1031 assert_eq!(ranges.pop_tail(), None);
1032
1033 let mut ranges = new_block_ranges([1..=4, 6..=8, 10..=10]);
1034 assert_eq!(ranges.pop_tail(), Some(1));
1035 assert_eq!(ranges.pop_tail(), Some(2));
1036 assert_eq!(ranges.pop_tail(), Some(3));
1037 assert_eq!(ranges.pop_tail(), Some(4));
1038 assert_eq!(ranges.pop_tail(), Some(6));
1039 assert_eq!(ranges.pop_tail(), Some(7));
1040 assert_eq!(ranges.pop_tail(), Some(8));
1041 assert_eq!(ranges.pop_tail(), Some(10));
1042 assert_eq!(ranges.pop_tail(), None);
1043 }
1044
1045 #[test]
1046 fn block_ranges_iterator() {
1047 let ranges = new_block_ranges([1..=5, 10..=15]);
1048 let heights: Vec<_> = ranges.collect();
1049 assert_eq!(heights, vec![1, 2, 3, 4, 5, 10, 11, 12, 13, 14, 15]);
1050
1051 let empty_heights: Vec<u64> = new_block_ranges([]).collect();
1052 assert_eq!(empty_heights, Vec::<u64>::new())
1053 }
1054
1055 #[test]
1056 fn block_ranges_double_ended_iterator() {
1057 let ranges = new_block_ranges([1..=5, 10..=15]);
1058 let heights: Vec<_> = ranges.rev().collect();
1059 assert_eq!(heights, vec![15, 14, 13, 12, 11, 10, 5, 4, 3, 2, 1]);
1060
1061 let empty_heights: Vec<u64> = new_block_ranges([]).collect();
1062 assert_eq!(empty_heights, Vec::<u64>::new())
1063 }
1064
1065 #[test]
1066 fn validate_check() {
1067 (1..=1).validate().unwrap();
1068 (1..=2).validate().unwrap();
1069 (0..=0).validate().unwrap_err();
1070 (0..=1).validate().unwrap_err();
1071 #[allow(clippy::reversed_empty_ranges)]
1072 (2..=1).validate().unwrap_err();
1073 }
1074
1075 #[test]
1076 fn adjacent_check() {
1077 assert!((3..=5).is_adjacent(&(1..=2)));
1078 assert!((3..=5).is_adjacent(&(6..=8)));
1079
1080 assert!(!(3..=5).is_adjacent(&(1..=1)));
1081 assert!(!(3..=5).is_adjacent(&(7..=8)));
1082 }
1083
1084 #[test]
1085 fn overlapping_check() {
1086 assert!((3..=5).is_overlapping(&(3..=5)));
1088
1089 assert!((3..=5).is_overlapping(&(1..=4)));
1091 assert!((3..=5).is_overlapping(&(1..=3)));
1092 assert!((3..=5).is_overlapping(&(4..=8)));
1093 assert!((3..=5).is_overlapping(&(5..=8)));
1094
1095 assert!((3..=5).is_overlapping(&(4..=4)));
1097 assert!((3..=5).is_overlapping(&(3..=4)));
1098 assert!((3..=5).is_overlapping(&(4..=5)));
1099
1100 assert!((3..=5).is_overlapping(&(1..=5)));
1102 assert!((3..=5).is_overlapping(&(1..=6)));
1103 assert!((3..=5).is_overlapping(&(3..=6)));
1104 assert!((3..=5).is_overlapping(&(4..=6)));
1105
1106 assert!(!(3..=5).is_overlapping(&(1..=1)));
1108 assert!(!(3..=5).is_overlapping(&(7..=8)));
1109 }
1110
1111 #[test]
1112 fn is_left_of_check() {
1113 assert!((1..=2).is_left_of(&(3..=4)));
1115 assert!((1..=1).is_left_of(&(3..=4)));
1116
1117 assert!(!(3..=4).is_left_of(&(1..=2)));
1119 assert!(!(3..=4).is_left_of(&(1..=1)));
1120
1121 assert!(!(1..=3).is_left_of(&(3..=4)));
1123 assert!(!(1..=5).is_left_of(&(3..=4)));
1124 assert!(!(3..=4).is_left_of(&(1..=3)));
1125 }
1126
1127 #[test]
1128 fn left_of() {
1129 let r = new_block_ranges([10..=20, 30..=30, 40..=50]);
1130
1131 assert_eq!(r.left_of(60), Some(50));
1132 assert_eq!(r.left_of(50), Some(49));
1133 assert_eq!(r.left_of(45), Some(44));
1134 assert_eq!(r.left_of(40), Some(30));
1135 assert_eq!(r.left_of(39), Some(30));
1136 assert_eq!(r.left_of(30), Some(20));
1137 assert_eq!(r.left_of(29), Some(20));
1138 assert_eq!(r.left_of(20), Some(19));
1139 assert_eq!(r.left_of(15), Some(14));
1140 assert_eq!(r.left_of(10), None);
1141 assert_eq!(r.left_of(9), None);
1142 }
1143
1144 #[test]
1145 fn is_right_of_check() {
1146 assert!((3..=4).is_right_of(&(1..=2)));
1148 assert!((3..=4).is_right_of(&(1..=1)));
1149
1150 assert!(!(1..=2).is_right_of(&(3..=4)));
1152 assert!(!(1..=1).is_right_of(&(3..=4)));
1153
1154 assert!(!(1..=3).is_right_of(&(3..=4)));
1156 assert!(!(1..=5).is_right_of(&(3..=4)));
1157 assert!(!(3..=4).is_right_of(&(1..=3)));
1158 }
1159
1160 #[test]
1161 fn right_of() {
1162 let r = new_block_ranges([10..=20, 30..=30, 40..=50]);
1163
1164 assert_eq!(r.right_of(1), Some(10));
1165 assert_eq!(r.right_of(9), Some(10));
1166 assert_eq!(r.right_of(10), Some(11));
1167 assert_eq!(r.right_of(15), Some(16));
1168 assert_eq!(r.right_of(19), Some(20));
1169 assert_eq!(r.right_of(20), Some(30));
1170 assert_eq!(r.right_of(29), Some(30));
1171 assert_eq!(r.right_of(30), Some(40));
1172 assert_eq!(r.right_of(39), Some(40));
1173 assert_eq!(r.right_of(40), Some(41));
1174 assert_eq!(r.right_of(45), Some(46));
1175 assert_eq!(r.right_of(49), Some(50));
1176 assert_eq!(r.right_of(50), None);
1177 assert_eq!(r.right_of(60), None);
1178 }
1179
1180 #[test]
1181 fn headn() {
1182 assert_eq!((1..=10).headn(u64::MAX), 1..=10);
1183 assert_eq!((1..=10).headn(20), 1..=10);
1184 assert_eq!((1..=10).headn(10), 1..=10);
1185 assert_eq!((1..=10).headn(5), 6..=10);
1186 assert_eq!((1..=10).headn(1), 10..=10);
1187 assert!((1..=10).headn(0).is_empty());
1188
1189 assert_eq!((0..=u64::MAX).headn(u64::MAX), 1..=u64::MAX);
1190 assert_eq!((0..=u64::MAX).headn(1), u64::MAX..=u64::MAX);
1191 assert!((0..=u64::MAX).headn(0).is_empty());
1192
1193 assert_eq!(
1194 new_block_ranges([1..=10]).headn(u64::MAX),
1195 new_block_ranges([1..=10])
1196 );
1197 assert_eq!(
1198 new_block_ranges([1..=10]).headn(20),
1199 new_block_ranges([1..=10])
1200 );
1201 assert_eq!(
1202 new_block_ranges([1..=10]).headn(10),
1203 new_block_ranges([1..=10])
1204 );
1205 assert_eq!(
1206 new_block_ranges([1..=10]).headn(5),
1207 new_block_ranges([6..=10])
1208 );
1209 assert_eq!(
1210 new_block_ranges([1..=10]).headn(1),
1211 new_block_ranges([10..=10])
1212 );
1213 assert!(new_block_ranges([1..=10]).headn(0).is_empty());
1214
1215 assert_eq!(
1216 new_block_ranges([1..=5, 10..=14]).headn(u64::MAX),
1217 new_block_ranges([1..=5, 10..=14])
1218 );
1219 assert_eq!(
1220 new_block_ranges([1..=5, 10..=14]).headn(20),
1221 new_block_ranges([1..=5, 10..=14])
1222 );
1223 assert_eq!(
1224 new_block_ranges([1..=5, 10..=14]).headn(10),
1225 new_block_ranges([1..=5, 10..=14])
1226 );
1227 assert_eq!(
1228 new_block_ranges([1..=5, 10..=14]).headn(4),
1229 new_block_ranges([11..=14])
1230 );
1231 assert_eq!(
1232 new_block_ranges([1..=5, 10..=14]).headn(5),
1233 new_block_ranges([10..=14])
1234 );
1235 assert_eq!(
1236 new_block_ranges([1..=5, 10..=14]).headn(6),
1237 new_block_ranges([5..=5, 10..=14])
1238 );
1239 assert_eq!(
1240 new_block_ranges([1..=5, 10..=14]).headn(7),
1241 new_block_ranges([4..=5, 10..=14])
1242 );
1243 assert_eq!(
1244 new_block_ranges([1..=5, 10..=14]).headn(1),
1245 new_block_ranges([14..=14])
1246 );
1247 assert!(new_block_ranges([1..=5, 10..=14]).headn(0).is_empty());
1248 }
1249
1250 #[test]
1251 fn tailn() {
1252 assert_eq!((1..=10).tailn(20), 1..=10);
1253 assert_eq!((1..=10).tailn(10), 1..=10);
1254 assert_eq!((1..=10).tailn(5), 1..=5);
1255 assert_eq!((1..=10).tailn(1), 1..=1);
1256 assert!((1..=10).tailn(0).is_empty());
1257
1258 assert_eq!((0..=u64::MAX).tailn(u64::MAX), 0..=(u64::MAX - 1));
1259 assert_eq!((0..=u64::MAX).tailn(1), 0..=0);
1260 assert!((0..=u64::MAX).tailn(0).is_empty());
1261
1262 assert_eq!(
1263 new_block_ranges([1..=10]).tailn(u64::MAX),
1264 new_block_ranges([1..=10])
1265 );
1266 assert_eq!(
1267 new_block_ranges([1..=10]).tailn(20),
1268 new_block_ranges([1..=10])
1269 );
1270 assert_eq!(
1271 new_block_ranges([1..=10]).tailn(10),
1272 new_block_ranges([1..=10])
1273 );
1274 assert_eq!(
1275 new_block_ranges([1..=10]).tailn(5),
1276 new_block_ranges([1..=5])
1277 );
1278 assert_eq!(
1279 new_block_ranges([1..=10]).tailn(1),
1280 new_block_ranges([1..=1])
1281 );
1282 assert!(new_block_ranges([1..=10]).tailn(0).is_empty());
1283
1284 assert_eq!(
1285 new_block_ranges([1..=5, 10..=14]).tailn(u64::MAX),
1286 new_block_ranges([1..=5, 10..=14])
1287 );
1288 assert_eq!(
1289 new_block_ranges([1..=5, 10..=14]).tailn(20),
1290 new_block_ranges([1..=5, 10..=14])
1291 );
1292 assert_eq!(
1293 new_block_ranges([1..=5, 10..=14]).tailn(10),
1294 new_block_ranges([1..=5, 10..=14])
1295 );
1296 assert_eq!(
1297 new_block_ranges([1..=5, 10..=14]).tailn(4),
1298 new_block_ranges([1..=4])
1299 );
1300 assert_eq!(
1301 new_block_ranges([1..=5, 10..=14]).tailn(5),
1302 new_block_ranges([1..=5])
1303 );
1304 assert_eq!(
1305 new_block_ranges([1..=5, 10..=14]).tailn(6),
1306 new_block_ranges([1..=5, 10..=10])
1307 );
1308 assert_eq!(
1309 new_block_ranges([1..=5, 10..=14]).tailn(7),
1310 new_block_ranges([1..=5, 10..=11])
1311 );
1312 assert_eq!(
1313 new_block_ranges([1..=5, 10..=14]).tailn(1),
1314 new_block_ranges([1..=1])
1315 );
1316 assert!(new_block_ranges([1..=5, 10..=14]).tailn(0).is_empty());
1317 }
1318
1319 #[test]
1320 fn find_affected_ranges() {
1321 let ranges = new_block_ranges([30..=50, 80..=100, 130..=150]);
1322
1323 assert_eq!(ranges.find_affected_ranges(28..=28), None);
1324 assert_eq!(ranges.find_affected_ranges(1..=15), None);
1325 assert_eq!(ranges.find_affected_ranges(1..=28), None);
1326 assert_eq!(ranges.find_affected_ranges(3..=28), None);
1327 assert_eq!(ranges.find_affected_ranges(1..=29), Some((0, 0)));
1328 assert_eq!(ranges.find_affected_ranges(1..=30), Some((0, 0)));
1329 assert_eq!(ranges.find_affected_ranges(1..=49), Some((0, 0)));
1330 assert_eq!(ranges.find_affected_ranges(1..=50), Some((0, 0)));
1331 assert_eq!(ranges.find_affected_ranges(1..=51), Some((0, 0)));
1332
1333 assert_eq!(ranges.find_affected_ranges(40..=51), Some((0, 0)));
1334 assert_eq!(ranges.find_affected_ranges(50..=51), Some((0, 0)));
1335 assert_eq!(ranges.find_affected_ranges(51..=51), Some((0, 0)));
1336
1337 assert_eq!(ranges.find_affected_ranges(40..=79), Some((0, 1)));
1338 assert_eq!(ranges.find_affected_ranges(50..=79), Some((0, 1)));
1339 assert_eq!(ranges.find_affected_ranges(51..=79), Some((0, 1)));
1340 assert_eq!(ranges.find_affected_ranges(50..=80), Some((0, 1)));
1341
1342 assert_eq!(ranges.find_affected_ranges(52..=52), None);
1343 assert_eq!(ranges.find_affected_ranges(52..=78), None);
1344 assert_eq!(ranges.find_affected_ranges(52..=79), Some((1, 1)));
1345 assert_eq!(ranges.find_affected_ranges(52..=80), Some((1, 1)));
1346 assert_eq!(ranges.find_affected_ranges(52..=129), Some((1, 2)));
1347 assert_eq!(ranges.find_affected_ranges(99..=129), Some((1, 2)));
1348 assert_eq!(ranges.find_affected_ranges(100..=129), Some((1, 2)));
1349 assert_eq!(ranges.find_affected_ranges(101..=129), Some((1, 2)));
1350 assert_eq!(ranges.find_affected_ranges(101..=128), Some((1, 1)));
1351 assert_eq!(ranges.find_affected_ranges(51..=129), Some((0, 2)));
1352
1353 assert_eq!(ranges.find_affected_ranges(102..=128), None);
1354 assert_eq!(ranges.find_affected_ranges(102..=120), None);
1355 assert_eq!(ranges.find_affected_ranges(120..=128), None);
1356
1357 assert_eq!(ranges.find_affected_ranges(40..=129), Some((0, 2)));
1358 assert_eq!(ranges.find_affected_ranges(40..=140), Some((0, 2)));
1359 assert_eq!(ranges.find_affected_ranges(20..=140), Some((0, 2)));
1360 assert_eq!(ranges.find_affected_ranges(20..=150), Some((0, 2)));
1361 assert_eq!(ranges.find_affected_ranges(20..=151), Some((0, 2)));
1362 assert_eq!(ranges.find_affected_ranges(20..=160), Some((0, 2)));
1363
1364 assert_eq!(ranges.find_affected_ranges(120..=129), Some((2, 2)));
1365 assert_eq!(ranges.find_affected_ranges(120..=128), None);
1366 assert_eq!(ranges.find_affected_ranges(120..=130), Some((2, 2)));
1367 assert_eq!(ranges.find_affected_ranges(120..=131), Some((2, 2)));
1368 assert_eq!(ranges.find_affected_ranges(140..=145), Some((2, 2)));
1369 assert_eq!(ranges.find_affected_ranges(140..=150), Some((2, 2)));
1370 assert_eq!(ranges.find_affected_ranges(140..=155), Some((2, 2)));
1371 assert_eq!(ranges.find_affected_ranges(152..=155), None);
1372 assert_eq!(ranges.find_affected_ranges(152..=178), None);
1373 assert_eq!(ranges.find_affected_ranges(152..=152), None);
1374
1375 assert_eq!(new_block_ranges([]).find_affected_ranges(1..=1), None);
1376
1377 assert_eq!(new_block_ranges([1..=2]).find_affected_ranges(6..=9), None);
1378 assert_eq!(new_block_ranges([4..=8]).find_affected_ranges(1..=2), None);
1379 assert_eq!(
1380 new_block_ranges([4..=8, 20..=30]).find_affected_ranges(1..=2),
1381 None
1382 );
1383 assert_eq!(
1384 new_block_ranges([4..=8, 20..=30]).find_affected_ranges(10..=12),
1385 None
1386 );
1387 assert_eq!(
1388 new_block_ranges([4..=8, 20..=30]).find_affected_ranges(32..=32),
1389 None
1390 );
1391 }
1392
1393 #[test]
1394 fn insert_relaxed_disjoined() {
1395 let mut r = BlockRanges::default();
1396 r.insert_relaxed(10..=10).unwrap();
1397 assert_eq!(&r.0[..], &[10..=10][..]);
1398
1399 let ranges = new_block_ranges([30..=50, 80..=100, 130..=150]);
1400
1401 let mut r = ranges.clone();
1402 r.insert_relaxed(1..=1).unwrap();
1403 assert_eq!(&r.0[..], &[1..=1, 30..=50, 80..=100, 130..=150][..]);
1404
1405 let mut r = ranges.clone();
1406 r.insert_relaxed(1..=28).unwrap();
1407 assert_eq!(&r.0[..], &[1..=28, 30..=50, 80..=100, 130..=150][..]);
1408
1409 let mut r = ranges.clone();
1410 r.insert_relaxed(10..=28).unwrap();
1411 assert_eq!(&r.0[..], &[10..=28, 30..=50, 80..=100, 130..=150][..]);
1412
1413 let mut r = ranges.clone();
1414 r.insert_relaxed(52..=78).unwrap();
1415 assert_eq!(&r.0[..], &[30..=50, 52..=78, 80..=100, 130..=150][..]);
1416
1417 let mut r = ranges.clone();
1418 r.insert_relaxed(102..=128).unwrap();
1419 assert_eq!(&r.0[..], &[30..=50, 80..=100, 102..=128, 130..=150][..]);
1420
1421 let mut r = ranges.clone();
1422 r.insert_relaxed(152..=152).unwrap();
1423 assert_eq!(&r.0[..], &[30..=50, 80..=100, 130..=150, 152..=152][..]);
1424
1425 let mut r = ranges.clone();
1426 r.insert_relaxed(152..=170).unwrap();
1427 assert_eq!(&r.0[..], &[30..=50, 80..=100, 130..=150, 152..=170][..]);
1428
1429 let mut r = ranges.clone();
1430 r.insert_relaxed(160..=170).unwrap();
1431 assert_eq!(&r.0[..], &[30..=50, 80..=100, 130..=150, 160..=170][..]);
1432 }
1433
1434 #[test]
1435 fn insert_relaxed_intersected() {
1436 let ranges = new_block_ranges([30..=50, 80..=100, 130..=150]);
1437
1438 let mut r = ranges.clone();
1439 r.insert_relaxed(29..=29).unwrap();
1440 assert_eq!(&r.0[..], &[29..=50, 80..=100, 130..=150][..]);
1441
1442 let mut r = ranges.clone();
1443 r.insert_relaxed(1..=29).unwrap();
1444 assert_eq!(&r.0[..], &[1..=50, 80..=100, 130..=150][..]);
1445
1446 let mut r = ranges.clone();
1447 r.insert_relaxed(29..=35).unwrap();
1448 assert_eq!(&r.0[..], &[29..=50, 80..=100, 130..=150][..]);
1449
1450 let mut r = ranges.clone();
1451 r.insert_relaxed(29..=55).unwrap();
1452 assert_eq!(&r.0[..], &[29..=55, 80..=100, 130..=150][..]);
1453
1454 let mut r = ranges.clone();
1455 r.insert_relaxed(29..=78).unwrap();
1456 assert_eq!(&r.0[..], &[29..=78, 80..=100, 130..=150][..]);
1457
1458 let mut r = ranges.clone();
1459 r.insert_relaxed(29..=79).unwrap();
1460 assert_eq!(&r.0[..], &[29..=100, 130..=150][..]);
1461
1462 let mut r = ranges.clone();
1463 r.insert_relaxed(30..=79).unwrap();
1464 assert_eq!(&r.0[..], &[30..=100, 130..=150][..]);
1465
1466 let mut r = ranges.clone();
1467 r.insert_relaxed(30..=150).unwrap();
1468 assert_eq!(&r.0[..], &[30..=150][..]);
1469
1470 let mut r = ranges.clone();
1471 r.insert_relaxed(10..=170).unwrap();
1472 assert_eq!(&r.0[..], &[10..=170][..]);
1473
1474 let mut r = ranges.clone();
1475 r.insert_relaxed(85..=129).unwrap();
1476 assert_eq!(&r.0[..], &[30..=50, 80..=150][..]);
1477
1478 let mut r = ranges.clone();
1479 r.insert_relaxed(85..=129).unwrap();
1480 assert_eq!(&r.0[..], &[30..=50, 80..=150][..]);
1481
1482 let mut r = ranges.clone();
1483 r.insert_relaxed(135..=170).unwrap();
1484 assert_eq!(&r.0[..], &[30..=50, 80..=100, 130..=170][..]);
1485
1486 let mut r = ranges.clone();
1487 r.insert_relaxed(151..=170).unwrap();
1488 assert_eq!(&r.0[..], &[30..=50, 80..=100, 130..=170][..]);
1489
1490 let mut r = new_block_ranges([1..=2, 4..=6, 8..=10, 15..=20, 80..=100]);
1491 r.insert_relaxed(3..=79).unwrap();
1492 assert_eq!(&r.0[..], &[1..=100][..]);
1493 }
1494
1495 #[test]
1496 fn remove_relaxed() {
1497 let ranges = new_block_ranges([30..=50, 80..=100, 130..=150]);
1498
1499 let mut r = ranges.clone();
1500 r.remove_relaxed(29..=29).unwrap();
1501 assert_eq!(&r.0[..], &[30..=50, 80..=100, 130..=150][..]);
1502
1503 let mut r = ranges.clone();
1504 r.remove_relaxed(30..=30).unwrap();
1505 assert_eq!(&r.0[..], &[31..=50, 80..=100, 130..=150][..]);
1506
1507 let mut r = ranges.clone();
1508 r.remove_relaxed(20..=40).unwrap();
1509 assert_eq!(&r.0[..], &[41..=50, 80..=100, 130..=150][..]);
1510
1511 let mut r = ranges.clone();
1512 r.remove_relaxed(35..=40).unwrap();
1513 assert_eq!(&r.0[..], &[30..=34, 41..=50, 80..=100, 130..=150][..]);
1514
1515 let mut r = ranges.clone();
1516 r.remove_relaxed(51..=129).unwrap();
1517 assert_eq!(&r.0[..], &[30..=50, 130..=150][..]);
1518
1519 let mut r = ranges.clone();
1520 r.remove_relaxed(50..=130).unwrap();
1521 assert_eq!(&r.0[..], &[30..=49, 131..=150][..]);
1522
1523 let mut r = ranges.clone();
1524 r.remove_relaxed(35..=49).unwrap();
1525 assert_eq!(&r.0[..], &[30..=34, 50..=50, 80..=100, 130..=150][..]);
1526
1527 let mut r = ranges.clone();
1528 r.remove_relaxed(35..=50).unwrap();
1529 assert_eq!(&r.0[..], &[30..=34, 80..=100, 130..=150][..]);
1530
1531 let mut r = ranges.clone();
1532 r.remove_relaxed(35..=55).unwrap();
1533 assert_eq!(&r.0[..], &[30..=34, 80..=100, 130..=150][..]);
1534
1535 let mut r = ranges.clone();
1536 r.remove_relaxed(35..=135).unwrap();
1537 assert_eq!(&r.0[..], &[30..=34, 136..=150][..]);
1538
1539 let mut r = ranges.clone();
1540 r.remove_relaxed(35..=170).unwrap();
1541 assert_eq!(&r.0[..], &[30..=34][..]);
1542
1543 let mut r = ranges.clone();
1544 r.remove_relaxed(10..=135).unwrap();
1545 assert_eq!(&r.0[..], &[136..=150][..]);
1546
1547 let mut r = ranges.clone();
1548 r.remove_relaxed(10..=170).unwrap();
1549 assert!(r.0.is_empty());
1550
1551 let mut r = new_block_ranges([1..=10, 12..=12, 14..=14]);
1552 r.remove_relaxed(12..=12).unwrap();
1553 assert_eq!(&r.0[..], &[1..=10, 14..=14][..]);
1554
1555 let mut r = new_block_ranges([1..=u64::MAX]);
1556 r.remove_relaxed(12..=12).unwrap();
1557 assert_eq!(&r.0[..], &[1..=11, 13..=u64::MAX][..]);
1558
1559 let mut r = new_block_ranges([1..=u64::MAX]);
1560 r.remove_relaxed(1..=1).unwrap();
1561 assert_eq!(&r.0[..], &[2..=u64::MAX][..]);
1562
1563 let mut r = new_block_ranges([1..=u64::MAX]);
1564 r.remove_relaxed(u64::MAX..=u64::MAX).unwrap();
1565 assert_eq!(&r.0[..], &[1..=u64::MAX - 1][..]);
1566 }
1567
1568 #[test]
1569 fn edges() {
1570 let r = BlockRanges::default();
1571 let edges = r.edges();
1572 assert!(edges.is_empty());
1573
1574 let r = new_block_ranges([6..=6, 8..=100, 200..=201, 300..=310]);
1575 let edges = r.edges();
1576 assert_eq!(
1577 &edges.0[..],
1578 &[6..=6, 8..=8, 100..=100, 200..=201, 300..=300, 310..=310][..]
1579 );
1580 }
1581
1582 #[test]
1583 fn inverse() {
1584 let inverse = !BlockRanges::new();
1585 assert_eq!(&inverse.0[..], &[1..=u64::MAX][..]);
1586
1587 let inverse = !new_block_ranges([1..=u64::MAX]);
1588 assert!(inverse.is_empty());
1589
1590 let inverse = !new_block_ranges([10..=u64::MAX]);
1591 assert_eq!(&inverse.0[..], &[1..=9][..]);
1592
1593 let inverse = !new_block_ranges([1..=9]);
1594 assert_eq!(&inverse.0[..], &[10..=u64::MAX][..]);
1595
1596 let inverse = !new_block_ranges([10..=100, 200..=200, 400..=600, 700..=800, 900..=900]);
1597 assert_eq!(
1598 &inverse.0[..],
1599 &[
1600 1..=9,
1601 101..=199,
1602 201..=399,
1603 601..=699,
1604 801..=899,
1605 901..=u64::MAX
1606 ][..]
1607 );
1608 assert_eq!(
1609 &(!inverse).0[..],
1610 &[10..=100, 200..=200, 400..=600, 700..=800, 900..=900][..]
1611 );
1612
1613 let inverse = !new_block_ranges([1..=100, 200..=200, 400..=600, 700..=800, 900..=900]);
1614 assert_eq!(
1615 &inverse.0[..],
1616 &[101..=199, 201..=399, 601..=699, 801..=899, 901..=u64::MAX][..]
1617 );
1618 assert_eq!(
1619 &(!inverse).0[..],
1620 &[1..=100, 200..=200, 400..=600, 700..=800, 900..=900][..]
1621 );
1622
1623 let inverse = !new_block_ranges([2..=100, 400..=600, 700..=(u64::MAX - 1)]);
1624 assert_eq!(
1625 &inverse.0[..],
1626 &[1..=1, 101..=399, 601..=699, u64::MAX..=u64::MAX][..]
1627 );
1628 assert_eq!(
1629 &(!inverse).0[..],
1630 &[2..=100, 400..=600, 700..=(u64::MAX - 1)][..]
1631 );
1632 }
1633
1634 #[test]
1635 fn bitwise_and() {
1636 let a = new_block_ranges([10..=100, 200..=200, 400..=600, 700..=800, 900..=900]);
1637 let b = new_block_ranges([50..=50, 55..=250, 300..=750, 800..=1000]);
1638
1639 assert_eq!(
1640 a & b,
1641 new_block_ranges([
1642 50..=50,
1643 55..=100,
1644 200..=200,
1645 400..=600,
1646 700..=750,
1647 800..=800,
1648 900..=900
1649 ])
1650 );
1651 }
1652
1653 #[test]
1654 fn partition() {
1655 assert!(BlockRanges::new().partitions().is_none());
1656
1657 let ranges = new_block_ranges([1..=101]);
1658 let (left, middle, right) = ranges.partitions().unwrap();
1659 assert_eq!(left, new_block_ranges([1..=50]));
1660 assert_eq!(middle, 51);
1661 assert_eq!(right, new_block_ranges([52..=101]));
1662
1663 let ranges = new_block_ranges([10..=10]);
1664 let (left, middle, right) = ranges.partitions().unwrap();
1665 assert!(left.is_empty());
1666 assert_eq!(middle, 10);
1667 assert!(right.is_empty());
1668
1669 let ranges = new_block_ranges([10..=14, 20..=24, 100..=109]);
1670 let (left, middle, right) = ranges.partitions().unwrap();
1671 assert_eq!(left, new_block_ranges([10..=14, 20..=23]));
1672 assert_eq!(middle, 24);
1673 assert_eq!(right, new_block_ranges([100..=109]));
1674
1675 let ranges = new_block_ranges([10..=19, 90..=94, 100..=104]);
1676 let (left, middle, right) = ranges.partitions().unwrap();
1677 assert_eq!(left, new_block_ranges([10..=18]));
1678 assert_eq!(middle, 19);
1679 assert_eq!(right, new_block_ranges([90..=94, 100..=104]));
1680
1681 let ranges = new_block_ranges([10..=14, 20..=25, 100..=109]);
1682 let (left, middle, right) = ranges.partitions().unwrap();
1683 assert_eq!(left, new_block_ranges([10..=14, 20..=24]));
1684 assert_eq!(middle, 25);
1685 assert_eq!(right, new_block_ranges([100..=109]));
1686
1687 let ranges = new_block_ranges([10..=14, 20..=24, 99..=109]);
1688 let (left, middle, right) = ranges.partitions().unwrap();
1689 assert_eq!(left, new_block_ranges([10..=14, 20..=24]));
1690 assert_eq!(middle, 99);
1691 assert_eq!(right, new_block_ranges([100..=109]));
1692
1693 let ranges = new_block_ranges([10..=14, 20..=24, 30..=30, 100..=109]);
1694 let (left, middle, right) = ranges.partitions().unwrap();
1695 assert_eq!(left, new_block_ranges([10..=14, 20..=24]));
1696 assert_eq!(middle, 30);
1697 assert_eq!(right, new_block_ranges([100..=109]));
1698
1699 let ranges = new_block_ranges([10..=19, 30..=30, 90..=94, 100..=104]);
1700 let (left, middle, right) = ranges.partitions().unwrap();
1701 assert_eq!(left, new_block_ranges([10..=19]));
1702 assert_eq!(middle, 30);
1703 assert_eq!(right, new_block_ranges([90..=94, 100..=104]));
1704
1705 let ranges = new_block_ranges([10..=14, 20..=24, 30..=31, 100..=109]);
1706 let (left, middle, right) = ranges.partitions().unwrap();
1707 assert_eq!(left, new_block_ranges([10..=14, 20..=24, 30..=30]));
1708 assert_eq!(middle, 31);
1709 assert_eq!(right, new_block_ranges([100..=109]));
1710
1711 let ranges = new_block_ranges([10..=19, 30..=31, 90..=94, 100..=104]);
1712 let (left, middle, right) = ranges.partitions().unwrap();
1713 assert_eq!(left, new_block_ranges([10..=19, 30..=30]));
1714 assert_eq!(middle, 31);
1715 assert_eq!(right, new_block_ranges([90..=94, 100..=104]));
1716
1717 let ranges = new_block_ranges([10..=14, 20..=24, 30..=32, 100..=109]);
1718 let (left, middle, right) = ranges.partitions().unwrap();
1719 assert_eq!(left, new_block_ranges([10..=14, 20..=24, 30..=30]));
1720 assert_eq!(middle, 31);
1721 assert_eq!(right, new_block_ranges([32..=32, 100..=109]));
1722
1723 let ranges = new_block_ranges([10..=19, 30..=32, 90..=94, 100..=104]);
1724 let (left, middle, right) = ranges.partitions().unwrap();
1725 assert_eq!(left, new_block_ranges([10..=19, 30..=30]));
1726 assert_eq!(middle, 31);
1727 assert_eq!(right, new_block_ranges([32..=32, 90..=94, 100..=104]));
1728 }
1729
1730 #[test]
1731 fn block_ranges_len() {
1732 let r = BlockRanges::default();
1733 assert!(r.is_empty());
1734 assert_eq!(r.len(), 0);
1735 assert_eq!(r.count(), 0);
1736
1737 let r = new_block_ranges([4..=4]);
1738 assert!(!r.is_empty());
1739 assert_eq!(r.len(), 1);
1740
1741 let r = new_block_ranges([4..=4, 100..=101]);
1742 assert!(!r.is_empty());
1743 assert_eq!(r.len(), 3);
1744 assert_eq!(r.count(), 3);
1745
1746 let r = new_block_ranges([250..=300]);
1747 assert!(!r.is_empty());
1748 assert_eq!(r.len(), 51);
1749 assert_eq!(r.count(), 51);
1750
1751 let r = new_block_ranges([4..=4, 100..=101, 250..=300]);
1752 assert!(!r.is_empty());
1753 assert_eq!(r.len(), 54);
1754 assert_eq!(r.count(), 54);
1755
1756 let r = new_block_ranges([4..=10, 100..=101, 250..=300]);
1757 assert!(!r.is_empty());
1758 assert_eq!(r.len(), 60);
1759 assert_eq!(r.count(), 60);
1760
1761 let r = new_block_ranges([4..=4, 100..=101, 250..=300, 500..=500]);
1762 assert!(!r.is_empty());
1763 assert_eq!(r.len(), 55);
1764 assert_eq!(r.count(), 55);
1765 }
1766}