Skip to main content

design/ptr/
raw_mut.rs

1use std::ptr;
2
3use crate::{
4    ops::place::{
5        CreateHandle,
6        DerefPlace,
7        DropHusk,
8        DropPlace,
9        MovePlace,
10        PlaceHandle,
11        PlaceProxy,
12        ProjectPlace,
13        ReadMetadata,
14        ReadPlace,
15        WritePlace,
16        borrowck::{
17            AccessKind,
18            Instant,
19            Timing,
20        },
21    },
22    place::Subplace,
23    ptr::Metadata,
24};
25
26impl<T: ?Sized> PlaceProxy for *mut T {
27    type Target = T;
28}
29
30unsafe impl<T: ?Sized> CreateHandle<Instant> for *mut T {
31    type Handle = Self;
32
33    const ACCESS: AccessKind = AccessKind::Untracked;
34
35    unsafe fn handle_from_raw(this: *const Self) -> Self::Handle {
36        unsafe { *this }
37    }
38}
39
40impl<T: ?Sized> PlaceHandle for *mut T {
41    type Target = T;
42}
43
44unsafe impl<T> ReadPlace for *mut T {
45    const ACCESS: AccessKind = AccessKind::Untracked;
46    const SAFE: bool = false;
47
48    unsafe fn read_place(self) -> Self::Target {
49        unsafe { self.read() }
50    }
51}
52
53unsafe impl<T: ?Sized> ReadMetadata for *mut T {
54    fn metadata(self) -> Metadata<Self::Target> {
55        ptr::metadata(self)
56    }
57}
58
59unsafe impl<T> MovePlace for *mut T {}
60
61unsafe impl<T> WritePlace for *mut T {
62    const ACCESS: AccessKind = AccessKind::Untracked;
63    const SAFE: bool = false;
64
65    unsafe fn write_place(self, value: Self::Target) {
66        unsafe { self.write(value) }
67    }
68}
69
70unsafe impl<T> DropPlace for *mut T {
71    unsafe fn drop_place(self) {
72        unsafe { self.drop_in_place() }
73    }
74}
75
76unsafe impl<T> DropHusk for *mut T {
77    unsafe fn drop_husk(_: *mut Self) {}
78}
79
80unsafe impl<S: Subplace> ProjectPlace<S> for *mut S::Source {
81    type Projected = *mut S::Target;
82
83    unsafe fn project_place(self, subplace: S) -> Self::Projected {
84        let meta: Metadata<S::Source> = self.metadata();
85        let thin: *mut () = self.cast();
86        let (offset, meta) = subplace.offset(meta);
87        let thin = unsafe { thin.byte_add(offset) };
88        ptr::from_raw_parts_mut(thin, meta)
89    }
90}
91
92unsafe impl<P, ProxyTiming> DerefPlace<ProxyTiming, Instant> for *mut P
93where
94    P: ?Sized + CreateHandle<ProxyTiming>,
95    ProxyTiming: Timing,
96{
97    const POINTEE_ACCESS: AccessKind = P::ACCESS;
98    const POINTER_ACCESS: AccessKind = AccessKind::Untracked;
99
100    const SAFE: bool = false;
101
102    unsafe fn deref_place(
103        self,
104    ) -> <Self::Target as CreateHandle<ProxyTiming>>::Handle {
105        unsafe { P::handle_from_raw(self) }
106    }
107}