Struct sharded_slab::OwnedEntry[][src]

pub struct OwnedEntry<T, C = DefaultConfig> where
    C: Config
{ /* fields omitted */ }

An owned guard that allows access to an object in a S.ab.

While the guard exists, it indicates to the slab that the item the guard references is currently being accessed. If the item is removed from the slab while the guard exists, the removal will be deferred until all guards are dropped.

Unlike Entry, which borrows the slab, an OwnedEntry clones the Arc around the slab. Therefore, it keeps the slab from being dropped until all such guards have been dropped. This means that an OwnedEntry may be held for an arbitrary lifetime.

Examples

use std::sync::Arc;

let slab: Arc<Slab<&'static str>> = Arc::new(Slab::new());
let key = slab.insert("hello world").unwrap();

// Look up the created key, returning an `OwnedEntry`.
let value = slab.clone().get_owned(key).unwrap();

// Now, the original `Arc` clone of the slab may be dropped, but the
// returned `OwnedEntry` can still access the value.
assert_eq!(value, "hello world");

Unlike Entry, an OwnedEntry may be stored in a struct which must live for the 'static lifetime:

use sharded_slab::OwnedEntry;
use std::sync::Arc;

pub struct MyStruct {
    entry: OwnedEntry<&'static str>,
    // ... other fields ...
}

// Suppose this is some arbitrary function which requires a value that
// lives for the 'static lifetime...
fn function_requiring_static<T: 'static>(t: &T) {
    // ... do something extremely important and interesting ...
}

let slab: Arc<Slab<&'static str>> = Arc::new(Slab::new());
let key = slab.insert("hello world").unwrap();

// Look up the created key, returning an `OwnedEntry`.
let entry = slab.clone().get_owned(key).unwrap();
let my_struct = MyStruct {
    entry,
    // ...
};

// We can use `my_struct` anywhere where it is required to have the
// `'static` lifetime:
function_requiring_static(&my_struct);

OwnedEntrys may be sent between threads:

use std::{thread, sync::Arc};

let slab: Arc<Slab<&'static str>> = Arc::new(Slab::new());
let key = slab.insert("hello world").unwrap();

// Look up the created key, returning an `OwnedEntry`.
let value = slab.clone().get_owned(key).unwrap();

thread::spawn(move || {
    assert_eq!(value, "hello world");
    // ...
}).join().unwrap();

Implementations

impl<T, C> OwnedEntry<T, C> where
    C: Config
[src]

pub fn key(&self) -> usize[src]

Returns the key used to access this guard

Trait Implementations

impl<T, C> Debug for OwnedEntry<T, C> where
    T: Debug,
    C: Config
[src]

impl<T, C> Deref for OwnedEntry<T, C> where
    C: Config
[src]

type Target = T

The resulting type after dereferencing.

impl<T, C> Drop for OwnedEntry<T, C> where
    C: Config
[src]

impl<T, C> PartialEq<T> for OwnedEntry<T, C> where
    T: PartialEq<T>,
    C: Config
[src]

impl<T, C> Send for OwnedEntry<T, C> where
    T: Sync,
    C: Config
[src]

impl<T, C> Sync for OwnedEntry<T, C> where
    T: Sync,
    C: Config
[src]

Auto Trait Implementations

impl<T, C = DefaultConfig> !RefUnwindSafe for OwnedEntry<T, C>

impl<T, C> Unpin for OwnedEntry<T, C>

impl<T, C = DefaultConfig> !UnwindSafe for OwnedEntry<T, C>

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.