rangeset/
symmetric_difference.rs

1use std::ops::{BitXor, BitXorAssign, Range};
2
3use crate::{DifferenceMut, Intersection, RangeSet, UnionMut};
4
5pub trait SymmetricDifferenceMut<Rhs> {
6    /// Replaces `self` with the set symmetric difference of `self` and `other`.
7    fn symmetric_difference_mut(&mut self, other: &Rhs);
8}
9
10pub trait SymmetricDifference<Rhs> {
11    type Output;
12
13    /// Returns the set symmetric difference of `self` and `other`.
14    fn symmetric_difference(&self, other: &Rhs) -> Self::Output;
15}
16
17impl<T: Copy + Ord> SymmetricDifferenceMut<Range<T>> for RangeSet<T> {
18    fn symmetric_difference_mut(&mut self, other: &Range<T>) {
19        let intersection = self.intersection(other);
20        self.union_mut(other);
21        self.difference_mut(&intersection);
22    }
23}
24
25impl<T: Copy + Ord> SymmetricDifferenceMut<RangeSet<T>> for RangeSet<T> {
26    fn symmetric_difference_mut(&mut self, other: &RangeSet<T>) {
27        let intersection = self.intersection(other);
28        self.union_mut(other);
29        self.difference_mut(&intersection);
30    }
31}
32
33impl<T: Copy + Ord> SymmetricDifference<Range<T>> for RangeSet<T> {
34    type Output = RangeSet<T>;
35
36    fn symmetric_difference(&self, other: &Range<T>) -> Self::Output {
37        let mut output = self.clone();
38        output.symmetric_difference_mut(other);
39        output
40    }
41}
42
43impl<T: Copy + Ord> SymmetricDifference<RangeSet<T>> for RangeSet<T> {
44    type Output = RangeSet<T>;
45
46    fn symmetric_difference(&self, other: &RangeSet<T>) -> Self::Output {
47        let mut output = self.clone();
48        output.symmetric_difference_mut(other);
49        output
50    }
51}
52
53impl<T: Copy + Ord> BitXor<Range<T>> for RangeSet<T> {
54    type Output = RangeSet<T>;
55
56    fn bitxor(mut self, rhs: Range<T>) -> Self::Output {
57        self.symmetric_difference_mut(&rhs);
58        self
59    }
60}
61
62impl<T: Copy + Ord> BitXor<&Range<T>> for RangeSet<T> {
63    type Output = RangeSet<T>;
64
65    fn bitxor(mut self, rhs: &Range<T>) -> Self::Output {
66        self.symmetric_difference_mut(rhs);
67        self
68    }
69}
70
71impl<T: Copy + Ord> BitXor<RangeSet<T>> for RangeSet<T> {
72    type Output = RangeSet<T>;
73
74    fn bitxor(mut self, rhs: RangeSet<T>) -> Self::Output {
75        self.symmetric_difference_mut(&rhs);
76        self
77    }
78}
79
80impl<T: Copy + Ord> BitXor<&RangeSet<T>> for RangeSet<T> {
81    type Output = RangeSet<T>;
82
83    fn bitxor(mut self, rhs: &RangeSet<T>) -> Self::Output {
84        self.symmetric_difference_mut(rhs);
85        self
86    }
87}
88
89impl<T: Copy + Ord> BitXor<RangeSet<T>> for &RangeSet<T> {
90    type Output = RangeSet<T>;
91
92    fn bitxor(self, rhs: RangeSet<T>) -> Self::Output {
93        self.symmetric_difference(&rhs)
94    }
95}
96
97impl<T: Copy + Ord> BitXorAssign<RangeSet<T>> for RangeSet<T> {
98    fn bitxor_assign(&mut self, rhs: RangeSet<T>) {
99        self.symmetric_difference_mut(&rhs);
100    }
101}
102
103impl<T: Copy + Ord> BitXorAssign<&RangeSet<T>> for RangeSet<T> {
104    fn bitxor_assign(&mut self, rhs: &RangeSet<T>) {
105        self.symmetric_difference_mut(rhs);
106    }
107}