1 use crate::rust_string::RustString;
2 use alloc::string::String;
3 use alloc::vec::Vec;
4 use core::mem::ManuallyDrop;
5 
6 #[repr(C)]
7 pub struct RustVec<T> {
8     pub(crate) repr: Vec<T>,
9 }
10 
11 impl<T> RustVec<T> {
new() -> Self12     pub fn new() -> Self {
13         RustVec { repr: Vec::new() }
14     }
15 
from(v: Vec<T>) -> Self16     pub fn from(v: Vec<T>) -> Self {
17         RustVec { repr: v }
18     }
19 
from_ref(v: &Vec<T>) -> &Self20     pub fn from_ref(v: &Vec<T>) -> &Self {
21         unsafe { &*(v as *const Vec<T> as *const RustVec<T>) }
22     }
23 
from_mut(v: &mut Vec<T>) -> &mut Self24     pub fn from_mut(v: &mut Vec<T>) -> &mut Self {
25         unsafe { &mut *(v as *mut Vec<T> as *mut RustVec<T>) }
26     }
27 
into_vec(self) -> Vec<T>28     pub fn into_vec(self) -> Vec<T> {
29         self.repr
30     }
31 
as_vec(&self) -> &Vec<T>32     pub fn as_vec(&self) -> &Vec<T> {
33         &self.repr
34     }
35 
as_mut_vec(&mut self) -> &mut Vec<T>36     pub fn as_mut_vec(&mut self) -> &mut Vec<T> {
37         &mut self.repr
38     }
39 
len(&self) -> usize40     pub fn len(&self) -> usize {
41         self.repr.len()
42     }
43 
as_ptr(&self) -> *const T44     pub fn as_ptr(&self) -> *const T {
45         self.repr.as_ptr()
46     }
47 
reserve_total(&mut self, cap: usize)48     pub fn reserve_total(&mut self, cap: usize) {
49         let len = self.repr.len();
50         if cap > len {
51             self.repr.reserve(cap - len);
52         }
53     }
54 
set_len(&mut self, len: usize)55     pub unsafe fn set_len(&mut self, len: usize) {
56         self.repr.set_len(len);
57     }
58 }
59 
60 impl RustVec<RustString> {
from_vec_string(v: Vec<String>) -> Self61     pub fn from_vec_string(v: Vec<String>) -> Self {
62         let mut v = ManuallyDrop::new(v);
63         let ptr = v.as_mut_ptr().cast::<RustString>();
64         let len = v.len();
65         let cap = v.capacity();
66         Self::from(unsafe { Vec::from_raw_parts(ptr, len, cap) })
67     }
68 
from_ref_vec_string(v: &Vec<String>) -> &Self69     pub fn from_ref_vec_string(v: &Vec<String>) -> &Self {
70         Self::from_ref(unsafe { &*(v as *const Vec<String> as *const Vec<RustString>) })
71     }
72 
from_mut_vec_string(v: &mut Vec<String>) -> &mut Self73     pub fn from_mut_vec_string(v: &mut Vec<String>) -> &mut Self {
74         Self::from_mut(unsafe { &mut *(v as *mut Vec<String> as *mut Vec<RustString>) })
75     }
76 
into_vec_string(self) -> Vec<String>77     pub fn into_vec_string(self) -> Vec<String> {
78         let mut v = ManuallyDrop::new(self.repr);
79         let ptr = v.as_mut_ptr().cast::<String>();
80         let len = v.len();
81         let cap = v.capacity();
82         unsafe { Vec::from_raw_parts(ptr, len, cap) }
83     }
84 
as_vec_string(&self) -> &Vec<String>85     pub fn as_vec_string(&self) -> &Vec<String> {
86         unsafe { &*(&self.repr as *const Vec<RustString> as *const Vec<String>) }
87     }
88 
as_mut_vec_string(&mut self) -> &mut Vec<String>89     pub fn as_mut_vec_string(&mut self) -> &mut Vec<String> {
90         unsafe { &mut *(&mut self.repr as *mut Vec<RustString> as *mut Vec<String>) }
91     }
92 }
93