serde_with/duplicate_key_impls/
last_value_wins.rs

1use crate::prelude::*;
2
3pub trait DuplicateInsertsLastWinsSet<T> {
4    fn new(size_hint: Option<usize>) -> Self;
5
6    /// Insert or replace the existing value
7    fn replace(&mut self, value: T);
8}
9
10#[cfg(feature = "std")]
11impl<T, S> DuplicateInsertsLastWinsSet<T> for HashSet<T, S>
12where
13    T: Eq + Hash,
14    S: BuildHasher + Default,
15{
16    #[inline]
17    fn new(size_hint: Option<usize>) -> Self {
18        match size_hint {
19            Some(size) => Self::with_capacity_and_hasher(size, S::default()),
20            None => Self::with_hasher(S::default()),
21        }
22    }
23
24    #[inline]
25    fn replace(&mut self, value: T) {
26        // Hashset already fulfils the contract
27        self.replace(value);
28    }
29}
30
31#[cfg(feature = "hashbrown_0_14")]
32impl<T, S> DuplicateInsertsLastWinsSet<T> for hashbrown_0_14::HashSet<T, S>
33where
34    T: Eq + Hash,
35    S: BuildHasher + Default,
36{
37    #[inline]
38    fn new(size_hint: Option<usize>) -> Self {
39        match size_hint {
40            Some(size) => Self::with_capacity_and_hasher(size, S::default()),
41            None => Self::with_hasher(S::default()),
42        }
43    }
44
45    #[inline]
46    fn replace(&mut self, value: T) {
47        // Hashset already fulfils the contract
48        self.replace(value);
49    }
50}
51
52#[cfg(feature = "hashbrown_0_15")]
53impl<T, S> DuplicateInsertsLastWinsSet<T> for hashbrown_0_15::HashSet<T, S>
54where
55    T: Eq + Hash,
56    S: BuildHasher + Default,
57{
58    #[inline]
59    fn new(size_hint: Option<usize>) -> Self {
60        match size_hint {
61            Some(size) => Self::with_capacity_and_hasher(size, S::default()),
62            None => Self::with_hasher(S::default()),
63        }
64    }
65
66    #[inline]
67    fn replace(&mut self, value: T) {
68        // Hashset already fulfils the contract
69        self.replace(value);
70    }
71}
72
73#[cfg(feature = "hashbrown_0_16")]
74impl<T, S> DuplicateInsertsLastWinsSet<T> for hashbrown_0_16::HashSet<T, S>
75where
76    T: Eq + Hash,
77    S: BuildHasher + Default,
78{
79    #[inline]
80    fn new(size_hint: Option<usize>) -> Self {
81        match size_hint {
82            Some(size) => Self::with_capacity_and_hasher(size, S::default()),
83            None => Self::with_hasher(S::default()),
84        }
85    }
86
87    #[inline]
88    fn replace(&mut self, value: T) {
89        // Hashset already fulfils the contract
90        self.replace(value);
91    }
92}
93
94#[cfg(feature = "indexmap_1")]
95impl<T, S> DuplicateInsertsLastWinsSet<T> for indexmap_1::IndexSet<T, S>
96where
97    T: Eq + Hash,
98    S: BuildHasher + Default,
99{
100    #[inline]
101    fn new(size_hint: Option<usize>) -> Self {
102        match size_hint {
103            Some(size) => Self::with_capacity_and_hasher(size, S::default()),
104            None => Self::with_hasher(S::default()),
105        }
106    }
107
108    #[inline]
109    fn replace(&mut self, value: T) {
110        // Hashset already fulfils the contract
111        self.replace(value);
112    }
113}
114
115#[cfg(feature = "indexmap_2")]
116impl<T, S> DuplicateInsertsLastWinsSet<T> for indexmap_2::IndexSet<T, S>
117where
118    T: Eq + Hash,
119    S: BuildHasher + Default,
120{
121    #[inline]
122    fn new(size_hint: Option<usize>) -> Self {
123        match size_hint {
124            Some(size) => Self::with_capacity_and_hasher(size, S::default()),
125            None => Self::with_hasher(S::default()),
126        }
127    }
128
129    #[inline]
130    fn replace(&mut self, value: T) {
131        // Hashset already fulfils the contract
132        self.replace(value);
133    }
134}
135
136impl<T> DuplicateInsertsLastWinsSet<T> for BTreeSet<T>
137where
138    T: Ord,
139{
140    #[inline]
141    fn new(_size_hint: Option<usize>) -> Self {
142        Self::new()
143    }
144
145    #[inline]
146    fn replace(&mut self, value: T) {
147        // BTreeSet already fulfils the contract
148        self.replace(value);
149    }
150}