use foreign_vec::ForeignVec;
#[repr(C)]
struct Foreign {
ptr: *const i32,
length: usize,
capacity: usize,
}
impl Drop for Foreign {
fn drop(&mut self) {
unsafe { Vec::from_raw_parts(self.ptr as *mut i32, self.length, self.capacity) };
}
}
type MyForeignVec = ForeignVec<Foreign, i32>;
#[test]
fn test_vec() {
let expected: &[i32] = &[1, 2];
let vec = expected.to_vec();
let mut vec: MyForeignVec = vec.into();
assert_eq!(&*vec, expected);
assert_eq!(format!("{:?}", vec), "[1, 2]");
assert_eq!(vec.get_vec(), Some(&mut vec![1, 2]));
drop(vec)
}
fn into_raw_parts<T>(vec: Vec<T>) -> (*mut T, usize, usize) {
let r = (vec.as_ptr() as *mut T, vec.len(), vec.capacity());
std::mem::forget(vec);
r
}
#[test]
fn test_foreign() {
let expected: &[i32] = &[1, 2];
let a = expected.to_vec();
let (ptr, length, capacity) = into_raw_parts(a);
let a = Foreign {
ptr,
length,
capacity,
};
let mut vec = unsafe { MyForeignVec::from_foreign(a.ptr, a.length, a) };
assert_eq!(&*vec, expected);
assert_eq!(vec.get_vec(), None);
drop(vec);
}