/rust/registry/src/index.crates.io-1949cf8c6b5b557f/indexmap-2.13.0/src/set/mutable.rs
Line | Count | Source |
1 | | use core::hash::{BuildHasher, Hash}; |
2 | | |
3 | | use super::{Equivalent, IndexSet}; |
4 | | use crate::map::MutableKeys; |
5 | | |
6 | | /// Opt-in mutable access to [`IndexSet`] values. |
7 | | /// |
8 | | /// These methods expose `&mut T`, mutable references to the value as it is stored |
9 | | /// in the set. |
10 | | /// You are allowed to modify the values in the set **if the modification |
11 | | /// does not change the value's hash and equality**. |
12 | | /// |
13 | | /// If values are modified erroneously, you can no longer look them up. |
14 | | /// This is sound (memory safe) but a logical error hazard (just like |
15 | | /// implementing `PartialEq`, `Eq`, or `Hash` incorrectly would be). |
16 | | /// |
17 | | /// `use` this trait to enable its methods for `IndexSet`. |
18 | | /// |
19 | | /// This trait is sealed and cannot be implemented for types outside this crate. |
20 | | #[expect(private_bounds)] |
21 | | pub trait MutableValues: Sealed { |
22 | | type Value; |
23 | | |
24 | | /// Return item index and mutable reference to the value |
25 | | /// |
26 | | /// Computes in **O(1)** time (average). |
27 | | fn get_full_mut2<Q>(&mut self, value: &Q) -> Option<(usize, &mut Self::Value)> |
28 | | where |
29 | | Q: ?Sized + Hash + Equivalent<Self::Value>; |
30 | | |
31 | | /// Return mutable reference to the value at an index. |
32 | | /// |
33 | | /// Valid indices are `0 <= index < self.len()`. |
34 | | /// |
35 | | /// Computes in **O(1)** time. |
36 | | fn get_index_mut2(&mut self, index: usize) -> Option<&mut Self::Value>; |
37 | | |
38 | | /// Scan through each value in the set and keep those where the |
39 | | /// closure `keep` returns `true`. |
40 | | /// |
41 | | /// The values are visited in order, and remaining values keep their order. |
42 | | /// |
43 | | /// Computes in **O(n)** time (average). |
44 | | fn retain2<F>(&mut self, keep: F) |
45 | | where |
46 | | F: FnMut(&mut Self::Value) -> bool; |
47 | | } |
48 | | |
49 | | /// Opt-in mutable access to [`IndexSet`] values. |
50 | | /// |
51 | | /// See [`MutableValues`] for more information. |
52 | | impl<T, S> MutableValues for IndexSet<T, S> |
53 | | where |
54 | | S: BuildHasher, |
55 | | { |
56 | | type Value = T; |
57 | | |
58 | 0 | fn get_full_mut2<Q>(&mut self, value: &Q) -> Option<(usize, &mut T)> |
59 | 0 | where |
60 | 0 | Q: ?Sized + Hash + Equivalent<T>, |
61 | | { |
62 | 0 | match self.map.get_full_mut2(value) { |
63 | 0 | Some((index, value, ())) => Some((index, value)), |
64 | 0 | None => None, |
65 | | } |
66 | 0 | } |
67 | | |
68 | 0 | fn get_index_mut2(&mut self, index: usize) -> Option<&mut T> { |
69 | 0 | match self.map.get_index_mut2(index) { |
70 | 0 | Some((value, ())) => Some(value), |
71 | 0 | None => None, |
72 | | } |
73 | 0 | } |
74 | | |
75 | 0 | fn retain2<F>(&mut self, mut keep: F) |
76 | 0 | where |
77 | 0 | F: FnMut(&mut T) -> bool, |
78 | | { |
79 | 0 | self.map.retain2(move |value, ()| keep(value)); |
80 | 0 | } |
81 | | } |
82 | | |
83 | | trait Sealed {} |
84 | | |
85 | | impl<T, S> Sealed for IndexSet<T, S> {} |