serde_with/duplicate_key_impls/
last_value_wins.rs

1use alloc::collections::BTreeSet;
2use core::hash::{BuildHasher, Hash};
3#[cfg(feature = "indexmap")]
4use indexmap_crate::IndexSet;
5use std::collections::HashSet;
6
7pub trait DuplicateInsertsLastWinsSet<T> {
8    fn new(size_hint: Option<usize>) -> Self;
9
10    /// Insert or replace the existing value
11    fn replace(&mut self, value: T);
12}
13
14impl<T, S> DuplicateInsertsLastWinsSet<T> for HashSet<T, S>
15where
16    T: Eq + Hash,
17    S: BuildHasher + Default,
18{
19    #[inline]
20    fn new(size_hint: Option<usize>) -> Self {
21        match size_hint {
22            Some(size) => Self::with_capacity_and_hasher(size, S::default()),
23            None => Self::with_hasher(S::default()),
24        }
25    }
26
27    #[inline]
28    fn replace(&mut self, value: T) {
29        // Hashset already fulfils the contract
30        self.replace(value);
31    }
32}
33
34#[cfg(feature = "indexmap")]
35impl<T, S> DuplicateInsertsLastWinsSet<T> for IndexSet<T, S>
36where
37    T: Eq + Hash,
38    S: BuildHasher + Default,
39{
40    #[inline]
41    fn new(size_hint: Option<usize>) -> Self {
42        match size_hint {
43            Some(size) => Self::with_capacity_and_hasher(size, S::default()),
44            None => Self::with_hasher(S::default()),
45        }
46    }
47
48    #[inline]
49    fn replace(&mut self, value: T) {
50        // Hashset already fulfils the contract
51        self.replace(value);
52    }
53}
54
55impl<T> DuplicateInsertsLastWinsSet<T> for BTreeSet<T>
56where
57    T: Ord,
58{
59    #[inline]
60    fn new(_size_hint: Option<usize>) -> Self {
61        Self::new()
62    }
63
64    #[inline]
65    fn replace(&mut self, value: T) {
66        // BTreeSet already fulfils the contract
67        self.replace(value);
68    }
69}