range_set.rs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. use std::cmp::{max,min};
  2. use std::slice::Iter;
  3. use std::fmt;
  4. #[derive(Copy, Clone)]
  5. pub struct Range {
  6. pub start: usize,
  7. pub length: usize,
  8. }
  9. impl fmt::Display for Range {
  10. fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
  11. return write!(f, "[{}, {}]", self.start, self.start+self.length-1);
  12. }
  13. }
  14. impl Range {
  15. pub fn new(start: usize, length: usize) -> Range {
  16. return Range {
  17. start: start,
  18. length: length,
  19. }
  20. }
  21. pub fn end(&self) -> usize {
  22. return self.start + self.length;
  23. }
  24. }
  25. #[derive(Clone)]
  26. pub struct RangeSet {
  27. ranges: Vec<Range>,
  28. }
  29. impl fmt::Display for RangeSet {
  30. fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
  31. write!(f, "(").unwrap();
  32. for range in self.ranges.iter() {
  33. write!(f, "{}", range).unwrap();
  34. }
  35. write!(f, ")")
  36. }
  37. }
  38. impl RangeSet {
  39. pub fn new() -> RangeSet {
  40. RangeSet{
  41. ranges: Vec::<Range>::new(),
  42. }
  43. }
  44. pub fn is_empty(&self) -> bool {
  45. return self.ranges.is_empty();
  46. }
  47. pub fn len(&self) -> usize {
  48. let mut result = 0;
  49. for range in self.ranges.iter() {
  50. result += range.length;
  51. }
  52. return result;
  53. }
  54. pub fn get_range(&self, index: usize) -> Range {
  55. return self.ranges[index].clone();
  56. }
  57. pub fn iter(&self) -> Iter<Range> {
  58. return self.ranges.iter();
  59. }
  60. pub fn contains(&self, value: usize) -> bool {
  61. for range in self.ranges.iter() {
  62. if value < range.start {
  63. return false;
  64. } else if range.start <= value && value < range.end() {
  65. return true;
  66. }
  67. }
  68. return false;
  69. }
  70. pub fn contained_length_from_value(&self, value: usize) -> usize {
  71. for range in self.ranges.iter() {
  72. if value < range.start {
  73. return 0;
  74. } else if range.start <= value && value < range.end() {
  75. return range.end() - value;
  76. }
  77. }
  78. return 0;
  79. }
  80. #[allow(dead_code)]
  81. pub fn contains_range_set(&self, other: &RangeSet) -> bool {
  82. for range in other.ranges.iter() {
  83. if self.contained_length_from_value(range.start) < range.length {
  84. return false;
  85. }
  86. }
  87. return true;
  88. }
  89. pub fn add_range(&mut self, range:&Range) {
  90. if range.length <= 0 {
  91. // the interval is empty or invalid -> nothing to do.
  92. return;
  93. }
  94. for index in 0..self.ranges.len() {
  95. // the new range is clear of any ranges we already iterated over.
  96. if range.end() < self.ranges[index].start{
  97. // the new range starts after anything we already passed and ends before the next range starts (they don't touch) -> insert it.
  98. self.ranges.insert(index, range.clone());
  99. return;
  100. } else if range.start <= self.ranges[index].end() && self.ranges[index].start <= range.end() {
  101. // the new range overlaps (or touches) the first range. They are to be merged.
  102. // In addition we might have to merge further ranges in as well.
  103. let mut new_range = range.clone();
  104. while index < self.ranges.len() && self.ranges[index].start <= new_range.end() {
  105. let new_end = max(new_range.end(), self.ranges[index].end());
  106. new_range.start = min(new_range.start, self.ranges[index].start);
  107. new_range.length = new_end - new_range.start;
  108. self.ranges.remove(index);
  109. }
  110. self.ranges.insert(index, new_range);
  111. return;
  112. }
  113. }
  114. // the new range is after everything else -> just add it
  115. self.ranges.push(range.clone());
  116. }
  117. #[allow(dead_code)]
  118. pub fn add_range_set(&mut self, other: &RangeSet) {
  119. for range in other.ranges.iter() {
  120. self.add_range(range);
  121. }
  122. }
  123. #[allow(dead_code)]
  124. pub fn union(&self, other: &RangeSet) -> RangeSet {
  125. let mut result = self.clone();
  126. result.add_range_set(other);
  127. return result;
  128. }
  129. pub fn subtract_range(&mut self, range: &Range) {
  130. if range.length <= 0 {
  131. return;
  132. }
  133. for index in 0..self.ranges.len() {
  134. // the ranges we already passed don't overlap with the range to remove
  135. if range.end() <= self.ranges[index].start {
  136. // the remaining ranges are past the one to subtract. -> we're done.
  137. return
  138. } else if range.start <= self.ranges[index].start && self.ranges[index].start < range.end() {
  139. // the range to subtract started before the current range and reaches into the current range
  140. // -> we have to remove the beginning of the range or the entire range and do the same for following ranges.
  141. while index < self.ranges.len() && self.ranges[index].end() <= range.end() {
  142. self.ranges.remove(index);
  143. }
  144. if index < self.ranges.len() && self.ranges[index].start < range.end() {
  145. self.ranges[index].start = range.end();
  146. }
  147. return;
  148. } else if range.end() < self.ranges[index].end() {
  149. // the range to subtract punches a hole into the current range -> we need to create two smaller ranges.
  150. let first_range = Range {
  151. start: self.ranges[index].start,
  152. length: range.start - self.ranges[index].start,
  153. };
  154. self.ranges[index].start = range.end();
  155. self.ranges.insert(index, first_range);
  156. return;
  157. } else if range.start < self.ranges[index].end() {
  158. // the range truncates the existing range -> truncate the range. Let the for loop take care of overlaps with other ranges.
  159. self.ranges[index].length = range.start - self.ranges[index].start;
  160. }
  161. }
  162. }
  163. pub fn subtract_range_set(&mut self, other: &RangeSet) {
  164. for range in other.ranges.iter() {
  165. self.subtract_range(range);
  166. }
  167. }
  168. pub fn minus(&self, other: &RangeSet) -> RangeSet {
  169. let mut result = self.clone();
  170. result.subtract_range_set(other);
  171. return result;
  172. }
  173. pub fn intersection(&self, other: &RangeSet) -> RangeSet {
  174. let mut result = RangeSet::new();
  175. let mut self_index: usize = 0;
  176. let mut other_index: usize = 0;
  177. while self_index < self.ranges.len() && other_index < other.ranges.len() {
  178. if self.ranges[self_index].end() <= other.ranges[other_index].start {
  179. // skip the interval
  180. self_index += 1;
  181. } else if other.ranges[other_index].end() <= self.ranges[self_index].start {
  182. // skip the interval
  183. other_index += 1;
  184. } else {
  185. // the two intervals overlap. Add the union and advance the index of the one that ends first.
  186. let new_start = max(self.ranges[self_index].start, other.ranges[other_index].start);
  187. let new_end = min(self.ranges[self_index].end(), other.ranges[other_index].end());
  188. assert!(new_start <= new_end);
  189. result.add_range(&Range::new(new_start, new_end-new_start));
  190. if self.ranges[self_index].end() <= other.ranges[other_index].end() {
  191. self_index += 1;
  192. } else {
  193. other_index += 1;
  194. }
  195. }
  196. }
  197. return result;
  198. }
  199. }