[][src]Struct rel_ptr::RelPtr

pub struct RelPtr<T: ?Sized + MetaData, I: Delta = isize>(_, _, _);

This represents a relative pointers

A relative pointer stores an offset, and uses its that in combination with its current position in memory to point to a value

See crate documentation for more information

Safety

When using core::num::NonZero*, it is UB to have the RelPtr point to itself, this could be achieved with

If you use RelPtr::from(offset), then you must ensure that the relative pointer is set with the given functions to avoid UB

When using RelPtr with packed structs it is important to keep in mind that packed struct move fields to align them to drop them. For example, the below example is UB

This example is not tested
 #[repr(packed)]
 struct Base(String, UnsafeThing);
 
 struct UnsafeThing(RelPtr<String>); // points into Base
 
 impl Drop for UnsafeThing {
     fn drop(&mut self) {
         // ... accessing `RelPtr<String>` here is UB
     }
 }

This is because when Base drops, all of the fields are moved to align them. So the offset between the String in unsafe thing and the RelPtr<String> in UnsafeThing could be changed. This will result in UB if you try to access String inside of UnsafeThing even if you enforce drop order!

Methods

impl<T: ?Sized + MetaData, I: Nullable> RelPtr<T, I>[src]

pub fn null() -> Self[src]

A null relative pointer has an offset of 0, (points to itself)

pub fn is_null(&self) -> bool[src]

Check if relative pointer is null

impl<T: ?Sized + MetaData, I: Delta> RelPtr<T, I>[src]

pub fn set(&mut self, value: &mut T) -> Result<(), I::Error>[src]

Set the offset of a relative pointer, if the offset cannot be calculated using the given Delta, then Err will be returned, and there will be no change to the offset

pub unsafe fn set_unchecked(&mut self, value: *mut T)[src]

Set the offset of a relative pointer,

Safety

if the offset is out of bounds for the given Delta then it's value is UB

if the given pointer is null, this is UB

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

Converts the relative pointer into a normal raw pointer

Safety

You must ensure that the relative pointer was successfully set before calling this function and that the value pointed to does not change it's offset relative to RelPtr

if relative pointer was never set successfully, this function is UB

pub unsafe fn as_non_null_unchecked(&mut self) -> NonNull<T>[src]

Converts the relative pointer into a normal raw pointer

Safety

Same as RelPtr::as_raw_unchecked

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

Gets a reference from the relative pointer

Safety

Same as RelPtr::as_raw_unchecked

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

Gets a mutable reference from the relative pointer

Safety

Same as RelPtr::as_raw_unchecked

impl<T: ?Sized + MetaData, I: Nullable> RelPtr<T, I>[src]

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

Converts the relative pointer into a normal raw pointer

Note: if self.is_null() then a null pointer will be returned

Safety

You must ensure that if the relative pointer was successfully set then the value pointed to does not change it's offset relative to RelPtr

if the relative pointer was not successfully set RelPtr::as_raw returns null, this function is safe for all types where size_of::<*mut T>() == size_of::<usize>(), otherwise this function is UB

pub unsafe fn as_non_null(&mut self) -> Ptr<T>[src]

Converts the relative pointer into a normal raw pointer

Safety

You must ensure that if the relative pointer was successfully set then the value pointed to does not change it's offset relative to RelPtr

if the relative pointer was never successfully set RelPtr::as_non_null returns None,

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

Gets a reference from the relative pointer, if the relative pointer is null, then None is returned

Safety

You are not allows to alias another mutable reference, as per the aliasing rules of references

Same as RelPtr::as_non_null

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

Gets a reference from the relative pointer, if the relative pointer is null, then None is returned

Safety

You are not allows to alias this mutable reference, as per the aliasing rules of references

Same as RelPtr::as_non_null

Trait Implementations

impl<T: ?Sized + MetaData, I: Delta> Clone for RelPtr<T, I>[src]

default fn clone_from(&mut self, source: &Self)
1.0.0
[src]

Performs copy-assignment from source. Read more

impl<T: ?Sized + MetaData, I: Delta> Eq for RelPtr<T, I>[src]

impl<T: ?Sized + MetaData, I: Delta> Copy for RelPtr<T, I>[src]

impl<T: ?Sized + MetaData, I: Delta> PartialEq<RelPtr<T, I>> for RelPtr<T, I>[src]

#[must_use]
default fn ne(&self, other: &Rhs) -> bool
1.0.0
[src]

This method tests for !=.

impl<T: ?Sized + MetaData, I: Delta> From<I> for RelPtr<T, I>[src]

Convert an offset into a RelPtr

impl<T: ?Sized + MetaData, I: Debug + Delta> Debug for RelPtr<T, I>[src]

impl<T: ?Sized + MetaData, I: Debug + Delta> Pointer for RelPtr<T, I>[src]

Auto Trait Implementations

impl<T, I = isize> !Send for RelPtr<T, I>

impl<T, I = isize> !Sync for RelPtr<T, I>

Blanket Implementations

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

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

impl<T> From for T[src]

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

type Error = Infallible

The type returned in the event of a conversion error.

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

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

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

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

The type returned in the event of a conversion error.

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