use std::{mem, num::NonZero, ops, ptr, str};
use crate::h1::codec::numbers::Wire as _;
pub(super) unsafe fn boxed(value: String) -> Box<str> {
let mut value = mem::ManuallyDrop::new(value);
let bytes = ptr::slice_from_raw_parts_mut(value.as_mut_ptr(), value.len());
unsafe { Box::from_raw(bytes as *mut str) }
}
pub(super) unsafe fn slice(value: &str, range: ops::Range<usize>) -> &str {
unsafe { value.get_unchecked(range) }
}
pub(super) fn decimal(port: NonZero<u16>, digits: &mut [u8; 20]) -> &str {
let bytes = usize::from(port.get()).decimal(digits);
unsafe { str::from_utf8_unchecked(bytes) }
}
pub(super) unsafe fn insert(value: &mut String, at: usize, text: &str) {
unsafe {
let bytes = value.as_mut_vec();
let len = bytes.len();
let out = bytes.as_mut_ptr();
out.add(at + text.len()).copy_from(out.add(at), len - at);
out.add(at)
.copy_from_nonoverlapping(text.as_ptr(), text.len());
bytes.set_len(len + text.len());
}
}