1use std::ptr::NonNull;
2
3use crate::ops::place::{
4 BorrowPlace,
5 CreateHandle,
6 PlaceHandle,
7 PlaceProxy,
8 borrowck::{
9 AccessKind,
10 Instant,
11 Lifetime,
12 },
13};
14
15impl<T> PlaceProxy for Vec<T> {
16 type Target = [T];
17}
18
19unsafe impl<T> CreateHandle<Instant> for Vec<T> {
20 type Handle = VecHandle<T>;
21
22 const ACCESS: AccessKind = AccessKind::Shared;
23
24 unsafe fn handle_from_raw(this: *const Self) -> Self::Handle {
25 let this = this.cast_mut();
26 let vec = unsafe { &mut *this };
28 let len = vec.len();
29 let ptr = Vec::as_non_null(vec);
30 let ptr = NonNull::slice_from_raw_parts(ptr, len);
31 VecHandle { ptr }
32 }
33}
34
35pub struct VecHandle<T> {
36 ptr: NonNull<[T]>,
37}
38
39impl<T> PlaceHandle for VecHandle<T> {
40 type Target = [T];
41}
42
43unsafe impl<'a, T> BorrowPlace<&'a [T]> for VecHandle<T> {
44 const ACCESS: AccessKind = AccessKind::Shared;
45 type Timing = Lifetime<'a>;
46 const SAFE: bool = true;
47
48 unsafe fn borrow(self) -> &'a [T] {
49 unsafe { self.ptr.as_ref() }
50 }
51}