@@ -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