use std::{ marker::PhantomData, mem::{self, MaybeUninit}, ops::Deref, ptr::{addr_of, NonNull}, }; use crate::rules::path_value::Location; #[allow(clippy::unsafe_removed_from_name)] use unsafe_libyaml as sys; pub(crate) struct Owned { ptr: NonNull, marker: PhantomData>, } impl Owned { pub fn new_uninit() -> Owned, T> { // FIXME: use Box::new_uninit when stable let boxed = Box::new(MaybeUninit::::uninit()); Owned { ptr: unsafe { NonNull::new_unchecked(Box::into_raw(boxed)) }, marker: PhantomData, } } pub unsafe fn assume_init(definitely_init: Owned, T>) -> Owned { let ptr = definitely_init.ptr; mem::forget(definitely_init); Owned { ptr: ptr.cast(), marker: PhantomData, } } } #[repr(transparent)] pub(crate) struct InitPtr { pub ptr: *mut T, } impl Deref for Owned { type Target = InitPtr; fn deref(&self) -> &Self::Target { unsafe { &*addr_of!(self.ptr).cast::>() } } } impl Drop for Owned { fn drop(&mut self) { let _ = unsafe { Box::from_raw(self.ptr.as_ptr()) }; } } pub(crate) fn system_mark_to_location(mark: sys::yaml_mark_t) -> Location { Location { line: mark.line as usize, col: mark.column as usize, } }