use std::mem;
use std::ptr;
use std::slice;
pub trait SafePtr {
type Ptr;
fn as_safe_ptr(&self) -> *const Self::Ptr;
}
impl<T> SafePtr for Vec<T> {
type Ptr = T;
fn as_safe_ptr(&self) -> *const T {
if self.is_empty() {
ptr::null()
} else {
self.as_ptr()
}
}
}
pub unsafe fn vec_clone_from_raw_parts<T: Clone>(ptr: *const T, len: usize) -> Vec<T> {
slice::from_raw_parts(ptr, len).to_vec()
}
pub fn vec_into_raw_parts<T>(mut v: Vec<T>) -> (*mut T, usize, usize) {
v.shrink_to_fit();
let ptr = v.as_mut_ptr();
let len = v.len();
let cap = v.capacity();
mem::forget(v);
(ptr, len, cap)
}