From 07bec537418d95ef352ae6a2fe728872e697567d Mon Sep 17 00:00:00 2001 From: Yegor Vaskonyan Date: Tue, 16 Jul 2024 16:27:57 +0200 Subject: [PATCH] feat: add `get_full` to `index_map::FrozenIndexMap` refactor: fix variable names in `index_map.rs` and `index_set.rs` --- src/index_map.rs | 29 ++++++++++++++++++++++++++++- src/index_set.rs | 10 +++++----- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/index_map.rs b/src/index_map.rs index 4996eb2..c432fad 100644 --- a/src/index_map.rs +++ b/src/index_map.rs @@ -134,7 +134,7 @@ impl FrozenIndexMap { /// # Examples /// /// ``` - /// use elsa::FrozenIndexMap; + /// use elsa::index_map::FrozenIndexMap; /// /// let map = FrozenIndexMap::new(); /// map.insert(1, Box::new("a")); @@ -186,6 +186,33 @@ impl FrozenIndexMap { ret } + /// Returns a reference to the key, along with its index and a reference to its value + /// + /// # Examples + /// + /// ``` + /// use elsa::index_map::FrozenIndexMap; + /// + /// let map = FrozenIndexMap::new(); + /// map.insert("1", Box::new("a")); + /// assert_eq!(map.get_full("1"), Some((0, "1", &"a"))); + /// assert_eq!(map.get_full("2"), None); + /// ``` + pub fn get_full(&self, k: &Q) -> Option<(usize, &K::Target, &V::Target)> + where + Q: ?Sized + Hash + Equivalent, + K: StableDeref, + { + assert!(!self.in_use.get()); + self.in_use.set(true); + let ret = unsafe { + let map = self.map.get(); + (*map).get_full(k).map(|(i, k, v)| (i, &**k, &**v)) + }; + self.in_use.set(false); + ret + } + /// Applies a function to the owner of the value corresponding to the key (if any). /// /// The key may be any borrowed form of the map's key type, but diff --git a/src/index_set.rs b/src/index_set.rs index 0186007..1645b90 100644 --- a/src/index_set.rs +++ b/src/index_set.rs @@ -74,9 +74,9 @@ impl FrozenIndexSet { /// # Example /// ``` /// use elsa::index_set::FrozenIndexSet; - /// let map = FrozenIndexSet::new(); - /// assert_eq!(map.insert_full(Box::new("a")), (0, &"a")); - /// assert_eq!(map.insert_full(Box::new("b")), (1, &"b")); + /// let set = FrozenIndexSet::new(); + /// assert_eq!(set.insert_full(Box::new("a")), (0, &"a")); + /// assert_eq!(set.insert_full(Box::new("b")), (1, &"b")); /// ``` pub fn insert_full(&self, value: T) -> (usize, &T::Target) { assert!(!self.in_use.get()); @@ -163,8 +163,8 @@ impl FrozenIndexSet { assert!(!self.in_use.get()); self.in_use.set(true); let ret = unsafe { - let map = self.set.get(); - (*map).get_index_of(k) + let set = self.set.get(); + (*set).get_index_of(k) }; self.in_use.set(false); ret