Discriminant

Struct Discriminant 

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

Type describing the layout, alignment, and type of a container

Discriminant is central to the safety and performance of local pooling. It describes 2 things in just 8 bytes.

  • The unique location in the source code of the implementation of IsoPoolable. This is accomplished by a proc macro that generates a global table of unique location ids for cross crate source code locations. This unique id ensures that different container types can’t be mixed in the same pool.

  • The layout and alignment of all the type parameters of the container, up to 2 are supported. If your container has more that two type parameters then you can’t locally pool it, and you can’t implement IsoPoolable. If you do, you may caused UB.

In order to squeeze all this information into just 8 bytes there are some limitations.

  • You can’t have more than 0xFFFF implementations of IsoPoolable in the same project. This includes all the crates depended on by the project.

  • Your type parameters must have size <= 0x0FFF bytes and alignment <= 0xF.

  • const SIZE parameters must be < 0xFFFF.

If any of these constraints are violated the Discriminant constructors will return None. If you desire you may panic at that point to cause a compile error. If you do not panic and instead leave DISCRIMINANT as None then local pool operations on that type will work just fine, but nothing will be pooled. Objects will be freed when they are dropped and take will allocate new objects each time it is called.

Implementations§

Source§

impl Discriminant

Source

pub const fn new(id: LocationId) -> Option<Discriminant>

build a discriminant for a type with no type variables (just a location id). Always returns Some

Source

pub const fn new_p1<T>(id: LocationId) -> Option<Discriminant>

build a discriminant for a type with 1 type variable T. Return None if T is too large to fit.

Source

pub const fn new_p1_size<T, const SIZE: usize>( id: LocationId, ) -> Option<Discriminant>

build a discriminant for a type with 1 type variable T and a const SIZE. Return None if T or SIZE are too large to fit.

Source

pub const fn new_p2<T, U>(id: LocationId) -> Option<Discriminant>

build a discriminant for a type with two type variables T and U. Return None if either T or U are too large to fit

Source

pub const fn new_p2_size<T, U, const SIZE: usize>( id: LocationId, ) -> Option<Discriminant>

build a discriminant for a type with two type variables T and U and a const SIZE. Return None if any of the parameters are too large to fit.

Trait Implementations§

Source§

impl Clone for Discriminant

Source§

fn clone(&self) -> Discriminant

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Discriminant

Source§

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

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

impl Hash for Discriminant

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Discriminant

Source§

fn eq(&self, other: &Discriminant) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Copy for Discriminant

Source§

impl Eq for Discriminant

Source§

impl StructuralPartialEq for Discriminant

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
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.