Skip to content

Commit 306fa5d

Browse files
committed
Make evict() public.
I must confess that I don't understand the use cases compared to e.g. the slabigator crate. Fixes #6
1 parent aa99ef7 commit 306fa5d

File tree

1 file changed

+34
-27
lines changed

1 file changed

+34
-27
lines changed

src/lib.rs

Lines changed: 34 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,40 @@ impl<K: Eq + Hash + Clone, V> SieveCache<K, V> {
150150
value
151151
}
152152

153+
/// Remove and return a value from the cache that was not recently accessed.
154+
/// If no such value exists, this returns `None`.
155+
/// The returned value is not necessarily the oldest value in the cache.
156+
/// Ask @echaozh on GitHub for details about use cases.
157+
pub fn evict(&mut self) -> Option<V> {
158+
let mut node = self.hand.or(self.tail);
159+
while node.is_some() {
160+
let mut node_ = node.unwrap();
161+
unsafe {
162+
if !node_.as_ref().visited {
163+
break;
164+
}
165+
node_.as_mut().visited = false;
166+
if node_.as_ref().prev.is_some() {
167+
node = node_.as_ref().prev;
168+
} else {
169+
node = self.tail;
170+
}
171+
}
172+
}
173+
if let Some(node_) = node {
174+
let value = unsafe {
175+
self.hand = node_.as_ref().prev;
176+
self.map.remove(&node_.as_ref().key).map(|node| node.value)
177+
};
178+
self.remove_node(node_);
179+
debug_assert!(self.len > 0);
180+
self.len -= 1;
181+
value
182+
} else {
183+
None
184+
}
185+
}
186+
153187
fn add_node(&mut self, mut node: NonNull<Node<K, V>>) {
154188
unsafe {
155189
node.as_mut().next = self.head;
@@ -178,33 +212,6 @@ impl<K: Eq + Hash + Clone, V> SieveCache<K, V> {
178212
}
179213
}
180214
}
181-
182-
fn evict(&mut self) {
183-
let mut node = self.hand.or(self.tail);
184-
while node.is_some() {
185-
let mut node_ = node.unwrap();
186-
unsafe {
187-
if !node_.as_ref().visited {
188-
break;
189-
}
190-
node_.as_mut().visited = false;
191-
if node_.as_ref().prev.is_some() {
192-
node = node_.as_ref().prev;
193-
} else {
194-
node = self.tail;
195-
}
196-
}
197-
}
198-
if let Some(node_) = node {
199-
unsafe {
200-
self.hand = node_.as_ref().prev;
201-
self.map.remove(&node_.as_ref().key);
202-
}
203-
self.remove_node(node_);
204-
debug_assert!(self.len > 0);
205-
self.len -= 1;
206-
}
207-
}
208215
}
209216

210217
#[test]

0 commit comments

Comments
 (0)