pub struct MediumSizeHashTable<Key, Value, Hash: FastHash> { /* private fields */ }
Implementations§
Source§impl<Key, Value, Hash: FastHash + Default> MediumSizeHashTable<Key, Value, Hash>
impl<Key, Value, Hash: FastHash + Default> MediumSizeHashTable<Key, Value, Hash>
Sourcepub fn new() -> Self
pub fn new() -> Self
Creates a new hash table with capacity for MAX_ELEMENTS items.
§Implementation Details
- Initializes empty table with default hash cells
- Creates tabulation hasher for index computation
- Sets initial timestamp to 0
Sourcepub fn get_mut(&mut self, key: Key) -> &mut Value
pub fn get_mut(&mut self, key: Key) -> &mut Value
Gets or creates a mutable reference to a hash cell for the given key.
§Algorithm
- Computes initial position using tabulation hash
- Uses linear probing to handle collisions
- Updates timestamp and key on access
§Arguments
key
- identifier
§Returns
Mutable reference to the hash cell
§Panics
Panics if Key
cannot be converted to u32
Sourcepub fn insert(&mut self, key: Key, value: Value)
pub fn insert(&mut self, key: Key, value: Value)
Inserts a value into the hash table at the specified key.
This is a convenience wrapper around get_mut()
that handles the assignment.
It uses linear probing for collision resolution and automatically handles
timestamp-based cell invalidation.
§Arguments
key
- The key to insert the value atvalue
- The value to insert
§Examples
Basic insertion:
use toolbox_rs::medium_size_hash_table::MediumSizeHashTable;
use toolbox_rs::tabulation_hash::TabulationHash;
let mut table = MediumSizeHashTable::<u32, u32, TabulationHash>::new();
table.insert(1, 42);
assert_eq!(table.peek_value(1), Some(&42));
Updating existing values:
use toolbox_rs::medium_size_hash_table::MediumSizeHashTable;
use toolbox_rs::tabulation_hash::TabulationHash;
let mut table = MediumSizeHashTable::<u32, u32, TabulationHash>::new();
table.insert(1, 42);
table.insert(1, 43); // Updates the existing value
assert_eq!(table.peek_value(1), Some(&43));
Multiple insertions:
use toolbox_rs::medium_size_hash_table::MediumSizeHashTable;
use toolbox_rs::tabulation_hash::TabulationHash;
let mut table = MediumSizeHashTable::<u32, u32, TabulationHash>::new();
table.insert(1, 10);
table.insert(2, 20);
table.insert(3, 30);
assert_eq!(table.peek_value(1), Some(&10));
assert_eq!(table.peek_value(2), Some(&20));
assert_eq!(table.peek_value(3), Some(&30));
§Panics
Panics if Key
cannot be converted to u32
Sourcepub fn peek_value(&self, key: Key) -> Option<&Value>
pub fn peek_value(&self, key: Key) -> Option<&Value>
Sourcepub fn contains_key(&self, key: Key) -> bool
pub fn contains_key(&self, key: Key) -> bool
Checks if a key exists in the hash table.
This method performs a read-only lookup that doesn’t modify the table’s state. It uses the same linear probing strategy as other operations but doesn’t update timestamps or modify any values.
§Arguments
key
- The key to check for existence
§Returns
true
if the key exists in the current timestampfalse
if the key doesn’t exist or was cleared
§Examples
Basic usage:
use toolbox_rs::medium_size_hash_table::MediumSizeHashTable;
use toolbox_rs::tabulation_hash::TabulationHash;
let mut table = MediumSizeHashTable::<u32, u32, TabulationHash>::new();
assert!(!table.contains_key(1), "Empty table should not contain any keys");
*table.get_mut(1) = 42;
assert!(table.contains_key(1), "Key should exist after insertion");
Behavior after clear:
use toolbox_rs::medium_size_hash_table::MediumSizeHashTable;
use toolbox_rs::tabulation_hash::TabulationHash;
let mut table = MediumSizeHashTable::<u32, u32, TabulationHash>::new();
*table.get_mut(1) = 42;
table.clear();
assert!(!table.contains_key(1), "Key should not exist after clear");
§Panics
Panics if Key
cannot be converted to u32
Sourcepub fn clear(&mut self)
pub fn clear(&mut self)
Clears the hash table by incrementing the timestamp.
If the timestamp would overflow, reallocates the table instead. This provides an efficient O(1) clear operation in most cases.
Sourcepub fn len(&self) -> usize
pub fn len(&self) -> usize
Returns the number of elements currently in the hash table.
This method returns the actual number of key-value pairs stored in the table, not the capacity. The count is maintained efficiently during insertions and clear operations.
§Examples
use toolbox_rs::medium_size_hash_table::MediumSizeHashTable;
use toolbox_rs::tabulation_hash::TabulationHash;
let mut table = MediumSizeHashTable::<u32, u32, TabulationHash>::new();
assert_eq!(table.len(), 0);
table.insert(1, 42);
assert_eq!(table.len(), 1);
// Update existing key doesn't change length
table.insert(1, 43);
assert_eq!(table.len(), 1);
table.insert(2, 100);
assert_eq!(table.len(), 2);
table.clear();
assert_eq!(table.len(), 0);
Sourcepub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Returns true if the hash table contains no elements.
§Examples
use toolbox_rs::medium_size_hash_table::MediumSizeHashTable;
use toolbox_rs::tabulation_hash::TabulationHash;
let mut table = MediumSizeHashTable::<u32, u32, TabulationHash>::new();
assert!(table.is_empty());
table.insert(1, 42);
assert!(!table.is_empty());
table.clear();
assert!(table.is_empty());
Sourcepub fn capacity(&self) -> usize
pub fn capacity(&self) -> usize
Returns the total capacity of the hash table.
The capacity is fixed at MAX_ELEMENTS (65536) and represents the maximum
number of elements that can be stored in the table. This is different from
len()
which returns the current number of elements.
§Examples
use toolbox_rs::medium_size_hash_table::MediumSizeHashTable;
use toolbox_rs::tabulation_hash::TabulationHash;
let table = MediumSizeHashTable::<u32, u32, TabulationHash>::new();
assert_eq!(table.capacity(), 65536);
assert!(table.capacity() >= table.len());
Trait Implementations§
Auto Trait Implementations§
impl<Key, Value, Hash> Freeze for MediumSizeHashTable<Key, Value, Hash>where
Hash: Freeze,
impl<Key, Value, Hash> RefUnwindSafe for MediumSizeHashTable<Key, Value, Hash>
impl<Key, Value, Hash> Send for MediumSizeHashTable<Key, Value, Hash>
impl<Key, Value, Hash> Sync for MediumSizeHashTable<Key, Value, Hash>
impl<Key, Value, Hash> Unpin for MediumSizeHashTable<Key, Value, Hash>
impl<Key, Value, Hash> UnwindSafe for MediumSizeHashTable<Key, Value, Hash>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self
, then passes self.as_ref()
into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self
, then passes self.as_mut()
into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow()
only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref()
only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.