use core::fmt::{Debug, Formatter, Result as FmtResult};
use core::iter::{Enumerate, FromIterator};
use core::mem::{forget, replace};
use core::ops::{Index, IndexMut};
use core::slice::{Iter as SliceIter, IterMut as SliceIterMut};
use crate::builder::Builder;
use crate::entries::{DynamicEntries, Entries, Entry};
use crate::iter::{DrainMapper, GenericIter, KeyMapper, KeyValueMapper, ValueMapper};
use crate::key::Key;
#[cfg(feature = "range")]
use core::ops::{Bound, RangeBounds};
#[cfg(feature = "range")]
use crate::{
entries::RangeIndices,
range_iter::{EntriesMutRef, EntriesRef, GenericRangeIter},
};
pub struct GenericSlab<T, TKey, TEntries>
where
TKey: Key<T>,
{
pub(crate) meta: Meta<T, TKey>,
pub(crate) entries: TEntries,
}
#[derive(Debug)]
pub struct Meta<T, TKey>
where
TKey: Key<T>,
{
pub(crate) len: usize,
pub(crate) key_context: TKey::Context,
pub(crate) first_vacant: usize,
#[cfg(feature = "range")]
pub(crate) first_occupied: usize,
#[cfg(feature = "range")]
pub(crate) last_occupied: usize,
}
pub struct GenericVacantEntry<'a, T, TKey, TEntries>
where
TKey: Key<T>,
{
index: usize,
slab: &'a mut GenericSlab<T, TKey, TEntries>,
}
pub type Iter<'a, T, TKey> =
GenericIter<Enumerate<SliceIter<'a, Entry<T, TKey>>>, KeyValueMapper<&'a Meta<T, TKey>>>;
pub type IterMut<'a, T, TKey> =
GenericIter<Enumerate<SliceIterMut<'a, Entry<T, TKey>>>, KeyValueMapper<&'a Meta<T, TKey>>>;
pub type IntoIter<T, TKey, TEntries> =
GenericIter<Enumerate<<TEntries as IntoIterator>::IntoIter>, KeyValueMapper<Meta<T, TKey>>>;
pub type Keys<'a, T, TKey> =
GenericIter<Enumerate<SliceIter<'a, Entry<T, TKey>>>, KeyMapper<&'a Meta<T, TKey>>>;
pub type Values<'a, T, TKey> = GenericIter<SliceIter<'a, Entry<T, TKey>>, ValueMapper>;
pub type ValuesMut<'a, T, TKey> = GenericIter<SliceIterMut<'a, Entry<T, TKey>>, ValueMapper>;
pub type IntoValues<TEntries> = GenericIter<<TEntries as IntoIterator>::IntoIter, ValueMapper>;
#[cfg(feature = "range")]
pub type RangeIter<'a, T, TKey, TEntries> = GenericRangeIter<EntriesRef<'a, T, TKey, TEntries>>;
#[cfg(feature = "range")]
pub type RangeIterMut<'a, T, TKey, TEntries> =
GenericRangeIter<EntriesMutRef<'a, T, TKey, TEntries>>;
pub type Drain<'a, T, TKey> =
GenericIter<Enumerate<SliceIterMut<'a, Entry<T, TKey>>>, DrainMapper<&'a mut Meta<T, TKey>>>;
impl<T, TKey, TEntries> GenericSlab<T, TKey, TEntries>
where
TKey: Key<T>,
TEntries: Entries<T, TKey> + Default,
{
#[must_use]
pub fn new() -> Self {
Self::from_entries(TEntries::default())
}
}
impl<T, TKey, TEntries> GenericSlab<T, TKey, TEntries>
where
TKey: Key<T>,
TEntries: Entries<T, TKey>,
{
pub fn from_entries(mut entries: TEntries) -> Self {
entries.clear();
let meta = Meta {
len: 0,
key_context: TKey::Context::default(),
first_vacant: 0,
#[cfg(feature = "range")]
first_occupied: crate::INVALID_INDEX,
#[cfg(feature = "range")]
last_occupied: crate::INVALID_INDEX,
};
Self { meta, entries }
}
pub fn key_context(&self) -> &TKey::Context {
&self.meta.key_context
}
pub fn key_context_mut(&mut self) -> &mut TKey::Context {
&mut self.meta.key_context
}
pub fn capacity(&self) -> usize {
self.entries.capacity()
}
pub fn clear(&mut self) {
self.entries.clear();
self.meta.len = 0;
self.meta.first_vacant = 0;
#[cfg(feature = "range")]
{
self.meta.first_occupied = crate::INVALID_INDEX;
self.meta.last_occupied = crate::INVALID_INDEX;
}
}
pub fn len(&self) -> usize {
self.meta.len
}
pub fn is_empty(&self) -> bool {
self.meta.len == 0
}
#[inline]
pub fn get(&self, key: TKey) -> Option<&T> {
self.get_at(&key)
}
#[inline]
pub fn get_mut(&mut self, key: TKey) -> Option<&mut T> {
self.get_mut_at(&key)
}
pub fn get2_mut(&mut self, key1: TKey, key2: TKey) -> Option<(&mut T, &mut T)> {
let index1 = key1.index(&self.meta.key_context);
let index2 = key2.index(&self.meta.key_context);
assert!(index1 != index2);
let (entry1, entry2) = if index1 > index2 {
let (slice1, slice2) = self.entries.as_mut().split_at_mut(index1);
(slice2.get_mut(0), slice1.get_mut(index2))
} else {
let (slice1, slice2) = self.entries.as_mut().split_at_mut(index2);
(slice1.get_mut(index1), slice2.get_mut(0))
};
match (entry1, entry2) {
(
Some(Entry::Occupied {
value: value1,
key_data: data1,
..
}),
Some(Entry::Occupied {
value: value2,
key_data: data2,
..
}),
) if key1.verify(&self.meta.key_context, data1)
&& key2.verify(&self.meta.key_context, data2) =>
{
Some((value1, value2))
}
_ => None,
}
}
pub unsafe fn get_unchecked(&self, key: TKey) -> &T {
let index = key.index(&self.meta.key_context);
match self.entries.as_ref().get_unchecked(index) {
Entry::Occupied { value, .. } => value,
_ => unreachable!(),
}
}
pub unsafe fn get_unchecked_mut(&mut self, key: TKey) -> &mut T {
let index = key.index(&self.meta.key_context);
match self.entries.as_mut().get_unchecked_mut(index) {
Entry::Occupied { value, .. } => value,
_ => unreachable!(),
}
}
pub unsafe fn get2_unchecked_mut(&mut self, key1: TKey, key2: TKey) -> (&mut T, &mut T) {
let index1 = key1.index(&self.meta.key_context);
let index2 = key2.index(&self.meta.key_context);
debug_assert_ne!(index1, index2);
let ptr = self.entries.as_mut().as_mut_ptr();
let ptr1 = ptr.add(index1);
let ptr2 = ptr.add(index2);
match (&mut *ptr1, &mut *ptr2) {
(Entry::Occupied { value: value1, .. }, Entry::Occupied { value: value2, .. }) => {
(value1, value2)
}
_ => unreachable!(),
}
}
pub fn iter(&self) -> Iter<'_, T, TKey> {
GenericIter::new(
self.meta.len,
self.entries.as_ref().iter().enumerate(),
KeyValueMapper::new(&self.meta),
)
}
pub fn iter_mut(&mut self) -> IterMut<'_, T, TKey> {
GenericIter::new(
self.meta.len,
self.entries.as_mut().iter_mut().enumerate(),
KeyValueMapper::new(&self.meta),
)
}
pub fn keys(&self) -> Keys<'_, T, TKey> {
GenericIter::new(
self.meta.len,
self.entries.as_ref().iter().enumerate(),
KeyMapper::new(&self.meta),
)
}
pub fn values(&self) -> Values<'_, T, TKey> {
GenericIter::new(self.meta.len, self.entries.as_ref().iter(), ValueMapper)
}
pub fn values_mut(&mut self) -> ValuesMut<'_, T, TKey> {
GenericIter::new(self.meta.len, self.entries.as_mut().iter_mut(), ValueMapper)
}
#[cfg(feature = "range")]
pub fn ordered_iter(&self) -> RangeIter<'_, T, TKey, TEntries> {
GenericRangeIter::new(
Bound::Included(self.meta.first_occupied),
Bound::Included(self.meta.last_occupied),
EntriesRef::new(self),
)
}
#[cfg(feature = "range")]
pub fn ordered_iter_mut(&mut self) -> RangeIterMut<'_, T, TKey, TEntries> {
GenericRangeIter::new(
Bound::Included(self.meta.first_occupied),
Bound::Included(self.meta.last_occupied),
EntriesMutRef::new(self),
)
}
#[cfg(feature = "range")]
pub fn range<R>(&self, range: R) -> RangeIter<'_, T, TKey, TEntries>
where
R: RangeBounds<TKey>,
{
let (front, back) = self.index_range(range);
GenericRangeIter::new(front, back, EntriesRef::new(self))
}
#[cfg(feature = "range")]
pub fn range_mut<R>(&mut self, range: R) -> RangeIterMut<'_, T, TKey, TEntries>
where
R: RangeBounds<TKey>,
{
let (front, back) = self.index_range(range);
GenericRangeIter::new(front, back, EntriesMutRef::new(self))
}
pub fn insert(&mut self, value: T) -> TKey {
let index = self.meta.first_vacant;
self.insert_at(index, value);
self.occupied_key_at(index)
}
pub fn vacant_key(&self) -> TKey {
self.vacant_key_at(self.meta.first_vacant)
}
pub fn vacant_entry(&mut self) -> GenericVacantEntry<'_, T, TKey, TEntries> {
GenericVacantEntry {
index: self.meta.first_vacant,
slab: self,
}
}
pub fn contains(&self, key: TKey) -> bool {
let index = key.index(&self.meta.key_context);
match self.entries.as_ref().get(index) {
Some(Entry::Occupied { key_data, .. })
if key.verify(&self.meta.key_context, key_data) =>
{
true
}
_ => false,
}
}
pub fn try_remove(&mut self, key: TKey) -> Option<T> {
let index = key.index(&self.meta.key_context);
let entry = self.entries.as_mut().get_mut(index);
match entry {
Some(Entry::Occupied { key_data, .. })
if key.verify(&self.meta.key_context, key_data) =>
{
Some(self.remove_at(index))
}
_ => None,
}
}
pub fn remove(&mut self, key: TKey) -> T {
self.try_remove(key).expect("invalid key")
}
pub fn retain<F>(&mut self, mut f: F)
where
F: FnMut(TKey, &mut T) -> bool,
{
for index in 0..self.entries.as_mut().len() {
let keep = match &mut self.entries.as_mut()[index] {
Entry::Occupied {
value, key_data, ..
} => f(
TKey::new_occupied(&self.meta.key_context, index, key_data),
value,
),
_ => true,
};
if !keep {
self.remove_at(index);
}
}
}
pub fn shrink_to_fit(&mut self) {
let len_before = self.entries.as_ref().len();
while let Some(Entry::Vacant { .. }) = self.entries.as_mut().last() {
self.entries.pop();
}
if self.entries.as_ref().len() != len_before {
self.recreate_vacant_list();
}
self.entries.shrink_to_fit();
}
pub fn compact<F>(&mut self, mut rekey: F)
where
F: FnMut(&mut T, TKey, TKey) -> bool,
{
struct CleanupGuard<'a, T, TKey, TEntries>
where
TKey: Key<T>,
TEntries: Entries<T, TKey>,
{
slab: &'a mut GenericSlab<T, TKey, TEntries>,
decrement: bool,
}
impl<T, TKey, TEntries> Drop for CleanupGuard<'_, T, TKey, TEntries>
where
TKey: Key<T>,
TEntries: Entries<T, TKey>,
{
fn drop(&mut self) {
if self.decrement {
self.slab.meta.len -= 1;
}
self.slab.recreate_vacant_list();
}
}
let mut occupied_until = 0;
let mut guard = CleanupGuard {
slab: self,
decrement: true,
};
while guard.slab.entries.as_ref().len() > guard.slab.meta.len {
if let Some(Entry::Occupied {
mut value,
key_data,
#[cfg(feature = "range")]
range,
}) = guard.slab.entries.pop()
{
let old_index = guard.slab.entries.as_ref().len();
let old_key =
TKey::new_occupied(&guard.slab.meta.key_context, old_index, &key_data);
let new_key = loop {
match guard.slab.entries.as_ref().get(occupied_until) {
Some(Entry::Occupied { .. }) => occupied_until += 1,
Some(Entry::Vacant { key_data, .. }) => {
break TKey::new_vacant(
&guard.slab.meta.key_context,
occupied_until,
Some(key_data),
);
}
_ => unreachable!(),
}
};
if !rekey(&mut value, old_key, new_key) {
guard.decrement = false;
guard.slab.entries.push(Entry::Occupied {
value,
key_data,
#[cfg(feature = "range")]
range,
});
guard.slab.entries.shrink_to_fit();
return;
}
let entry = &mut guard.slab.entries.as_mut()[occupied_until];
let key_data = match replace(entry, Entry::Unknown) {
Entry::Vacant { key_data, .. } => key_data,
_ => unreachable!(),
};
*entry = Entry::Occupied {
value,
key_data: TKey::convert_into_occupied(&guard.slab.meta.key_context, key_data),
#[cfg(feature = "range")]
range,
};
#[cfg(feature = "range")]
guard
.slab
.move_occupied_index(old_index, occupied_until, range);
occupied_until += 1;
}
}
guard.slab.meta.first_vacant = guard.slab.meta.len;
guard.slab.entries.shrink_to_fit();
forget(guard);
}
pub fn drain(&mut self) -> Drain<'_, T, TKey> {
GenericIter::new(
self.meta.len,
self.entries.as_mut().iter_mut().enumerate(),
DrainMapper::new(&mut self.meta),
)
}
fn occupied_key_at(&self, index: usize) -> TKey {
match &self.entries.as_ref()[index] {
Entry::Occupied { key_data, .. } => {
TKey::new_occupied(&self.meta.key_context, index, key_data)
}
_ => unreachable!(),
}
}
fn vacant_key_at(&self, index: usize) -> TKey {
match self.entries.as_ref().get(index) {
Some(Entry::Vacant { key_data, .. }) => {
TKey::new_vacant(&self.meta.key_context, index, Some(key_data))
}
None => TKey::new_vacant(&self.meta.key_context, index, None),
_ => unimplemented!(),
}
}
fn get_at(&self, key: &TKey) -> Option<&T> {
let index = key.index(&self.meta.key_context);
match self.entries.as_ref().get(index) {
Some(Entry::Occupied {
value, key_data, ..
}) if key.verify(&self.meta.key_context, key_data) => Some(value),
_ => None,
}
}
fn get_mut_at(&mut self, key: &TKey) -> Option<&mut T> {
let index = key.index(&self.meta.key_context);
match self.entries.as_mut().get_mut(index) {
Some(Entry::Occupied {
value, key_data, ..
}) if key.verify(&self.meta.key_context, key_data) => Some(value),
_ => None,
}
}
fn insert_at(&mut self, index: usize, value: T) {
self.meta.len += 1;
#[cfg(feature = "range")]
let range = self.insert_occupied_index(index);
if index == self.entries.as_ref().len() {
let entry = Entry::Occupied {
value,
key_data: Default::default(),
#[cfg(feature = "range")]
range,
};
self.entries.push(entry);
self.meta.first_vacant = index + 1;
} else {
let entry = &mut self.entries.as_mut()[index];
match replace(entry, Entry::Unknown) {
Entry::Vacant { next, key_data } => {
let key_data = TKey::convert_into_occupied(&self.meta.key_context, key_data);
*entry = Entry::Occupied {
value,
key_data,
#[cfg(feature = "range")]
range,
};
self.meta.first_vacant = next;
}
_ => unreachable!(),
}
}
}
fn remove_at(&mut self, index: usize) -> T {
let entry = &mut self.entries.as_mut()[index];
match replace(entry, Entry::Unknown) {
Entry::Occupied {
value,
key_data,
#[cfg(feature = "range")]
range,
} => {
*entry = Entry::Vacant {
next: self.meta.first_vacant,
key_data: TKey::convert_into_vacant(&self.meta.key_context, key_data),
};
#[cfg(feature = "range")]
self.remove_occupied_index(index, range);
self.meta.len -= 1;
self.meta.first_vacant = index;
value
}
_ => unreachable!(),
}
}
pub(crate) fn recreate_vacant_list(&mut self) {
self.meta.first_vacant = self.entries.as_ref().len();
let mut remaining_vacant = self.entries.as_ref().len() - self.meta.len;
if remaining_vacant == 0 {
return;
}
for (index, entry) in self.entries.as_mut().iter_mut().enumerate().rev() {
if let Entry::Vacant { next, .. } = entry {
*next = self.meta.first_vacant;
self.meta.first_vacant = index;
remaining_vacant -= 1;
if remaining_vacant == 0 {
break;
}
}
}
}
#[cfg(feature = "range")]
pub(crate) fn insert_occupied_index(&mut self, index: usize) -> RangeIndices {
let mut prev = index;
let mut next = index;
if self.meta.last_occupied != crate::INVALID_INDEX {
prev = self.meta.last_occupied;
match &mut self.entries.as_mut()[prev] {
Entry::Occupied { range, .. } => {
next = range.next;
range.next = index;
}
_ => unreachable!(),
}
match &mut self.entries.as_mut()[next] {
Entry::Occupied { range, .. } => {
range.prev = index;
}
_ => unreachable!(),
}
}
self.meta.last_occupied = index;
if self.meta.first_occupied == crate::INVALID_INDEX {
self.meta.first_occupied = index;
}
RangeIndices { prev, next }
}
#[cfg(feature = "range")]
pub(crate) fn remove_occupied_index(&mut self, index: usize, range: RangeIndices) {
let RangeIndices { prev, next } = range;
if prev != index {
match &mut self.entries.as_mut()[prev] {
Entry::Occupied { range, .. } => range.next = next,
_ => unreachable!(),
}
}
if next != index {
match &mut self.entries.as_mut()[next] {
Entry::Occupied { range, .. } => range.prev = prev,
_ => unreachable!(),
}
}
if self.meta.first_occupied == index {
self.meta.first_occupied = if next == index {
crate::INVALID_INDEX
} else {
next
};
}
if self.meta.last_occupied == index {
self.meta.last_occupied = if prev == index {
crate::INVALID_INDEX
} else {
prev
};
}
}
#[cfg(feature = "range")]
fn move_occupied_index(&mut self, old_index: usize, new_index: usize, range: RangeIndices) {
if range.prev != old_index {
match &mut self.entries.as_mut()[range.prev] {
Entry::Occupied { range, .. } => {
range.next = new_index;
}
_ => unimplemented!(),
}
}
if range.next != old_index {
match &mut self.entries.as_mut()[range.next] {
Entry::Occupied { range, .. } => {
range.prev = new_index;
}
_ => unimplemented!(),
}
}
if self.meta.first_occupied == old_index {
self.meta.first_occupied = new_index;
}
if self.meta.last_occupied == old_index {
self.meta.last_occupied = new_index;
}
}
#[cfg(feature = "range")]
fn index_range<R>(&self, range: R) -> (Bound<usize>, Bound<usize>)
where
R: RangeBounds<TKey>,
{
let front = match range.start_bound() {
Bound::Included(key) if self.get_at(key).is_some() => {
Bound::Included(key.index(&self.meta.key_context))
}
Bound::Excluded(key) if self.get_at(key).is_some() => {
Bound::Excluded(key.index(&self.meta.key_context))
}
_ => Bound::Included(self.meta.first_occupied),
};
let back = match range.end_bound() {
Bound::Included(key) if self.get_at(key).is_some() => {
Bound::Included(key.index(&self.meta.key_context))
}
Bound::Excluded(key) if self.get_at(key).is_some() => {
Bound::Excluded(key.index(&self.meta.key_context))
}
_ => Bound::Included(self.meta.last_occupied),
};
(front, back)
}
}
impl<T, TKey, TEntries> GenericSlab<T, TKey, TEntries>
where
TKey: Key<T>,
TEntries: DynamicEntries<T, TKey>,
{
#[must_use]
pub fn with_capacity(capacity: usize) -> Self {
Self::from_entries(TEntries::with_capacity(capacity))
}
pub fn reserve(&mut self, additional: usize) {
if self.capacity() - self.meta.len >= additional {
return;
}
let need_add = additional - (self.entries.as_ref().len() - self.meta.len);
self.entries.reserve(need_add);
}
pub fn reserve_exact(&mut self, additional: usize) {
if self.capacity() - self.meta.len >= additional {
return;
}
let need_add = additional - (self.entries.as_ref().len() - self.meta.len);
self.entries.reserve_exact(need_add);
}
}
impl<T, TKey, TEntries> Default for GenericSlab<T, TKey, TEntries>
where
TKey: Key<T>,
TEntries: Entries<T, TKey> + Default,
{
fn default() -> Self {
Self::new()
}
}
impl<T, TKey, TEntries> Debug for GenericSlab<T, TKey, TEntries>
where
T: Debug,
TKey: Key<T> + Debug,
TEntries: Entries<T, TKey>,
{
fn fmt(&self, fmt: &mut Formatter<'_>) -> FmtResult {
if fmt.alternate() {
fmt.debug_map().entries(self.iter()).finish()
} else {
fmt.debug_struct("GenericSlab")
.field("len", &self.meta.len)
.field("cap", &self.capacity())
.finish()
}
}
}
impl<T, TKey, TEntries> Clone for GenericSlab<T, TKey, TEntries>
where
TKey: Key<T>,
TEntries: Clone,
Meta<T, TKey>: Clone,
{
fn clone(&self) -> Self {
Self {
meta: self.meta.clone(),
entries: self.entries.clone(),
}
}
fn clone_from(&mut self, source: &Self) {
self.meta.clone_from(&source.meta);
self.entries.clone_from(&source.entries);
}
}
impl<T, TKey, TEntries> Index<TKey> for GenericSlab<T, TKey, TEntries>
where
TKey: Key<T>,
TEntries: Entries<T, TKey>,
{
type Output = T;
#[cfg_attr(not(slab_no_track_caller), track_caller)]
fn index(&self, key: TKey) -> &T {
self.get(key).expect("invalid key")
}
}
impl<T, TKey, TEntries> IndexMut<TKey> for GenericSlab<T, TKey, TEntries>
where
TKey: Key<T>,
TEntries: Entries<T, TKey>,
{
#[cfg_attr(not(slab_no_track_caller), track_caller)]
fn index_mut(&mut self, key: TKey) -> &mut T {
self.get_mut(key).expect("invalid key")
}
}
impl<T, TKey, TEntries> IntoIterator for GenericSlab<T, TKey, TEntries>
where
TKey: Key<T>,
TEntries: IntoIterator<Item = Entry<T, TKey>>,
{
type Item = (TKey, T);
type IntoIter = IntoIter<T, TKey, TEntries>;
fn into_iter(self) -> Self::IntoIter {
GenericIter::new(
self.meta.len,
self.entries.into_iter().enumerate(),
KeyValueMapper::new(self.meta),
)
}
}
impl<'a, T, TKey, TEntries> IntoIterator for &'a GenericSlab<T, TKey, TEntries>
where
TKey: Key<T>,
TEntries: Entries<T, TKey>,
{
type Item = (TKey, &'a T);
type IntoIter = Iter<'a, T, TKey>;
fn into_iter(self) -> Self::IntoIter {
self.iter()
}
}
impl<'a, T, TKey, TEntries> IntoIterator for &'a mut GenericSlab<T, TKey, TEntries>
where
TKey: Key<T>,
TEntries: Entries<T, TKey>,
{
type Item = (TKey, &'a mut T);
type IntoIter = IterMut<'a, T, TKey>;
fn into_iter(self) -> Self::IntoIter {
self.iter_mut()
}
}
impl<T, TKey, TEntries> FromIterator<T> for GenericSlab<T, TKey, TEntries>
where
TKey: Key<T>,
TEntries: Entries<T, TKey> + Default,
{
fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
let mut slab = Self::default();
for value in iter {
slab.insert(value);
}
slab
}
}
impl<T, TKey, TEntries> FromIterator<(TKey, T)> for GenericSlab<T, TKey, TEntries>
where
TKey: Key<T>,
TEntries: Entries<T, TKey> + Default,
{
fn from_iter<I: IntoIterator<Item = (TKey, T)>>(iter: I) -> Self {
let mut builder = Builder::new();
for (key, value) in iter {
builder.pair(key, value);
}
builder.build()
}
}
impl<T, TKey> Clone for Meta<T, TKey>
where
TKey: Key<T>,
TKey::Context: Clone,
{
fn clone(&self) -> Self {
Self {
len: self.len,
key_context: self.key_context.clone(),
first_vacant: self.first_vacant,
#[cfg(feature = "range")]
first_occupied: self.first_occupied,
#[cfg(feature = "range")]
last_occupied: self.last_occupied,
}
}
}
impl<'a, T, TKey, TEntries> GenericVacantEntry<'a, T, TKey, TEntries>
where
TKey: Key<T>,
TEntries: Entries<T, TKey>,
{
#[must_use]
pub fn key(&self) -> TKey {
self.slab.vacant_key_at(self.index)
}
pub fn insert(self, value: T) -> &'a mut T {
self.slab.insert_at(self.index, value);
match self.slab.entries.as_mut().get_mut(self.index) {
Some(Entry::Occupied { value, .. }) => value,
_ => unreachable!(),
}
}
}
impl<T, TKey, TEntries> Debug for GenericVacantEntry<'_, T, TKey, TEntries>
where
TKey: Key<T>,
{
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
f.debug_struct("GenericVacantEntry")
.field("index", &self.index)
.finish()
}
}