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
impl Discriminant
Sourcepub const fn new(id: LocationId) -> Option<Discriminant>
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
Sourcepub const fn new_p1<T>(id: LocationId) -> Option<Discriminant>
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.
Sourcepub const fn new_p1_size<T, const SIZE: usize>(
id: LocationId,
) -> Option<Discriminant>
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.
Sourcepub const fn new_p2<T, U>(id: LocationId) -> Option<Discriminant>
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
Sourcepub const fn new_p2_size<T, U, const SIZE: usize>(
id: LocationId,
) -> Option<Discriminant>
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
impl Clone for Discriminant
Source§fn clone(&self) -> Discriminant
fn clone(&self) -> Discriminant
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for Discriminant
impl Debug for Discriminant
Source§impl Hash for Discriminant
impl Hash for Discriminant
Source§impl PartialEq for Discriminant
impl PartialEq for Discriminant
impl Copy for Discriminant
impl Eq for Discriminant
impl StructuralPartialEq for Discriminant
Auto Trait Implementations§
impl Freeze for Discriminant
impl RefUnwindSafe for Discriminant
impl Send for Discriminant
impl Sync for Discriminant
impl Unpin for Discriminant
impl UnwindSafe for Discriminant
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§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.