summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/collection/collection.rs17
1 files changed, 5 insertions, 12 deletions
diff --git a/src/collection/collection.rs b/src/collection/collection.rs
index ae9f3f6..22a2d11 100644
--- a/src/collection/collection.rs
+++ b/src/collection/collection.rs
@@ -6,16 +6,9 @@ use super::{LockCollection, LockGuard};
/// returns `true` if the list contains a duplicate
#[must_use]
-fn contains_duplicates(l: &[usize]) -> bool {
- for i in 0..l.len() {
- for j in (i + 1)..l.len() {
- if l[i] == l[j] {
- return true;
- }
- }
- }
-
- false
+fn contains_duplicates(l: &mut [usize]) -> bool {
+ l.sort_unstable();
+ l.windows(2).any(|w| w[0] == w[1])
}
impl<'a, L: OwnedLockable<'a>> From<L> for LockCollection<L> {
@@ -183,8 +176,8 @@ impl<'a, L: Lockable<'a>> LockCollection<L> {
/// ```
#[must_use]
pub fn try_new(data: L) -> Option<Self> {
- let ptrs = data.get_ptrs();
- if contains_duplicates(&ptrs) {
+ let mut ptrs = data.get_ptrs();
+ if contains_duplicates(&mut ptrs) {
return None;
}