blob: 8ddc4a72df04746740ffb9019cd1b1315360d28d [file] [log] [blame]
David Tolnay33f56ad2020-08-27 17:06:35 -07001use crate::rust_string::RustString;
David Tolnayc5a52f92020-09-14 00:43:29 -04002use alloc::string::String;
3use alloc::vec::Vec;
David Tolnay3384c142020-09-14 00:26:47 -04004use core::mem::ManuallyDrop;
David Tolnay33f56ad2020-08-27 17:06:35 -07005
Myron Ahneba35cf2020-02-05 19:41:51 +07006#[repr(C)]
David Tolnay3a8ae092020-04-24 11:55:46 -07007pub struct RustVec<T> {
David Tolnay9f6c0752020-09-07 22:26:46 -07008 pub(crate) repr: Vec<T>,
Myron Ahneba35cf2020-02-05 19:41:51 +07009}
10
David Tolnay3a8ae092020-04-24 11:55:46 -070011impl<T> RustVec<T> {
David Tolnayf97c2d52020-04-25 16:37:48 -070012 pub fn new() -> Self {
13 RustVec { repr: Vec::new() }
14 }
15
Myron Ahneba35cf2020-02-05 19:41:51 +070016 pub fn from(v: Vec<T>) -> Self {
17 RustVec { repr: v }
18 }
19
20 pub fn from_ref(v: &Vec<T>) -> &Self {
David Tolnayfac8b252020-04-24 11:37:39 -070021 unsafe { &*(v as *const Vec<T> as *const RustVec<T>) }
Myron Ahneba35cf2020-02-05 19:41:51 +070022 }
23
David Tolnayf1c7f322020-08-27 00:46:01 -070024 pub fn from_mut(v: &mut Vec<T>) -> &mut Self {
25 unsafe { &mut *(v as *mut Vec<T> as *mut RustVec<T>) }
26 }
27
Myron Ahneba35cf2020-02-05 19:41:51 +070028 pub fn into_vec(self) -> Vec<T> {
29 self.repr
30 }
31
32 pub fn as_vec(&self) -> &Vec<T> {
33 &self.repr
34 }
35
36 pub fn as_mut_vec(&mut self) -> &mut Vec<T> {
37 &mut self.repr
38 }
39
40 pub fn len(&self) -> usize {
41 self.repr.len()
42 }
David Tolnay219c0792020-04-24 20:31:37 -070043
44 pub fn as_ptr(&self) -> *const T {
45 self.repr.as_ptr()
46 }
David Tolnayfb6b73c2020-11-10 14:32:16 -080047
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
55 pub unsafe fn set_len(&mut self, len: usize) {
56 self.repr.set_len(len);
57 }
Myron Ahneba35cf2020-02-05 19:41:51 +070058}
David Tolnay33f56ad2020-08-27 17:06:35 -070059
60impl RustVec<RustString> {
61 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
69 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
73 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
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
85 pub fn as_vec_string(&self) -> &Vec<String> {
86 unsafe { &*(&self.repr as *const Vec<RustString> as *const Vec<String>) }
87 }
88
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}