summaryrefslogtreecommitdiffstats
path: root/third_party/rust/indexmap/src/set/mutable.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/indexmap/src/set/mutable.rs')
-rw-r--r--third_party/rust/indexmap/src/set/mutable.rs86
1 files changed, 86 insertions, 0 deletions
diff --git a/third_party/rust/indexmap/src/set/mutable.rs b/third_party/rust/indexmap/src/set/mutable.rs
new file mode 100644
index 0000000000..20eaa11221
--- /dev/null
+++ b/third_party/rust/indexmap/src/set/mutable.rs
@@ -0,0 +1,86 @@
+use core::hash::{BuildHasher, Hash};
+
+use super::{Equivalent, IndexSet};
+use crate::map::MutableKeys;
+
+/// Opt-in mutable access to [`IndexSet`] values.
+///
+/// These methods expose `&mut T`, mutable references to the value as it is stored
+/// in the set.
+/// You are allowed to modify the values in the set **if the modification
+/// does not change the value’s hash and equality**.
+///
+/// If values are modified erroneously, you can no longer look them up.
+/// This is sound (memory safe) but a logical error hazard (just like
+/// implementing `PartialEq`, `Eq`, or `Hash` incorrectly would be).
+///
+/// `use` this trait to enable its methods for `IndexSet`.
+///
+/// This trait is sealed and cannot be implemented for types outside this crate.
+pub trait MutableValues: private::Sealed {
+ type Value;
+
+ /// Return item index and mutable reference to the value
+ ///
+ /// Computes in **O(1)** time (average).
+ fn get_full_mut2<Q>(&mut self, value: &Q) -> Option<(usize, &mut Self::Value)>
+ where
+ Q: ?Sized + Hash + Equivalent<Self::Value>;
+
+ /// Return mutable reference to the value at an index.
+ ///
+ /// Valid indices are *0 <= index < self.len()*
+ ///
+ /// Computes in **O(1)** time.
+ fn get_index_mut2(&mut self, index: usize) -> Option<&mut Self::Value>;
+
+ /// Scan through each value in the set and keep those where the
+ /// closure `keep` returns `true`.
+ ///
+ /// The values are visited in order, and remaining values keep their order.
+ ///
+ /// Computes in **O(n)** time (average).
+ fn retain2<F>(&mut self, keep: F)
+ where
+ F: FnMut(&mut Self::Value) -> bool;
+}
+
+/// Opt-in mutable access to [`IndexSet`] values.
+///
+/// See [`MutableValues`] for more information.
+impl<T, S> MutableValues for IndexSet<T, S>
+where
+ S: BuildHasher,
+{
+ type Value = T;
+
+ fn get_full_mut2<Q>(&mut self, value: &Q) -> Option<(usize, &mut T)>
+ where
+ Q: ?Sized + Hash + Equivalent<T>,
+ {
+ match self.map.get_full_mut2(value) {
+ Some((index, value, ())) => Some((index, value)),
+ None => None,
+ }
+ }
+
+ fn get_index_mut2(&mut self, index: usize) -> Option<&mut T> {
+ match self.map.get_index_mut2(index) {
+ Some((value, ())) => Some(value),
+ None => None,
+ }
+ }
+
+ fn retain2<F>(&mut self, mut keep: F)
+ where
+ F: FnMut(&mut T) -> bool,
+ {
+ self.map.retain2(move |value, ()| keep(value));
+ }
+}
+
+mod private {
+ pub trait Sealed {}
+
+ impl<T, S> Sealed for super::IndexSet<T, S> {}
+}