Advertisement
Guest User

Untitled

a guest
Apr 20th, 2019
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.16 KB | None | 0 0
  1. use std::{
  2. fmt::Debug,
  3. //ops::Sub,
  4. slice,
  5. };
  6.  
  7. #[derive(PartialEq, Clone, Debug)]
  8. pub struct Ranges<T>(Vec<T>)
  9. where
  10. T: Ord + Eq + Copy + Debug;
  11.  
  12. impl<T> Ranges<T>
  13. where
  14. T: Ord + Eq + Copy + Debug,
  15. {
  16. pub fn new() -> Ranges<T> {
  17. Ranges(vec![])
  18. }
  19.  
  20. /// Adds and merges the given range with set.
  21. pub fn push(&mut self, range: (T, T)) {
  22. self.0.push(range.0);
  23. self.0.push(range.1);
  24. }
  25.  
  26. pub fn iter(&self) -> RangesIter<T> {
  27. RangesIter::new(self.0.iter())
  28. }
  29.  
  30. /*
  31. pub fn intersection_2(&self, other: Ranges<T>) -> Ranges<T> {
  32. let mut set = BTreeSet::new();
  33. for [start, end] in other.iter() {
  34. let (start_found, end_found) = self.contains_start_end_item(start, end);
  35. if start_found {
  36. set.insert(start);
  37. }
  38. if end_found {
  39. set.insert(end);
  40. }
  41. }
  42. for [start, end] in self.iter() {
  43. let (start_found, end_found) = other.contains_start_end_item(start, end);
  44. if start_found {
  45. set.insert(start);
  46. }
  47. if end_found {
  48. set.insert(end);
  49. }
  50. }
  51. Ranges(set)
  52. }
  53.  
  54. pub fn intersection(&self, other: Ranges<T>) -> Ranges<T> {
  55. let mut set = BTreeSet::new();
  56. let mut iter = self.0.iter();
  57. while let (Some(a), Some(b)) = (iter.next(), iter.next()) {
  58. if other.0.contains(a) && other.0.contains(b) {
  59. set.insert(*a);
  60. set.insert(*b);
  61. }
  62. for v in other.0.range(a..=b) {
  63. if v > a && v < b {
  64. set.insert(*v);
  65. }
  66. }
  67. }
  68. let mut iter = other.0.iter();
  69. while let (Some(a), Some(b)) = (iter.next(), iter.next()) {
  70. for v in self.0.range(a..=b) {
  71. if v > a && v < b {
  72. set.insert(*v);
  73. }
  74. }
  75. }
  76. Ranges(set)
  77. }
  78.  
  79. #[inline]
  80. fn contains_start_end_item(&self, start: T, end: T) -> (bool, bool) {
  81. let mut start_found = false;
  82. let mut end_found = false;
  83. let mut iter = self.0.iter();
  84. while let (Some(a), Some(b)) = (iter.next(), iter.next()) {
  85. start_found = start_found || (start > *a && start <= *b);
  86. end_found = end_found || (end >= *a && end < *b);
  87. if start_found && end_found {
  88. break;
  89. }
  90. }
  91. (start_found, end_found)
  92. }
  93. */
  94. }
  95.  
  96. /*
  97. impl<T> Sub for Ranges<T>
  98. where
  99. T: Ord + Eq + Copy + Debug,
  100. {
  101. type Output = Ranges<T>;
  102.  
  103. fn sub(self, other: Ranges<T>) -> Self::Output {
  104. let mut set = self.0.clone();
  105. for [start, end] in other.iter() {
  106. let (start_found, end_found) = self.contains_start_end_item(start, end);
  107.  
  108. // Remove items contained in range from set.
  109. for v in self.0.range(start..=end) {
  110. set.remove(v);
  111. }
  112.  
  113. // Add start and end item to set.
  114. if start_found {
  115. set.insert(start);
  116. }
  117. if end_found {
  118. set.insert(end);
  119. }
  120. }
  121. Ranges(set)
  122. }
  123. }
  124. */
  125.  
  126. impl<T> From<&[(T, T)]> for Ranges<T>
  127. where
  128. T: Ord + Eq + Copy + Debug,
  129. {
  130. fn from(values: &[(T, T)]) -> Self {
  131. let mut res: Ranges<T> = Ranges::new();
  132. for v in values {
  133. res.push(*v);
  134. }
  135. res
  136. }
  137. }
  138.  
  139. impl<T> From<&[T]> for Ranges<T>
  140. where
  141. T: Ord + Eq + Copy + Debug,
  142. {
  143. fn from(slice: &[T]) -> Self {
  144. let mut res: Ranges<T> = Ranges::new();
  145. if slice.len() >= 2 {
  146. res.push((slice[0], slice[slice.len() - 1]));
  147. }
  148. res
  149. }
  150. }
  151.  
  152. pub struct RangesIter<'a, T>(slice::Iter<'a, T>)
  153. where
  154. T: Ord + Eq + Copy + Debug;
  155.  
  156. impl<'a, T> RangesIter<'a, T>
  157. where
  158. T: Ord + Eq + Copy + Debug,
  159. {
  160. pub fn new(iter: slice::Iter<T>) -> RangesIter<T> {
  161. RangesIter(iter)
  162. }
  163. }
  164.  
  165. impl<'a, T> Iterator for RangesIter<'a, T>
  166. where
  167. T: Ord + Eq + Copy + Debug,
  168. {
  169. type Item = (T, T);
  170. fn next(&mut self) -> Option<Self::Item> {
  171. if let (Some(a), Some(b)) = (self.0.next(), self.0.next()) {
  172. Some((*a, *b))
  173. } else {
  174. None
  175. }
  176. }
  177. }
  178.  
  179.  
  180. pub fn remove_inner_items<T>(slice: &mut Vec<T>, ranges: Ranges<T>)
  181. where
  182. T: Ord + Eq + Copy + Debug,
  183. {
  184. //let ranges = ranges.intersection(Ranges::from(&slice[..]));
  185. let mut iter = ranges.iter();
  186. let mut range = iter.next();
  187. slice.retain(|item| {
  188. if let Some(r) = range {
  189. if *item > r.1 {
  190. range = iter.next();
  191. }
  192. } else {
  193. return true;
  194. }
  195. if let Some(r) = range {
  196. if *item > r.0 && *item < r.1 {
  197. false
  198. } else {
  199. true
  200. }
  201. } else {
  202. true
  203. }
  204. });
  205. }
  206.  
  207. #[cfg(test)]
  208. mod tests {
  209. use super::*;
  210.  
  211. #[test]
  212. fn add_range() {
  213. for data in vec![
  214. //(vec![[2, 4], [6, 8]], vec![[2, 4], [6, 8]]),
  215. //(vec![[2, 4], [2, 4]], vec![[2, 4]]),
  216. //(vec![[2, 4], [1, 4]], vec![[1, 4]]),
  217. //(vec![[2, 4], [1, 5]], vec![[1, 5]]),
  218. //(vec![[2, 4], [4, 8]], vec![[2, 8]]),
  219. /*(vec![[2, 4], [2, 8]], vec![[2, 8]]),
  220. (vec![[2, 4], [5, 8], [1, 9]], vec![[1, 9]]),
  221. (vec![[2, 4], [5, 8], [5, 9]], vec![[2, 4], [5, 9]]),
  222. (vec![[2, 8], [3, 5]], vec![[2, 8]]),
  223. (vec![[2, 8], [3, 8]], vec![[2, 8]]),
  224. (vec![[2, 8], [2, 5]], vec![[2, 8]]),*/
  225. ] {
  226. let ranges = Ranges::from(&data.0[..]);
  227. assert_eq!(data.1, ranges.iter().collect::<Vec<_>>());
  228. }
  229. }
  230. /*
  231. #[test]
  232. fn subtract() {
  233. for data in vec![
  234. (vec![[2, 4]], vec![[2, 4]], vec![]),
  235. (vec![[2, 4]], vec![[4, 6]], vec![[2, 4]]),
  236. (vec![[2, 8]], vec![[4, 7]], vec![[2, 4], [7, 8]]),
  237. (vec![[2, 4], [6, 8]], vec![[4, 6]], vec![[2, 4], [6, 8]]),
  238. (vec![[4, 6]], vec![[3, 7]], vec![]),
  239. (vec![[0, 9]], vec![[3, 7]], vec![[0, 3], [7, 9]]),
  240. (vec![[0, 6]], vec![[4, 6]], vec![[0, 4]]),
  241. (vec![[0, 4], [6, 9]], vec![[3, 7]], vec![[0, 3], [7, 9]]),
  242. (vec![[0, 6]], vec![[0, 2], [4, 6]], vec![[2, 4]]),
  243. (vec![[0, 6]], vec![], vec![[0, 6]]),
  244. (vec![], vec![[0, 6]], vec![[0, 6]]),
  245. (
  246. vec![[0, 9]],
  247. vec![[1, 2], [4, 6]],
  248. vec![[0, 1], [2, 4], [6, 9]],
  249. ),
  250. ] {
  251. let op1: Ranges<i32> = Ranges::from(&data.0[..]);
  252. let op2: Ranges<i32> = Ranges::from(&data.1[..]);
  253. let expect = Ranges::from(&data.2[..]);
  254. assert_eq!(expect, op1 - op2);
  255. }
  256. }
  257.  
  258. #[test]
  259. fn intersection() {
  260. for data in vec![
  261. (vec![[2, 4]], vec![[2, 4]], vec![[2, 4]]),
  262. (vec![[2, 6]], vec![[4, 9]], vec![[4, 6]]),
  263. (vec![[4, 6]], vec![[0, 4]], vec![]),
  264. (vec![[2, 6]], vec![[6, 9]], vec![]),
  265. (vec![[2, 8]], vec![[4, 7]], vec![[4, 7]]),
  266. (vec![[2, 4], [6, 8]], vec![[4, 6]], vec![]),
  267. (vec![[4, 6]], vec![[3, 7]], vec![[4, 6]]),
  268. (vec![[0, 9]], vec![[3, 7]], vec![[3, 7]]),
  269. (vec![[0, 6]], vec![[4, 6]], vec![[4, 6]]),
  270. (vec![[0, 4], [6, 9]], vec![[3, 7]], vec![[3, 4], [6, 7]]),
  271. ] {
  272. let op1: Ranges<i32> = Ranges::from(&data.0[..]);
  273. let op2: Ranges<i32> = Ranges::from(&data.1[..]);
  274. let expect = Ranges::from(&data.2[..]);
  275. assert_eq!(expect, op1.intersection(op2));
  276. }
  277. }
  278.  
  279. #[test]
  280. fn test_remove_inner_items() {
  281. for data in vec![
  282. (vec![[3, 6]], vec![2, 3, 6, 7, 8]),
  283. //(vec![[3, 9]], vec![2, 3, 8]),
  284. //(vec![[0, 9]], vec![2, 8]),
  285. //(vec![[2, 8]], vec![2, 8]),
  286. ] {
  287. let mut slice = (2..=8).collect::<Vec<i32>>();
  288. remove_inner_items(&mut slice, Ranges::from(&data.0[..]));
  289. assert_eq!(data.1, slice);
  290. }
  291. }
  292. */
  293. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement