use o3::alloc::{self, array};
pub(super) unsafe fn normalize<'a>(
plan: array::Plan<u8, usize>,
prefix: &str,
path_len: usize,
segments: impl Iterator<Item = &'a str>,
query: &str,
) -> Result<String, alloc::Exhausted> {
let len = *plan.extent();
let mut bytes = plan.try_vec()?;
let out = bytes.as_mut_ptr();
let mut end = prefix.len() + path_len;
unsafe {
out.copy_from_nonoverlapping(prefix.as_ptr(), prefix.len());
out.add(end)
.copy_from_nonoverlapping(query.as_ptr(), query.len());
for segment in segments {
end -= segment.len();
out.add(end)
.copy_from_nonoverlapping(segment.as_ptr(), segment.len());
end -= 1;
out.add(end).write(b'/');
}
bytes.set_len(len);
Ok(String::from_utf8_unchecked(bytes))
}
}