Skip to main content

design/
vec.rs

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        // FIXME(unsound)
27        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}