#![warn(clippy::all)]
#![warn(clippy::pedantic)]
#![warn(clippy::cargo)]
#![allow(clippy::option_if_let_else)]
#![allow(unknown_lints)]
#![warn(missing_docs)]
#![warn(missing_debug_implementations)]
#![warn(missing_copy_implementations)]
#![warn(rust_2018_idioms)]
#![warn(rust_2021_compatibility)]
#![warn(trivial_casts, trivial_numeric_casts)]
#![warn(unsafe_op_in_unsafe_fn)]
#![warn(unused_qualifications)]
#![warn(variant_size_differences)]
#![cfg_attr(docsrs, feature(doc_cfg))]
#![cfg_attr(docsrs, feature(doc_alias))]
#![no_std]
#![doc(html_root_url = "https://docs.rs/raw-parts/1.0.1")]
#[cfg(doctest)]
#[doc = include_str!("../README.md")]
mod readme {}
extern crate alloc;
use alloc::vec::Vec;
use core::mem::ManuallyDrop;
#[derive(Debug, PartialEq, Eq, Hash)]
pub struct RawParts<T> {
pub ptr: *mut T,
pub length: usize,
pub capacity: usize,
}
impl<T> From<Vec<T>> for RawParts<T> {
fn from(vec: Vec<T>) -> Self {
Self::from_vec(vec)
}
}
impl<T> RawParts<T> {
#[must_use]
pub fn from_vec(vec: Vec<T>) -> RawParts<T> {
let mut me = ManuallyDrop::new(vec);
let (ptr, length, capacity) = (me.as_mut_ptr(), me.len(), me.capacity());
Self {
ptr,
length,
capacity,
}
}
#[must_use]
#[allow(clippy::needless_pass_by_value)]
pub unsafe fn into_vec(this: Self) -> Vec<T> {
let Self {
ptr,
length,
capacity,
} = this;
unsafe { Vec::from_raw_parts(ptr, length, capacity) }
}
}
#[cfg(test)]
mod tests {
use alloc::vec::Vec;
use crate::RawParts;
#[test]
fn roundtrip() {
let mut vec = Vec::with_capacity(100); vec.extend_from_slice(b"123456789");
let raw_parts = RawParts::from_vec(vec);
let raw_ptr = raw_parts.ptr;
let mut roundtripped_vec = unsafe { RawParts::into_vec(raw_parts) };
assert_eq!(roundtripped_vec.capacity(), 100);
assert_eq!(roundtripped_vec.len(), 9);
assert_eq!(roundtripped_vec.as_mut_ptr(), raw_ptr);
}
#[test]
fn from_vec_sets_ptr() {
let mut vec = Vec::with_capacity(100); vec.extend_from_slice(b"123456789"); let ptr = vec.as_mut_ptr();
let raw_parts = RawParts::from_vec(vec);
assert_eq!(raw_parts.ptr, ptr);
}
#[test]
fn from_vec_sets_length() {
let mut vec = Vec::with_capacity(100); vec.extend_from_slice(b"123456789");
let raw_parts = RawParts::from_vec(vec);
assert_eq!(raw_parts.length, 9);
}
#[test]
fn from_vec_sets_capacity() {
let mut vec = Vec::with_capacity(100); vec.extend_from_slice(b"123456789");
let raw_parts = RawParts::from_vec(vec);
assert_eq!(raw_parts.capacity, 100);
}
}