Struct PoolRef

Source
pub struct PoolRef<A> { /* private fields */ }
Expand description

A reference counted pointer to a pool allocated value of A.

Implementations§

Source§

impl<A> PoolRef<A>

Source

pub fn default(pool: &Pool<A>) -> Self
where A: PoolDefault,

Construct a PoolRef with a newly initialised value of A.

This uses PoolDefault::default_uninit() to initialise a default value, which may be faster than constructing a PoolRef from an existing value using PoolRef::new(), depending on the data type.

§Examples
let pool: Pool<usize> = Pool::new(256);
let zero = PoolRef::default(&pool);
assert_eq!(0, *zero);
Source

pub fn new(pool: &Pool<A>, value: A) -> Self

Wrap a value in a PoolRef.

This will copy the entire value into the memory handled by the PoolRef, which may be slower than using PoolRef::default(), so it’s not recommended to use this to construct the default value.

§Examples
let pool: Pool<usize> = Pool::new(256);
let number = PoolRef::new(&pool, 1337);
assert_eq!(1337, *number);
Source

pub fn clone_from(pool: &Pool<A>, value: &A) -> Self
where A: PoolClone,

Clone a value and return a new PoolRef to it.

This will use PoolClone::clone_uninit() to perform the clone, which may be more efficient than using PoolRef::new(value.clone()).

§Examples
let pool: Pool<Vec<usize>> = Pool::new(1);
let vec = vec![1, 2, 3];
let ref1 = PoolRef::clone_from(&pool, &vec);
assert_eq!(vec, *ref1);
Source

pub fn pin_default(pool: &Pool<A>) -> Pin<Self>
where A: PoolDefault,

Construct a Pinned PoolRef with a default value.

§Examples
let pool: Pool<usize> = Pool::new(256);
let zero = PoolRef::pin_default(&pool);
assert_eq!(0, *zero);
Source

pub fn pin(pool: &Pool<A>, value: A) -> Pin<Self>

Construct a Pinned PoolRef with the given value.

§Examples
let pool: Pool<usize> = Pool::new(256);
let number = PoolRef::pin(&pool, 1337);
assert_eq!(1337, *number);
Source

pub fn cloned(pool: &Pool<A>, this: &Self) -> Self
where A: PoolClone,

Clone the value inside a PoolRef and return a new PoolRef to it.

This will use PoolClone::clone_uninit() to perform the clone, which may be more efficient than using PoolRef::new((*this_ref).clone()).

§Examples
let pool: Pool<usize> = Pool::new(256);
let mut number = PoolRef::new(&pool, 1337);
let other_number = PoolRef::cloned(&pool, &number);
*PoolRef::make_mut(&pool, &mut number) = 123;
assert_eq!(123, *number);
assert_eq!(1337, *other_number);
Source

pub fn make_mut<'a>(pool: &Pool<A>, this: &'a mut Self) -> &'a mut A
where A: PoolClone,

Get a mutable reference to the value inside a PoolRef, cloning it first if this PoolRef isn’t a unique reference.

§Examples
let pool: Pool<usize> = Pool::new(1);
let ref1 = PoolRef::new(&pool, 1);
let mut ref2 = ref1.clone();
*PoolRef::make_mut(&pool, &mut ref2) = 2;
assert_eq!(1, *ref1);
assert_eq!(2, *ref2);
Source

pub fn get_mut(this: &mut Self) -> Option<&mut A>

Attempt to get a mutable reference to the value inside a PoolRef.

This will produce a None if this PoolRef isn’t a unique reference to the value.

§Examples
let pool: Pool<usize> = Pool::new(128);
let mut number = PoolRef::new(&pool, 1337);
assert_eq!(1337, *number);
if let Some(number_ref) = PoolRef::get_mut(&mut number) {
    *number_ref = 123;
} else {
    panic!("Couldn't get a unique reference!");
}
assert_eq!(123, *number);
Source

pub fn try_unwrap(this: Self) -> Result<A, Self>

Attempt to unwrap the value inside a PoolRef.

If this PoolRef isn’t the only reference to the value, ownership of the PoolRef is passed back to you in the Err value.

Please note that the unwrapped value is not reclaimed by the pool when dropped.

§Examples
let pool: Pool<usize> = Pool::new(1);
let ref1 = PoolRef::default(&pool);
let ref2 = ref1.clone();
let unwrap_result = PoolRef::try_unwrap(ref1);
assert!(unwrap_result.is_err());
let pool: Pool<usize> = Pool::new(1);
let ref1 = PoolRef::new(&pool, 1337);
if let Ok(number) = PoolRef::try_unwrap(ref1) {
    assert_eq!(1337, number);
} else {
    panic!("couldn't unwrap the number after all!");
}
Source

