pub struct Interned<'a, T>(pub &'a T, pub PrivateZst);Expand description
This type is a reference with one special behaviour: the reference pointer (i.e. the address of the value referred to) is used for equality and hashing, rather than the value’s contents, as would occur with a vanilla reference. There are two cases when this is useful.
-
Types where uniqueness is guaranteed. This is most commonly achieved via interning – hence the name
Interned– though it may also be possible via other means. In this case, the use ofInternedis primarily a performance optimization, because pointer equality/hashing gives the same results as value equality/hashing, but is faster. (The use of theInternedtype also provides documentation about the interned-ness.)Note that in this case it is possible to have a
Tand aInterned<T>that are (or refer to) equal but different values. But if you have two differentInterned<T>s, they both refer to the same value, at a single location in memory. -
Types with identity, where distinct values should always be considered unequal, even if they have equal values. These are rare in Rust, but do occur sometimes. In this case, the use of
Internedgives different behaviour, because pointer equality/hashing gives different result to value equality/hashing, and is also faster.
The PrivateZst field means you can pattern match with Interned(v, _) but you can only
construct a Interned with new_unchecked, and not directly. This means that all creation
points can be audited easily.
Tuple Fields§
§0: &'a T§1: PrivateZstImplementations§
Source§impl<'a, T> Interned<'a, T>
impl<'a, T> Interned<'a, T>
Sourcepub const fn new_unchecked(t: &'a T) -> Self
pub const fn new_unchecked(t: &'a T) -> Self
Create a new Interned value. The value referred to must satisfy one of the following
two conditions.
- It must be unique and it must remain unique in the future.
- It must be of a type with “identity” such that distinct values should always be considered unequal.
This function has _unchecked in the name but is not unsafe, because if neither of these
conditions is met it will cause incorrect behaviour but will not affect memory safety.
Trait Implementations§
impl<'a, T> Copy for Interned<'a, T>
impl<'a, T: DynSync> DynSync for Interned<'a, T>
impl<'a, T> Eq for Interned<'a, T>
Source§impl<T> StableHash for Interned<'_, T>where
T: StableHash,
impl<T> StableHash for Interned<'_, T>where
T: StableHash,
fn stable_hash<Hcx: StableHashCtxt>( &self, hcx: &mut Hcx, hasher: &mut StableHasher, )
Auto Trait Implementations§
impl<'a, T> DynSend for Interned<'a, T>where
T: DynSync,
impl<'a, T> Freeze for Interned<'a, T>
impl<'a, T> RefUnwindSafe for Interned<'a, T>where
T: RefUnwindSafe,
impl<'a, T> Send for Interned<'a, T>where
T: Sync,
impl<'a, T> Sync for Interned<'a, T>where
T: Sync,
impl<'a, T> Unpin for Interned<'a, T>
impl<'a, T> UnsafeUnpin for Interned<'a, T>
impl<'a, T> UnwindSafe for Interned<'a, T>where
T: RefUnwindSafe,
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
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> Pointable for T
impl<T> Pointable for T
Source§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
Source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
Source§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...) attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 8 bytes