Open qm3ster opened 3 years ago
Is there a reason this needs Slab::try_remove
and couldn't be implemented as
pub fn try_remove(&mut self, key: &Key) -> Option<Expired<T>> {
if self.slab.contains(key.index) {
Some(self.remove(key))
} else {
None
}
}
Separate calls to Vec::get
and Vec::get_mut
, each with their own pattern match?
Yeah, they might optimize the same, but it's a sensible method to have.
Having taken a look at slab
, I now see my "alternatives" part is unapplicable.
So the real question is in the "additional context" section: should this method exist?
And if so, how much extra doc comment does it need to discourage key mixing?
Is your feature request related to a problem? Please describe.
DelayQueue::remove
states:There is no corresponding
Option
orResult
-returning method. This means that the user has to manually ensure they don'tremove
a key twice, or a key that has already been yielded bypoll_expired
.Describe the solution you'd like Perhaps it would be okay to have a method that returns
None
instead of panicking, so thatKey
s can be passed around less carefully, but without overhead such as keeping aHashSet
of currently pendingKey
s alongside theDelayQueue
.Describe alternatives you've considered Another option would be replacing
Key
withT: <some traits>
, so that the user can manually avoid collisions with semantic unique timer identifiers instead of moving literally anything into theDelayQueue
but having to use the opaque non-reusableKey
type.Additional context The
Key
type just wraps ausize
, so a colliding key from another instance ofDelayQueue
or just an extremely old one could exist, causing a false positive removal. Perhaps the soft-failing methods were intentionally foregone to discourage membership checking.