fromsoftware_shared/
owned_pointer.rs1use std::{
2 ops::{Deref, DerefMut},
3 ptr::NonNull,
4};
5
6#[repr(C)]
15pub struct OwnedPtr<T>(NonNull<T>);
16
17impl<T> OwnedPtr<T> {
18 pub fn as_ptr(&self) -> *mut T {
19 self.0.as_ptr()
20 }
21}
22
23impl<T> Deref for OwnedPtr<T> {
24 type Target = T;
25
26 fn deref(&self) -> &Self::Target {
27 unsafe { self.0.as_ref() }
28 }
29}
30
31impl<T> AsRef<T> for OwnedPtr<T> {
32 fn as_ref(&self) -> &T {
33 self.deref()
34 }
35}
36
37impl<T> DerefMut for OwnedPtr<T> {
38 fn deref_mut(&mut self) -> &mut Self::Target {
39 unsafe { self.0.as_mut() }
40 }
41}
42
43impl<T> AsMut<T> for OwnedPtr<T> {
44 fn as_mut(&mut self) -> &mut T {
45 self.deref_mut()
46 }
47}
48
49unsafe impl<T> Send for OwnedPtr<T> {}
50unsafe impl<T> Sync for OwnedPtr<T> where T: Sync {}