pub struct Xarc<T: Send> { /* private fields */ }
Expand description
Xarc
is a derefenceable atomically refcounted smart pointer.
Xarc
is roughly equivalent to Arc
but is compatible with AtomicXarc
.
§Examples
Here is some typical usage of Xarc
.
use xarc::Xarc;
let xarc = Xarc::new(42);
let same = xarc.clone();
let different = Xarc::new(42);
// Null checks
assert!(!xarc.is_null());
assert_ne!(xarc, Xarc::null());
// Pointer comparisons
assert_eq!(xarc, same);
assert_ne!(xarc, different);
// Value comparisons
assert_eq!(xarc.maybe_deref().unwrap(), different.maybe_deref().unwrap());
assert_eq!(Xarc::<i64>::null().maybe_deref(), None);
When implementing a container you often need structures with an immutable part,
such as a pointer to another part of the structure, and a separate value that
you can take
to return a value as you remove it. UnsafeCell
comes to the rescue.
use core::{cell::UnsafeCell, mem};
use xarc::Xarc;
struct Example {
immutable: i64,
takeable: UnsafeCell<i64>,
}
let mut xarc = Xarc::new(Example {immutable: 0, takeable: UnsafeCell::new(42)});
let value = unsafe {
// You had better know what you're doing at this point. 🙂
core::mem::take(&mut *xarc.maybe_deref().unwrap().takeable.get())
};
assert_eq!(value, 42);
Implementations§
Source§impl<T: Send> Xarc<T>
impl<T: Send> Xarc<T>
Sourcepub fn maybe_deref(&self) -> Option<&T>
pub fn maybe_deref(&self) -> Option<&T>
Dereference the pointer only if it is not null. None will be returned if it is null.
Sourcepub unsafe fn unguarded_maybe_deref_mut(&mut self) -> Option<&mut T>
pub unsafe fn unguarded_maybe_deref_mut(&mut self) -> Option<&mut T>
Dereference the pointer only if it is not null. None will be returned if it is null.
§Safety
- This should be called only if you’re absolutely, 100% certain that nobody else could possibly have access to this data or if you really know what you’re doing.
Trait Implementations§
impl<T: Eq + Send> Eq for Xarc<T>
impl<T: Send> Send for Xarc<T>
impl<T: Send> Sync for Xarc<T>
Auto Trait Implementations§
impl<T> Freeze for Xarc<T>
impl<T> RefUnwindSafe for Xarc<T>where
T: RefUnwindSafe,
impl<T> Unpin for Xarc<T>
impl<T> UnwindSafe for Xarc<T>where
T: RefUnwindSafe,
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