Skip to content

Commit 670c3af

Browse files
committed
Add more public functionality and unit tests for CollideMap and CollideSet
Refactor and simplify set operations
1 parent ef17a4c commit 670c3af

File tree

2 files changed

+125
-11
lines changed

2 files changed

+125
-11
lines changed

src/collidea.rs

Lines changed: 61 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,12 @@ impl<K: Hash, V> CollideMap<K, V> {
2525
}
2626
}
2727

28+
pub fn capacity(&self) -> usize {
29+
self.inner.capacity()
30+
}
31+
2832
pub fn clear(&mut self) {
29-
self.inner.clear();
33+
self.inner.clear()
3034
}
3135

3236
pub fn contains_key(&self, k: &K) -> bool {
@@ -45,6 +49,10 @@ impl<K: Hash, V> CollideMap<K, V> {
4549
self.inner.insert(get_hash_xxh(k), v)
4650
}
4751

52+
pub fn is_empty(&self) -> bool {
53+
self.inner.is_empty()
54+
}
55+
4856
pub fn len(&self) -> usize {
4957
self.inner.len()
5058
}
@@ -53,6 +61,14 @@ impl<K: Hash, V> CollideMap<K, V> {
5361
self.inner.remove(&get_hash_xxh(k))
5462
}
5563

64+
pub fn reserve(&mut self, additional: usize) {
65+
self.inner.reserve(additional)
66+
}
67+
68+
pub fn shrink_to_fit(&mut self) {
69+
self.inner.shrink_to_fit()
70+
}
71+
5672
pub fn values(&self) -> impl Iterator<Item = &V> {
5773
self.inner.values()
5874
}
@@ -76,8 +92,12 @@ impl<K: Hash> CollideSet<K> {
7692
}
7793
}
7894

95+
pub fn capacity(&self) -> usize {
96+
self.inner.capacity()
97+
}
98+
7999
pub fn clear(&mut self) {
80-
self.inner.clear();
100+
self.inner.clear()
81101
}
82102

