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}