serde_with/duplicate_key_impls/
last_value_wins.rs1use 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 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 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 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 self.replace(value);
68 }
69}