use crate::token::data::LlamaTokenData;
#[derive(Debug, Clone, PartialEq)]
#[allow(clippy::module_name_repetitions)]
pub struct LlamaTokenDataArray {
pub data: Vec<LlamaTokenData>,
pub sorted: bool,
}
impl LlamaTokenDataArray {
#[must_use]
pub fn new(data: Vec<LlamaTokenData>, sorted: bool) -> Self {
Self { data, sorted }
}
pub fn from_iter<T>(data: T, sorted: bool) -> LlamaTokenDataArray
where
T: IntoIterator<Item = LlamaTokenData>,
{
Self::new(data.into_iter().collect(), sorted)
}
}
impl LlamaTokenDataArray {
pub(crate) unsafe fn modify_as_c_llama_token_data_array(
&mut self,
modify: impl FnOnce(&mut llama_cpp_sys_2::llama_token_data_array),
) {
let size = self.data.len();
let data = self.data.as_mut_ptr().cast();
let mut c_llama_token_data_array = llama_cpp_sys_2::llama_token_data_array {
data,
size,
sorted: self.sorted,
};
modify(&mut c_llama_token_data_array);
assert!(
std::ptr::eq(data, c_llama_token_data_array.data),
"data pointer changed"
);
assert!(c_llama_token_data_array.size <= size, "size increased");
self.data.set_len(c_llama_token_data_array.size);
self.sorted = c_llama_token_data_array.sorted;
}
}