range_set.rs 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. use std::cmp::{max, min};
  2. use std::fmt;
  3. use std::slice::Iter;
  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()
  101. && self.ranges[index].start <= range.end()
  102. {
  103. // the new range overlaps (or touches) the first range. They are to be merged.
  104. // In addition we might have to merge further ranges in as well.
  105. let mut new_range = range.clone();
  106. while index < self.ranges.len() && self.ranges[index].start <= new_range.end() {
  107. let new_end = max(new_range.end(), self.ranges[index].end());
  108. new_range.start = min(new_range.start, self.ranges[index].start);
  109. new_range.length = new_end - new_range.start;
  110. self.ranges.remove(index);
  111. }
  112. self.ranges.insert(index, new_range);
  113. return;
  114. }
  115. }
  116. // the new range is after everything else -> just add it
  117. self.ranges.push(range.clone());
  118. }
  119. #[allow(dead_code)]
  120. pub fn add_range_set(&mut self, other: &RangeSet) {
  121. for range in other.ranges.iter() {
  122. self.add_range(range);
  123. }
  124. }
  125. #[allow(dead_code)]
  126. pub fn union(&self, other: &RangeSet) -> RangeSet {
  127. let mut result = self.clone();
  128. result.add_range_set(other);
  129. return result;
  130. }
  131. pub fn subtract_range(&mut self, range: &Range) {
  132. if range.length <= 0 {
  133. return;
  134. }
  135. for index in 0..self.ranges.len() {
  136. // the ranges we already passed don't overlap with the range to remove
  137. if range.end() <= self.ranges[index].start {
  138. // the remaining ranges are past the one to subtract. -> we're done.
  139. return;
  140. } else if range.start <= self.ranges[index].start
  141. && self.ranges[index].start < range.end()
  142. {
  143. // the range to subtract started before the current range and reaches into the current range
  144. // -> we have to remove the beginning of the range or the entire range and do the same for following ranges.
  145. while index < self.ranges.len() && self.ranges[index].end() <= range.end() {
  146. self.ranges.remove(index);
  147. }
  148. if index < self.ranges.len() && self.ranges[index].start < range.end() {
  149. self.ranges[index].length -= range.end() - self.ranges[index].start;
  150. self.ranges[index].start = range.end();
  151. }
  152. return;
  153. } else if range.end() < self.ranges[index].end() {
  154. // the range to subtract punches a hole into the current range -> we need to create two smaller ranges.
  155. let first_range = Range {
  156. start: self.ranges[index].start,
  157. length: range.start - self.ranges[index].start,
  158. };
  159. self.ranges[index].length -= range.end() - self.ranges[index].start;
  160. self.ranges[index].start = range.end();
  161. self.ranges.insert(index, first_range);
  162. return;
  163. } else if range.start < self.ranges[index].end() {
  164. // the range truncates the existing range -> truncate the range. Let the for loop take care of overlaps with other ranges.
  165. self.ranges[index].length = range.start - self.ranges[index].start;
  166. }
  167. }
  168. }
  169. pub fn subtract_range_set(&mut self, other: &RangeSet) {
  170. for range in other.ranges.iter() {
  171. self.subtract_range(range);
  172. }
  173. }
  174. pub fn minus(&self, other: &RangeSet) -> RangeSet {
  175. let mut result = self.clone();
  176. result.subtract_range_set(other);
  177. return result;
  178. }
  179. pub fn intersection(&self, other: &RangeSet) -> RangeSet {
  180. let mut result = RangeSet::new();
  181. let mut self_index: usize = 0;
  182. let mut other_index: usize = 0;
  183. while self_index < self.ranges.len() && other_index < other.ranges.len() {
  184. if self.ranges[self_index].end() <= other.ranges[other_index].start {
  185. // skip the interval
  186. self_index += 1;
  187. } else if other.ranges[other_index].end() <= self.ranges[self_index].start {
  188. // skip the interval
  189. other_index += 1;
  190. } else {
  191. // the two intervals overlap. Add the union and advance the index of the one that ends first.
  192. let new_start = max(
  193. self.ranges[self_index].start,
  194. other.ranges[other_index].start,
  195. );
  196. let new_end = min(
  197. self.ranges[self_index].end(),
  198. other.ranges[other_index].end(),
  199. );
  200. assert!(new_start <= new_end);
  201. result.add_range(&Range::new(new_start, new_end - new_start));
  202. if self.ranges[self_index].end() <= other.ranges[other_index].end() {
  203. self_index += 1;
  204. } else {
  205. other_index += 1;
  206. }
  207. }
  208. }
  209. return result;
  210. }
  211. }