generational_box

Struct GenerationalRef

Source
pub struct GenerationalRef<R> { /* private fields */ }
Expand description

A reference to a value in a generational box. This reference acts similarly to std::cell::Ref, but has extra debug information to track when all references to the value are created and dropped.

GenerationalRef implements Deref which means you can call methods on the inner value just like you would on a reference to the inner value. If you need to get the inner reference directly, you can call GenerationalRef::deref.

§Example

let owner = UnsyncStorage::owner();
let value = owner.insert(String::from("hello"));
let reference = value.read();

// You call methods like `as_str` on the reference just like you would with the inner String
assert_eq!(reference.as_str(), "hello");

§Matching on GenerationalRef

You need to get the inner reference with GenerationalRef::deref before you match the inner value. If you try to match without calling GenerationalRef::deref, you will get an error like this:

enum Colors {
    Red,
    Green
}
let owner = UnsyncStorage::owner();
let value = owner.insert(Colors::Red);
let reference = value.read();

match reference {
    // Since we are matching on the `GenerationalRef` type instead of &Colors, we can't match on the enum directly
    Colors::Red => {}
    Colors::Green => {}
}
error[E0308]: mismatched types
  --> packages/generational-box/tests/basic.rs:25:9
  |
2 |         Red,
  |         --- unit variant defined here
...
3 |     match reference {
  |           --------- this expression has type `GenerationalRef<Ref<'_, Colors>>`
4 |         // Since we are matching on the `GenerationalRef` type instead of &Colors, we can't match on the enum directly
5 |         Colors::Red => {}
  |         ^^^^^^^^^^^ expected `GenerationalRef<Ref<'_, Colors>>`, found `Colors`
  |
  = note: expected struct `GenerationalRef<Ref<'_, Colors>>`
               found enum `Colors`

Instead, you need to deref the reference to get the inner value before you match on it:

use std::ops::Deref;
enum Colors {
    Red,
    Green
}
let owner = UnsyncStorage::owner();
let value = owner.insert(Colors::Red);
let reference = value.read();

// Deref converts the `GenerationalRef` into a `&Colors`
match reference.deref() {
    // Now we can match on the inner value
    Colors::Red => {}
    Colors::Green => {}
}

Implementations§

Source§

impl<T: ?Sized + 'static, R: Deref<Target = T>> GenerationalRef<R>

Source

pub fn map<R2, F: FnOnce(R) -> R2>(self, f: F) -> GenerationalRef<R2>

Map the inner value to a new type

Source

pub fn try_map<R2, F: FnOnce(R) -> Option<R2>>( self, f: F, ) -> Option<GenerationalRef<R2>>

Try to map the inner value to a new type

Trait Implementations§

Source§

impl<T: ?Sized + Debug, R: Deref<Target = T>> Debug for GenerationalRef<R>

Source§

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

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

impl<T: ?Sized + 'static, R: Deref<Target = T>> Deref for GenerationalRef<R>

Source§

type Target = T

The resulting type after dereferencing.
Source§

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

Dereferences the value.
Source§

impl<T: ?Sized + Display, R: Deref<Target = T>> Display for GenerationalRef<R>

Source§

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

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<R> Freeze for GenerationalRef<R>
where R: Freeze,

§

impl<R> !RefUnwindSafe for GenerationalRef<R>

§

impl<R> Send for GenerationalRef<R>
where R: Send,

§

impl<R> Sync for GenerationalRef<R>
where R: Sync,

§

impl<R> Unpin for GenerationalRef<R>
where R: Unpin,

§

impl<R> !UnwindSafe for GenerationalRef<R>

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> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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> 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.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more