[][src]Struct ptr::Shared

pub struct Shared<T: ?Sized> { /* fields omitted */ }

*mut T but non-zero and covariant.

This is often the correct thing to use when building data structures using raw pointers, but is ultimately more dangerous to use because of its additional properties. If you're not sure if you should use Shared<T>, just use *mut T!

Unlike *mut T, the pointer must always be non-null, even if the pointer is never dereferenced. This is so that enums may use this forbidden value as a discriminant -- Option<Shared<T>> has the same size as Shared<T>. However the pointer may still dangle if it isn't dereferenced.

Unlike *mut T, Shared<T> is covariant over T. If this is incorrect for your use case, you should include some PhantomData in your type to provide invariance, such as PhantomData<Cell<T>> or PhantomData<&'a mut T>. Usually this won't be necessary; covariance is correct for most safe abstractions, such as Box, Rc, Arc, Vec, and LinkedList. This is the case because they provide a public API that follows the normal shared XOR mutable rules of Rust.

Implementations

impl<T: Sized> Shared<T>[src]

pub const fn empty() -> Self[src]

Creates a new Shared that is dangling, but well-aligned.

This is useful for initializing types which lazily allocate, like Vec::new does.

impl<T: ?Sized> Shared<T>[src]

pub const unsafe fn new_unchecked(ptr: *mut T) -> Self[src]

Creates a new Shared.

Safety

ptr must be non-null.

pub fn new(ptr: *mut T) -> Option<Self>[src]

Creates a new Shared if ptr is non-null.

pub const fn as_ptr(self) -> NonNull<T>[src]

Acquires the underlying *mut pointer.

pub unsafe fn as_ref(&self) -> &T[src]

Dereferences the content.

The resulting lifetime is bound to self so this behaves "as if" it were actually an instance of T that is getting borrowed. If a longer (unbound) lifetime is needed, use &*my_ptr.ptr().

pub unsafe fn as_mut(&mut self) -> &mut T[src]

Mutably dereferences the content.

The resulting lifetime is bound to self so this behaves "as if" it were actually an instance of T that is getting borrowed. If a longer (unbound) lifetime is needed, use &mut *my_ptr.ptr_mut().

Trait Implementations

impl<T: ?Sized> Clone for Shared<T>[src]

impl<S: ?Sized + Unsize<T>, T: ?Sized> CoerceUnsized<Shared<T>> for Shared<S>[src]

impl<T: ?Sized> Copy for Shared<T>[src]

impl<'a, T: ?Sized> From<&'a T> for Shared<T>[src]

impl<'a, T: ?Sized> From<&'a mut T> for Shared<T>[src]

impl<T: ?Sized> From<NonNull<T>> for Shared<T>[src]

impl<T: ?Sized> From<Unique<T>> for Shared<T>[src]

impl<T: ?Sized> Pointer for Shared<T>[src]

Auto Trait Implementations

impl<T> !Send for Shared<T>

impl<T> !Sync for Shared<T>

impl<T: ?Sized> Unpin for Shared<T>

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.