rangeset/
symmetric_difference.rs1use std::ops::{BitXor, BitXorAssign, Range};
2
3use crate::{DifferenceMut, Intersection, RangeSet, UnionMut};
4
5pub trait SymmetricDifferenceMut<Rhs> {
6 fn symmetric_difference_mut(&mut self, other: &Rhs);
8}
9
10pub trait SymmetricDifference<Rhs> {
11 type Output;
12
13 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}