Skip to main content

WidthCache

Struct WidthCache 

Source
pub struct WidthCache { /* private fields */ }
Expand description

LRU cache for text width measurements.

This cache stores the computed display width (in terminal cells) for text strings, using an LRU eviction policy when capacity is reached.

§Performance

  • Uses FxHash for fast hashing
  • O(1) lookup and insertion
  • Automatic LRU eviction
  • Keys are stored as 64-bit hashes (not full strings) to minimize memory

§Hash Collisions

The cache uses a 64-bit hash as the lookup key rather than storing the full string. This trades theoretical correctness for memory efficiency. With FxHash, collision probability is ~1 in 2^64, making this safe for practical use. If you require guaranteed correctness, use contains() to verify presence before trusting cached values.

§Thread Safety

WidthCache is not thread-safe. For concurrent use, wrap in a mutex or use thread-local caches.

Implementations§

Source§

impl WidthCache

Source

pub fn new(capacity: usize) -> Self

Create a new cache with the specified capacity.

If capacity is zero, defaults to 1.

Source

pub fn with_default_capacity() -> Self

Create a new cache with the default capacity (4096 entries).

Source

pub fn get_or_compute(&mut self, text: &str) -> usize

Get cached width or compute and cache it.

If the text is in the cache, returns the cached width. Otherwise, computes the width using display_width and caches it.

Source

pub fn get_or_compute_with<F>(&mut self, text: &str, compute: F) -> usize
where F: FnOnce(&str) -> usize,

Get cached width or compute using a custom function.

This allows using custom width calculation functions for testing or specialized terminal behavior.

Source

pub fn contains(&self, text: &str) -> bool

Check if a text string is in the cache.

Source

pub fn get(&mut self, text: &str) -> Option<usize>

Get the cached width for a text string without computing.

Returns None if the text is not in the cache. Note: This does update the LRU order.

Source

pub fn peek(&self, text: &str) -> Option<usize>

Peek at the cached width without updating LRU order.

Source

pub fn preload(&mut self, text: &str)

Pre-populate the cache with a text string.

This is useful for warming up the cache with known strings.

Source

pub fn preload_many<'a>(&mut self, texts: impl IntoIterator<Item = &'a str>)

Pre-populate the cache with multiple strings.

Source

pub fn clear(&mut self)

Clear the cache.

Source

pub fn reset_stats(&mut self)

Reset statistics.

Source

pub fn stats(&self) -> CacheStats

Get cache statistics.

Source

pub fn len(&self) -> usize

Get the current number of cached entries.

Source

pub fn is_empty(&self) -> bool

Check if the cache is empty.

Source

pub fn capacity(&self) -> usize

Get the cache capacity.

Source

pub fn resize(&mut self, new_capacity: usize)

Resize the cache capacity.

If the new capacity is smaller than the current size, entries will be evicted (LRU order).

Trait Implementations§

Source§

impl Debug for WidthCache

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for WidthCache

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more