pub struct SemiSticky<T: 'static> { /* private fields */ }Expand description
A SemiSticky<T> keeps a value T stored in a thread if it has a drop.
This is a combined version of Fragile and Sticky. If the type
does not have a drop it will effectively be a Fragile, otherwise it
will be internally behave like a Sticky.
This type requires T: 'static for the same reasons as Sticky and
exposes the value only through scoped callbacks. Like Sticky, it is
Unpin only if T is Unpin.
Implementations§
Source§impl<T> SemiSticky<T>
impl<T> SemiSticky<T>
Sourcepub fn new(value: T) -> Self
pub fn new(value: T) -> Self
Creates a new SemiSticky wrapping a value.
The value that is moved into the SemiSticky can be non Send and
will be anchored to the thread that created the object. If the
sticky wrapper type ends up being send from thread to thread
only the original thread can interact with the value. In case the
value does not have Drop it will be stored in the Fragile
instead.
Sourcepub fn is_valid(&self) -> bool
pub fn is_valid(&self) -> bool
Returns true if the access is valid.
This will be false if the value was sent to another thread. For values
stored in Sticky, it is also false once their registry starts being
destroyed. Values without drop glue do not depend on the registry.
Sourcepub fn into_inner(self) -> T
pub fn into_inner(self) -> T
Consumes the SemiSticky, returning the wrapped value.
§Panics
Panics if called from a different thread than the one where the original value was created.
Sourcepub fn try_into_inner(self) -> Result<T, Self>
pub fn try_into_inner(self) -> Result<T, Self>
Consumes the SemiSticky, returning the wrapped value if successful.
The wrapped value is returned if this is called from the same thread
as the one where the original value was created, otherwise the
SemiSticky is returned as Err(self).
Sourcepub fn with<R, F>(&self, f: F) -> R
pub fn with<R, F>(&self, f: F) -> R
Invokes a callback with a shared reference to the wrapped value.
The callback may return owned data, but it cannot return a reference derived from the wrapped value.
use fragile::SemiSticky;
let value = SemiSticky::new(String::from("hello"));
let length = value.with(String::len);
assert_eq!(length, 5);§Panics
Panics if the calling thread is not the one that wrapped the value, or
if its thread-local registry has been destroyed.
For a non-panicking variant, use try_with.
Sourcepub fn with_mut<R, F>(&mut self, f: F) -> R
pub fn with_mut<R, F>(&mut self, f: F) -> R
Invokes a callback with an exclusive reference to the wrapped value.
The callback may return owned data, but it cannot return a reference derived from the wrapped value.
§Panics
Panics if the calling thread is not the one that wrapped the value, or
if its thread-local registry has been destroyed.
For a non-panicking variant, use try_with_mut.
Sourcepub fn try_with<R, F>(&self, f: F) -> Result<R, InvalidThreadAccess>
pub fn try_with<R, F>(&self, f: F) -> Result<R, InvalidThreadAccess>
Invokes a callback with a shared reference to the wrapped value.
As with with, the callback cannot return a reference
derived from the wrapped value.
Returns InvalidThreadAccess without invoking the callback if
is_valid is false.
Sourcepub fn try_with_mut<R, F>(&mut self, f: F) -> Result<R, InvalidThreadAccess>
pub fn try_with_mut<R, F>(&mut self, f: F) -> Result<R, InvalidThreadAccess>
Invokes a callback with an exclusive reference to the wrapped value.
As with with_mut, the callback cannot return a
reference derived from the wrapped value.
Returns InvalidThreadAccess without invoking the callback if
is_valid is false.