pub struct NonNullExt<T: ?Sized> { /* private fields */ }Expand description
A pointer that is extended with type id or name.
If ‘check’ feature is enabled, it contains type id or name. Otherwise, it’s
just a NonNull. This is useful when you want to know the type of the
pointer.
Implementations§
Source§impl<T: ?Sized> NonNullExt<T>
impl<T: ?Sized> NonNullExt<T>
Sourcepub fn new(ptr: *mut T) -> Option<Self>
pub fn new(ptr: *mut T) -> Option<Self>
Creates a NonNullExt from the given pointer.
Returns None if the pointer is null.
§Examples
use my_ecs::ds::NonNullExt;
let mut v = 0;
let ptr = NonNullExt::new(&mut v as *mut i32).unwrap();Sourcepub unsafe fn new_unchecked(ptr: *mut T) -> Self
pub unsafe fn new_unchecked(ptr: *mut T) -> Self
Creates a NonNullExt from the given pointer.
§Safety
The pointer must be non-null.
§Examples
use my_ecs::ds::NonNullExt;
let mut v = 0;
let ptr = unsafe { NonNullExt::new_unchecked(&mut v as *mut i32) };Sourcepub fn from_nonnull(ptr: NonNull<T>) -> Self
pub fn from_nonnull(ptr: NonNull<T>) -> Self
Creates a NonNullExt from the given pointer.
§Examples
use my_ecs::ds::NonNullExt;
use std::ptr::NonNull;
let mut v = 0;
let ptr = NonNull::new(&mut v as *mut i32).unwrap();
let ptr = NonNullExt::from_nonnull(ptr);Sourcepub const fn dangling() -> Selfwhere
T: Sized,
pub const fn dangling() -> Selfwhere
T: Sized,
Creates a NonNullExt that is dangling, but well-aligned.
In many Rust functions, they require aligned pointers even if they are some trash values. This function will be usuful in that cases.
§Examples
use my_ecs::ds::NonNullExt;
let dangling = NonNullExt::<i32>::dangling();Sourcepub fn is_dangling(&self) -> boolwhere
T: Sized,
pub fn is_dangling(&self) -> boolwhere
T: Sized,
Returns true if the pointer is dangling.
§Examples
use my_ecs::ds::NonNullExt;
let dangling = NonNullExt::<i32>::dangling();
assert!(dangling.is_dangling());Sourcepub fn with_type(self, _ty: TypeIdExt) -> Self
pub fn with_type(self, _ty: TypeIdExt) -> Self
Sets the TypeIdExt to the pointer then returns the pointer.
Basically, NonNullExt contains type name of the pointer if check
feature is enabled. You can replace it with the given TypeIdExt
using this method. But check feature is disabled, this method is
no-op.
§Examples
use my_ecs::{prelude::*, ds::NonNullExt};
let mut v = 0;
let ptr = NonNullExt::new(&mut v as *mut i32)
.unwrap()
.with_type(TypeIdExt::of::<i32>());Sourcepub fn get_type(&self) -> Option<&TypeIdExt>
pub fn get_type(&self) -> Option<&TypeIdExt>
Returns TypeIdExt of the pointer if check feature is enabled and
the pointer contains TypeIdExt rather than type name.
If you want to set the TypeIdExt to the pointer, call
NonNullExt::with_type.
§Examples
use my_ecs::{prelude::*, ds::NonNullExt};
let mut v = 0;
let ptr = NonNullExt::new(&mut v as *mut i32)
.unwrap()
.with_type(TypeIdExt::of::<i32>());Sourcepub fn get_name(&self) -> Option<&'static str>
pub fn get_name(&self) -> Option<&'static str>
Returns type name of the pointer if check feature is enabled.
§Examples
use my_ecs::ds::NonNullExt;
let mut v = 0;
let ptr = NonNullExt::new(&mut v as *mut i32).unwrap();
let name = ptr.get_name();Sourcepub fn cast<U>(self) -> NonNullExt<U>
pub fn cast<U>(self) -> NonNullExt<U>
Casts the pointer to another type.
Note that this method resets TypeIdExt you set through
NonNullExt::with_type.
§Examples
use my_ecs::ds::NonNullExt;
let mut v = 0x1234_5678;
let ptr = NonNullExt::new(&mut v as *mut i32).unwrap();
let ptr = ptr.cast::<[u8; 4]>();
let ref_v = unsafe { ptr.as_ref() };
assert_eq!(*ref_v, i32::to_ne_bytes(v));Sourcepub unsafe fn add(self, count: usize) -> Selfwhere
T: Sized,
pub unsafe fn add(self, count: usize) -> Selfwhere
T: Sized,
Adds an offset to the pointer then returns the result.
Note that count is in units of T. For example, count = 3 means
12 bytes offset if T is i32.
§Safety
See NonNull::add.
§Examples
use my_ecs::ds::NonNullExt;
let arr: [char; 3] = ['a', 'b', 'c'];
let ptr = NonNullExt::new(arr.as_ptr().cast_mut()).unwrap();
let ref_v = unsafe { ptr.add(1).as_ref() };
assert_eq!(ref_v, &'b');
let ref_v = unsafe { ptr.add(2).as_ref() };
assert_eq!(ref_v, &'c');Sourcepub unsafe fn sub(self, count: usize) -> Selfwhere
T: Sized,
pub unsafe fn sub(self, count: usize) -> Selfwhere
T: Sized,
Subtracts an offset from the pointer then returns the result.
Note that count is in units of T. For example, count = 3 means
12 bytes offset if T is i32.
§Safety
See NonNull::sub.
§Examples
use my_ecs::ds::NonNullExt;
let arr: [char; 3] = ['a', 'b', 'c'];
let ptr = NonNullExt::new((&arr[2] as *const char).cast_mut()).unwrap();
let ref_v = unsafe { ptr.sub(1).as_ref() };
assert_eq!(ref_v, &'b');
let ref_v = unsafe { ptr.sub(2).as_ref() };
assert_eq!(ref_v, &'a');Methods from Deref<Target = NonNull<T>>§
1.25.0 · Sourcepub unsafe fn as_ref<'a>(&self) -> &'a T
pub unsafe fn as_ref<'a>(&self) -> &'a T
Returns a shared reference to the value. If the value may be uninitialized, as_uninit_ref
must be used instead.
For the mutable counterpart see as_mut.
§Safety
When calling this method, you have to ensure that the pointer is convertible to a reference.
§Examples
use std::ptr::NonNull;
let mut x = 0u32;
let ptr = NonNull::new(&mut x as *mut _).expect("ptr is null!");
let ref_x = unsafe { ptr.as_ref() };
println!("{ref_x}");1.25.0 · Sourcepub unsafe fn as_mut<'a>(&mut self) -> &'a mut T
pub unsafe fn as_mut<'a>(&mut self) -> &'a mut T
Returns a unique reference to the value. If the value may be uninitialized, as_uninit_mut
must be used instead.
For the shared counterpart see as_ref.
§Safety
When calling this method, you have to ensure that the pointer is convertible to a reference.
§Examples
use std::ptr::NonNull;
let mut x = 0u32;
let mut ptr = NonNull::new(&mut x).expect("null pointer");
let x_ref = unsafe { ptr.as_mut() };
assert_eq!(*x_ref, 0);
*x_ref += 2;
assert_eq!(*x_ref, 2);Trait Implementations§
Source§impl<T: ?Sized> Clone for NonNullExt<T>
impl<T: ?Sized> Clone for NonNullExt<T>
Source§impl<T: ?Sized> Debug for NonNullExt<T>
impl<T: ?Sized> Debug for NonNullExt<T>
Source§impl<T: ?Sized> Deref for NonNullExt<T>
impl<T: ?Sized> Deref for NonNullExt<T>
Source§impl<T: ?Sized> DerefMut for NonNullExt<T>
impl<T: ?Sized> DerefMut for NonNullExt<T>
Source§impl<T: ?Sized> Hash for NonNullExt<T>
impl<T: ?Sized> Hash for NonNullExt<T>
Source§impl<T: ?Sized> Ord for NonNullExt<T>
impl<T: ?Sized> Ord for NonNullExt<T>
Source§impl<T: ?Sized> PartialEq for NonNullExt<T>
impl<T: ?Sized> PartialEq for NonNullExt<T>
Source§impl<T: ?Sized> PartialOrd for NonNullExt<T>
impl<T: ?Sized> PartialOrd for NonNullExt<T>
impl<T: ?Sized> Copy for NonNullExt<T>
impl<T: ?Sized> Eq for NonNullExt<T>
Auto Trait Implementations§
impl<T> Freeze for NonNullExt<T>where
T: ?Sized,
impl<T> RefUnwindSafe for NonNullExt<T>where
T: RefUnwindSafe + ?Sized,
impl<T> !Send for NonNullExt<T>
impl<T> !Sync for NonNullExt<T>
impl<T> Unpin for NonNullExt<T>where
T: ?Sized,
impl<T> UnwindSafe for NonNullExt<T>where
T: RefUnwindSafe + ?Sized,
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more