83103
pub fn contains(&self, k: &K) -> bool {
@@ -88,6 +108,18 @@ impl<K: Hash> CollideSet<K> {
88108
self.inner.insert(get_hash_xxh(&k))
89109
}
90110

111+
pub fn is_disjoint(&self, other: &CollideSet<K>) -> bool {
112+
self.inner.is_disjoint(&other.inner)
113+
}
114+
115+
pub fn is_empty(&self) -> bool {
116+
self.inner.is_empty()
117+
}
118+
119+
pub fn is_subset(&self, other: &CollideSet<K>) -> bool {
120+
self.inner.is_subset(&other.inner)
121+
}
122+
91123
pub fn len(&self) -> usize {
92124
self.inner.len()
93125
}
@@ -96,17 +128,35 @@ impl<K: Hash> CollideSet<K> {
96128
self.inner.remove(&get_hash_xxh(k))
97129
}
98130

99-
pub fn union(&self, other: &CollideSet<K>) -> CollideSet<K> {
100-
let union_m = self.inner.union(&other.inner);
101-
let mut union: CollideSet<K> = CollideSet::new();
102-
union.inner = union_m.map(|k| k.clone()).collect();
103-
union
131+
pub fn reserve(&mut self, additional: usize) {
132+
self.inner.reserve(additional)
133+
}
134+
135+
pub fn difference(&self, other: &CollideSet<K>) -> CollideSet<K> {
136+
let mut result: CollideSet<K> = CollideSet::new();
137+
result.inner = self.inner.difference(&other.inner).cloned().collect();
138+
result
139+
}
140+
141+
pub fn symmetric_difference(&self, other: &CollideSet<K>) -> CollideSet<K> {
142+
let mut result: CollideSet<K> = CollideSet::new();
143+
result.inner = self
144+
.inner
145+
.symmetric_difference(&other.inner)
146+
.cloned()
147+
.collect();
148+
result
104149
}
105150

106151
pub fn intersection(&self, other: &CollideSet<K>) -> CollideSet<K> {
107-
let intersection_m = self.inner.intersection(&other.inner);
108-
let mut intersection: CollideSet<K> = CollideSet::new();
109-
intersection.inner = intersection_m.map(|k| k.clone()).collect();
110-
intersection
152+
let mut result: CollideSet<K> = CollideSet::new();
153+
result.inner = self.inner.intersection(&other.inner).cloned().collect();
154+
result
155+
}
156+
157+
pub fn union(&self, other: &CollideSet<K>) -> CollideSet<K> {
158+
let mut result: CollideSet<K> = CollideSet::new();
159+
result.inner = self.inner.union(&other.inner).cloned().collect();
160+
result
111161
}
112162
}

tests/collidea_test.rs

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,13 @@ fn collide_set_operator_test() {
6161
let intersection_b_a = set_b.intersection(&set_a);
6262
let union_a_b = set_a.union(&set_b);
6363
let union_b_a = set_b.union(&set_a);
64+
let difference_a_b = set_a.difference(&set_b);
65+
let difference_b_a = set_b.difference(&set_a);
66+
let symmetric_difference_a_b = set_a.symmetric_difference(&set_b);
67+
let symmetric_difference_b_a = set_b.symmetric_difference(&set_a);
6468

69+
assert_eq!(set_a.is_empty(), false);
70+
assert_eq!(set_b.is_empty(), false);
6571
assert_eq!(union_a_b.len(), size);
6672
assert_eq!(union_b_a.len(), size);
6773
assert_eq!(intersection_a_b.len(), a_end - b_start);
@@ -81,5 +87,63 @@ fn collide_set_operator_test() {
8187
intersection_b_a.contains(&element),
8288
i >= b_start && i < a_end
8389
);
90+
assert_eq!(difference_a_b.contains(&element), i < b_start);
91+
assert_eq!(difference_b_a.contains(&element), i >= a_end);
92+
assert_eq!(
93+
difference_a_b.contains(&element) && difference_b_a.contains(&element),
94+
false
95+
);
96+
assert_eq!(
97+
symmetric_difference_a_b.contains(&element),
98+
i < b_start || i >= a_end
99+
);
100+
assert_eq!(
101+
symmetric_difference_a_b.contains(&element),
102+
symmetric_difference_b_a.contains(&element)
103+
);
104+
assert_eq!(
105+
intersection_a_b.contains(&element) ^ symmetric_difference_a_b.contains(&element),
106+
true
107+
);
84108
}
109+
110+
assert_eq!(
111+
set_a.is_subset(&union_a_b) && set_b.is_subset(&union_a_b),
112+
true
113+
);
114+
assert_eq!(
115+
union_a_b.is_subset(&union_b_a) && union_b_a.is_subset(&union_a_b),
116+
true
117+
);
118+
assert_eq!(
119+
intersection_a_b.is_subset(&set_a) && intersection_a_b.is_subset(&set_b),
120+
true
121+
);
122+
assert_eq!(
123+
intersection_a_b.is_subset(&intersection_b_a)
124+
&& intersection_b_a.is_subset(&intersection_a_b),
125+
true
126+
);
127+
assert_eq!(difference_a_b.is_subset(&set_a), true);
128+
assert_eq!(difference_b_a.is_subset(&set_b), true);
129+
assert_eq!(difference_a_b.is_subset(&symmetric_difference_a_b), true);
130+
assert_eq!(difference_b_a.is_subset(&symmetric_difference_b_a), true);
131+
assert_eq!(intersection_a_b.is_subset(&union_a_b), true);
132+
assert_eq!(symmetric_difference_a_b.is_subset(&union_a_b), true);
133+
assert_eq!(
134+
symmetric_difference_a_b.is_subset(&symmetric_difference_b_a)
135+
&& symmetric_difference_b_a.is_subset(&symmetric_difference_a_b),
136+
true
137+
);
138+
assert_eq!(
139+
set_a.is_disjoint(&difference_b_a) && set_b.is_disjoint(&difference_a_b),
140+
true
141+
);
142+
assert_eq!(
143+
intersection_a_b.is_disjoint(&symmetric_difference_a_b),
144+
true
145+
);
146+
assert_eq!(difference_a_b.is_disjoint(&difference_b_a), true);
147+
assert_eq!(difference_a_b.is_disjoint(&intersection_a_b), true);
148+
assert_eq!(difference_b_a.is_disjoint(&intersection_b_a), true);
85149
}

0 commit comments

Comments
 (0)