blob: 5e7082ae18c639129b20a15657f8c4124ed6ac2c [file] [log] [blame]
David Tolnay33f56ad2020-08-27 17:06:35 -07001use crate::rust_string::RustString;
2use std::mem::ManuallyDrop;
3
Myron Ahneba35cf2020-02-05 19:41:51 +07004#[repr(C)]
David Tolnay3a8ae092020-04-24 11:55:46 -07005pub struct RustVec<T> {
Myron Ahneba35cf2020-02-05 19:41:51 +07006 repr: Vec<T>,
7}
8
David Tolnay3a8ae092020-04-24 11:55:46 -07009impl<T> RustVec<T> {
David Tolnayf97c2d52020-04-25 16:37:48 -070010 pub fn new() -> Self {
11 RustVec { repr: Vec::new() }
12 }
13
Myron Ahneba35cf2020-02-05 19:41:51 +070014 pub fn from(v: Vec<T>) -> Self {
15 RustVec { repr: v }
16 }
17
18 pub fn from_ref(v: &Vec<T>) -> &Self {
David Tolnayfac8b252020-04-24 11:37:39 -070019 unsafe { &*(v as *const Vec<T> as *const RustVec<T>) }
Myron Ahneba35cf2020-02-05 19:41:51 +070020 }
21
David Tolnayf1c7f322020-08-27 00:46:01 -070022 pub fn from_mut(v: &mut Vec<T>) -> &mut Self {
23 unsafe { &mut *(v as *mut Vec<T> as *mut RustVec<T>) }
24 }
25
Myron Ahneba35cf2020-02-05 19:41:51 +070026 pub fn into_vec(self) -> Vec<T> {
27 self.repr
28 }
29
30 pub fn as_vec(&self) -> &Vec<T> {
31 &self.repr
32 }
33
34 pub fn as_mut_vec(&mut self) -> &mut Vec<T> {
35 &mut self.repr
36 }
37
38 pub fn len(&self) -> usize {
39 self.repr.len()
40 }
David Tolnay219c0792020-04-24 20:31:37 -070041
42 pub fn as_ptr(&self) -> *const T {
43 self.repr.as_ptr()
44 }
Myron Ahneba35cf2020-02-05 19:41:51 +070045}
David Tolnay33f56ad2020-08-27 17:06:35 -070046
47impl RustVec<RustString> {
48 pub fn from_vec_string(v: Vec<String>) -> Self {
49 let mut v = ManuallyDrop::new(v);
50 let ptr = v.as_mut_ptr().cast::<RustString>();
51 let len = v.len();
52 let cap = v.capacity();
53 Self::from(unsafe { Vec::from_raw_parts(ptr, len, cap) })
54 }
55
56 pub fn from_ref_vec_string(v: &Vec<String>) -> &Self {
57 Self::from_ref(unsafe { &*(v as *const Vec<String> as *const Vec<RustString>) })
58 }
59
60 pub fn from_mut_vec_string(v: &mut Vec<String>) -> &mut Self {
61 Self::from_mut(unsafe { &mut *(v as *mut Vec<String> as *mut Vec<RustString>) })
62 }
63
64 pub fn into_vec_string(self) -> Vec<String> {
65 let mut v = ManuallyDrop::new(self.repr);
66 let ptr = v.as_mut_ptr().cast::<String>();
67 let len = v.len();
68 let cap = v.capacity();
69 unsafe { Vec::from_raw_parts(ptr, len, cap) }
70 }
71
72 pub fn as_vec_string(&self) -> &Vec<String> {
73 unsafe { &*(&self.repr as *const Vec<RustString> as *const Vec<String>) }
74 }
75
76 pub fn as_mut_vec_string(&mut self) -> &mut Vec<String> {
77 unsafe { &mut *(&mut self.repr as *mut Vec<RustString> as *mut Vec<String>) }
78 }
79}