#[repr(transparent)]pub struct Compact<T>where
T: From<Compact<T>>,
Compact<T>: From<T>,{ /* private fields */ }Expand description
Compact representation of T. Only one-pointer wide.
It behaves like T for Drop, Clone, Hash, Eq, Ord, …
Implementations§
source§impl<T> Compact<T>where
T: From<Compact<T>>,
Compact<T>: From<T>,
impl<T> Compact<T>where T: From<Compact<T>>, Compact<T>: From<T>,
sourcepub fn as_raw_data(&self) -> *const u8
pub fn as_raw_data(&self) -> *const u8
Returns the underlying raw data.
sourcepub fn map_ref<U>(&self, f: impl FnOnce(&T) -> U) -> U
pub fn map_ref<U>(&self, f: impl FnOnce(&T) -> U) -> U
Maps a &T to U by applying a function to a temporarily created
T value.
Since the value is temporary, you cannot take references to it out from this function.
Examples
use enum_ptr::{Compact, EnumPtr};
#[derive(EnumPtr, Debug)]
#[repr(C, usize)]
enum Foo {
A(Box<i32>),
B(Box<u32>),
}
let mut foo: Compact<_> = Foo::A(Box::new(1)).into();
let result = foo.map_ref(|f| match f {
Foo::A(r) => **r,
_ => unreachable!(),
});
assert_eq!(result, 1);sourcepub unsafe fn map_mut<U>(&mut self, f: impl FnOnce(&mut T) -> U) -> U
pub unsafe fn map_mut<U>(&mut self, f: impl FnOnce(&mut T) -> U) -> U
Maps a &mut T to U by applying a function to a temporarily created
T value.
Since the value is temporary, you cannot take references to it out from this function.
Safety
See issue #3.
Examples
use enum_ptr::{Compact, EnumPtr};
#[derive(EnumPtr, Debug, PartialEq, Eq)]
#[repr(C, usize)]
enum Foo {
A(Box<i32>),
B(Box<u32>),
}
let mut foo: Compact<_> = Foo::A(Box::new(1)).into();
unsafe {
foo.map_mut(|f| match f {
Foo::A(r) => **r = 2,
_ => unreachable!(),
});
}
assert_eq!(foo.extract(), Foo::A(Box::new(2)));source§impl<T> Compact<T>where
T: From<Compact<T>> + CompactBorrow,
Compact<T>: From<T>,
impl<T> Compact<T>where T: From<Compact<T>> + CompactBorrow, Compact<T>: From<T>,
sourcepub fn borrow(&self) -> <T as CompactBorrow>::Target<'_>
pub fn borrow(&self) -> <T as CompactBorrow>::Target<'_>
Returns a reference type that acts like &T.
Check EnumPtr for more details.
Examples
use enum_ptr::{Compact, EnumPtr};
#[derive(EnumPtr, Debug)]
#[enum_ptr(borrow)] // required
#[repr(C, usize)]
enum Foo { // enum FooRef<'enum_ptr> {
A(Box<i32>), // A(&'enum_ptr i32),
B(Option<Box<u32>>), // B(Option<&'enum_ptr u32>),
} // }
let foo: Compact<_> = Foo::A(Box::new(1)).into();
match foo.borrow() {
FooRef::A(inner) => assert_eq!(inner, &1),
_ => unreachable!(),
}source§impl<T> Compact<T>where
T: From<Compact<T>> + CompactBorrowMut,
Compact<T>: From<T>,
impl<T> Compact<T>where T: From<Compact<T>> + CompactBorrowMut, Compact<T>: From<T>,
sourcepub fn borrow_mut(&mut self) -> <T as CompactBorrowMut>::Target<'_>
pub fn borrow_mut(&mut self) -> <T as CompactBorrowMut>::Target<'_>
Returns a reference type that acts like &mut T.
Check EnumPtr for more details.
Examples
use enum_ptr::{Compact, EnumPtr};
#[derive(EnumPtr, Debug)]
#[enum_ptr(borrow_mut)] // required
#[repr(C, usize)]
enum Foo { // enum FooRefMut<'enum_ptr> {
A(Box<i32>), // A(&'enum_ptr mut i32),
B(Option<Box<u32>>), // B(Option<&'enum_ptr mut u32>),
} // }
let mut foo: Compact<_> = Foo::A(Box::new(1)).into();
match foo.borrow_mut() {
FooRefMut::A(inner) => assert_eq!(inner, &mut 1),
_ => unreachable!(),
}Trait Implementations§
source§impl<T> From<Compact<T>> for CompactCopy<T>where
T: From<Compact<T>> + From<CompactCopy<T>> + Copy,
Compact<T>: From<T>,
CompactCopy<T>: From<T>,
impl<T> From<Compact<T>> for CompactCopy<T>where T: From<Compact<T>> + From<CompactCopy<T>> + Copy, Compact<T>: From<T>, CompactCopy<T>: From<T>,
source§impl<T> From<CompactCopy<T>> for Compact<T>where
T: From<Compact<T>> + From<CompactCopy<T>> + Copy,
Compact<T>: From<T>,
CompactCopy<T>: From<T>,
impl<T> From<CompactCopy<T>> for Compact<T>where T: From<Compact<T>> + From<CompactCopy<T>> + Copy, Compact<T>: From<T>, CompactCopy<T>: From<T>,
source§fn from(value: CompactCopy<T>) -> Self
fn from(value: CompactCopy<T>) -> Self
Converts to this type from the input type.
source§impl<T> Ord for Compact<T>where
T: From<Compact<T>> + Ord,
Compact<T>: From<T>,
impl<T> Ord for Compact<T>where T: From<Compact<T>> + Ord, Compact<T>: From<T>,
source§impl<T> PartialEq<Compact<T>> for Compact<T>where
T: From<Compact<T>> + PartialEq,
Compact<T>: From<T>,
impl<T> PartialEq<Compact<T>> for Compact<T>where T: From<Compact<T>> + PartialEq, Compact<T>: From<T>,
source§impl<T> PartialOrd<Compact<T>> for Compact<T>where
T: From<Compact<T>> + PartialOrd,
Compact<T>: From<T>,
impl<T> PartialOrd<Compact<T>> for Compact<T>where T: From<Compact<T>> + PartialOrd, Compact<T>: From<T>,
1.0.0 · source§fn le(&self, other: &Rhs) -> bool
fn le(&self, other: &Rhs) -> bool
This method tests less than or equal to (for
self and other) and is used by the <=
operator. Read moreimpl<T> Eq for Compact<T>where T: From<Compact<T>> + Eq, Compact<T>: From<T>,
impl<T> Send for Compact<T>where T: From<Compact<T>> + Send, Compact<T>: From<T>,
impl<T> Sync for Compact<T>where T: From<Compact<T>> + Sync, Compact<T>: From<T>,
Auto Trait Implementations§
impl<T> RefUnwindSafe for Compact<T>where T: RefUnwindSafe,
impl<T> Unpin for Compact<T>where T: Unpin,
impl<T> UnwindSafe for Compact<T>where T: UnwindSafe,
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
Mutably borrows from an owned value. Read more