extern crate alloc;
use core::ptr::NonNull;
use allocator_api2::alloc::AllocError;
use keleusma_arena::{Arena, ArenaHandle, Stale};
#[derive(Debug, Clone, Copy)]
pub struct KString(ArenaHandle<str>);
impl KString {
pub fn alloc(arena: &Arena, s: &str) -> Result<Self, AllocError> {
let bytes = s.as_bytes();
let buffer = arena.alloc_top_bytes(bytes.len())?;
let dst = buffer.as_ptr() as *mut u8;
unsafe { core::ptr::copy_nonoverlapping(bytes.as_ptr(), dst, bytes.len()) };
let raw_slice: *mut [u8] = core::ptr::slice_from_raw_parts_mut(dst, bytes.len());
let raw_str: *mut str = raw_slice as *mut str;
let nn = unsafe { NonNull::new_unchecked(raw_str) };
let handle = unsafe { ArenaHandle::from_raw_parts(nn, arena.epoch()) };
Ok(KString(handle))
}
pub fn get<'a>(&self, arena: &'a Arena) -> Result<&'a str, Stale> {
self.0.get(arena)
}
pub fn epoch(&self) -> u64 {
self.0.epoch()
}
pub fn as_handle(&self) -> &ArenaHandle<str> {
&self.0
}
}