pub fn unwrap_or_clone(this: Self) -> A
where A: PoolClone,

Unwrap the value inside a PoolRef, cloning if necessary.

If this PoolRef is a unique reference to the value, the value is unwrapped and returned, consuming the PoolRef. Otherwise, the value is cloned and the clone is returned.

Please note that the unwrapped value is not reclaimed by the pool when dropped.

§Examples
let pool: Pool<usize> = Pool::new(1);
let number = PoolRef::new(&pool, 1337);
let other_ref = number.clone();
assert_eq!(1337, PoolRef::unwrap_or_clone(other_ref));
Source

pub fn ptr_eq(left: &Self, right: &Self) -> bool

Test two PoolRefs for pointer equality.

§Examples
let pool: Pool<usize> = Pool::new(1);
let ref1 = PoolRef::default(&pool);
let ref2 = ref1.clone();
assert!(PoolRef::ptr_eq(&ref1, &ref2));
Source

pub fn strong_count(this: &Self) -> usize

Get the current number of LocalRef references to the wrapped value.

§Examples
let pool: Pool<usize> = Pool::new(1);
let ref1 = PoolRef::default(&pool);
let ref2 = ref1.clone();
let ref3 = ref2.clone();
assert_eq!(3, PoolRef::strong_count(&ref1));
Source

pub fn into_raw(b: PoolRef<A>) -> *const A

Consume the PoolRef and return a pointer to the contents.

The pointer is guaranteed to be non-null.

Please note that the only proper way to drop the value pointed to is by using PoolRef::from_raw to turn it back into a PoolRef, because the value is followed by PoolRef metadata which also needs to be dropped.

Source

pub unsafe fn from_raw(ptr: *const A) -> Self

Turn a raw pointer back into a PoolRef.

The pointer must be non-null and obtained from a previous call to PoolRef::into_raw or PoolRef::into_raw_non_null.

§Safety

This must only be called on pointers obtained through PoolRef::into_raw. It’s not OK to call it on a pointer to a value of A you’ve allocated yourself.

§Examples
let pool: Pool<usize> = Pool::new(1);
let ref1 = PoolRef::new(&pool, 31337);

// Turn the PoolRef into a raw pointer and see if it still works.
let ptr = PoolRef::into_raw(ref1);
assert_eq!(31337, unsafe { *ptr });

// Turn it back into a PoolRef and see, again, if it still works.
let ref2 = unsafe { PoolRef::from_raw(ptr) };
assert_eq!(31337, *ref2);

Trait Implementations§

Source§

impl<A> AsRef<A> for PoolRef<A>

Source§

fn as_ref(&self) -> &A

Converts this type into a shared reference of the (usually inferred) input type.
Source§

impl<A> Borrow<A> for PoolRef<A>

Source§

fn borrow(&self) -> &A

Immutably borrows from an owned value. Read more
Source§

impl<A> Clone for PoolRef<A>

Source§

fn clone(&self) -> Self

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<A> Debug for PoolRef<A>
where A: Debug,

Source§

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

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

impl<A> Deref for PoolRef<A>

Source§

type Target = A

The resulting type after dereferencing.
Source§

fn deref(&self) -> &Self::Target

Dereferences the value.
Source§

impl<A> Display for PoolRef<A>
where A: Display,

Source§

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

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

impl<A> Drop for PoolRef<A>

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

impl<A> Hash for PoolRef<A>
where A: Hash,

Source§

fn hash<H: Hasher>(&self, hasher: &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<A> Ord for PoolRef<A>
where A: Ord,

Source§

fn cmp(&self, other: &Self) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl<A> PartialEq for PoolRef<A>
where A: PartialEq,

Source§

fn eq(&self, other: &Self) -> 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<A> PartialOrd for PoolRef<A>
where A: PartialOrd,

Source§

fn partial_cmp(&self, other: &Self) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

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

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

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

Tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · Source§

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

Tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · Source§

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

Tests greater than or equal to (for self and other) and is used by the >= operator. Read more
Source§

impl<A> Pointer for PoolRef<A>

Source§

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

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

impl<A> Eq for PoolRef<A>
where A: Eq,

Auto Trait Implementations§

§

impl<A> Freeze for PoolRef<A>

§

impl<A> RefUnwindSafe for PoolRef<A>
where A: RefUnwindSafe,

§

impl<A> !Send for PoolRef<A>

§

impl<A> !Sync for PoolRef<A>

§

impl<A> Unpin for PoolRef<A>

§

impl<A> UnwindSafe for PoolRef<A>
where A: RefUnwindSafe,

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<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<P, T> Receiver for P
where P: Deref<Target = T> + ?Sized, T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
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> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. 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.