orx_concurrent_iter/implementations/jagged_arrays/owned/
raw_vec.rs

1use crate::implementations::jagged_arrays::{
2    as_raw_slice::{AsOwningSlice, AsRawSlice},
3    raw_slice::RawSlice,
4};
5use alloc::vec::Vec;
6use core::mem::ManuallyDrop;
7
8/// Raw representation of a vector defined by a pointer, capacity and length.
9///
10/// All elements within the length of the vector are assumed to be initialized;
11/// elements between length and capacity are assumed to be uninitialized.
12///
13/// # SAFETY
14///
15/// Does not release memory on Drop.
16pub struct RawVec<T> {
17    ptr: *const T,
18    len: usize,
19    capacity: usize,
20}
21
22impl<T> Clone for RawVec<T> {
23    fn clone(&self) -> Self {
24        Self {
25            ptr: self.ptr,
26            len: self.len,
27            capacity: self.capacity,
28        }
29    }
30}
31
32impl<T> From<Vec<T>> for RawVec<T> {
33    fn from(value: Vec<T>) -> Self {
34        let raw = Self {
35            ptr: value.as_ptr(),
36            len: value.len(),
37            capacity: value.capacity(),
38        };
39        let _ = ManuallyDrop::new(value);
40        raw
41    }
42}
43
44impl<T> AsRawSlice<T> for RawVec<T> {
45    fn ptr(&self) -> *const T {
46        self.ptr
47    }
48
49    fn length(&self) -> usize {
50        self.len
51    }
52
53    fn raw_slice(&self, begin: usize, len: usize) -> RawSlice<T> {
54        debug_assert!(begin + len <= self.len);
55        let ptr = unsafe { self.ptr.add(begin) };
56        RawSlice::new(ptr, len)
57    }
58}
59
60impl<T> AsOwningSlice<T> for RawVec<T> {
61    fn capacity(&self) -> usize {
62        self.capacity
63    }
64}