diff options
Diffstat (limited to 'third_party/rust/tokio/src/util/slab/generation.rs')
-rw-r--r-- | third_party/rust/tokio/src/util/slab/generation.rs | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/third_party/rust/tokio/src/util/slab/generation.rs b/third_party/rust/tokio/src/util/slab/generation.rs new file mode 100644 index 0000000000..4b16b2caf6 --- /dev/null +++ b/third_party/rust/tokio/src/util/slab/generation.rs @@ -0,0 +1,32 @@ +use crate::util::bit; +use crate::util::slab::Address; + +/// An mutation identifier for a slot in the slab. The generation helps prevent +/// accessing an entry with an outdated token. +#[derive(Copy, Clone, Debug, PartialEq, Eq, Ord, PartialOrd)] +pub(crate) struct Generation(usize); + +impl Generation { + pub(crate) const WIDTH: u32 = Address::GENERATION_WIDTH; + + pub(super) const MAX: usize = bit::mask_for(Address::GENERATION_WIDTH); + + /// Create a new generation + /// + /// # Panics + /// + /// Panics if `value` is greater than max generation. + pub(crate) fn new(value: usize) -> Generation { + assert!(value <= Self::MAX); + Generation(value) + } + + /// Returns the next generation value + pub(crate) fn next(self) -> Generation { + Generation((self.0 + 1) & Self::MAX) + } + + pub(crate) fn to_usize(self) -> usize { + self.0 + } +} |