use std::fmt::Debug;
use std::fmt::Display;
use std::mem::ManuallyDrop;
pub mod data;
pub mod data_array;
#[repr(transparent)]
#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
#[allow(clippy::module_name_repetitions)]
pub struct LlamaToken(pub llama_cpp_sys_4::llama_token);
impl Display for LlamaToken {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}
impl LlamaToken {
#[must_use]
pub fn new(token_id: i32) -> Self {
Self(token_id)
}
}
#[must_use]
pub fn from_vec_token_sys(vec_sys: Vec<llama_cpp_sys_4::llama_token>) -> Vec<LlamaToken> {
let mut vec_sys = ManuallyDrop::new(vec_sys);
let ptr = vec_sys.as_mut_ptr().cast::<LlamaToken>();
unsafe { Vec::from_raw_parts(ptr, vec_sys.len(), vec_sys.capacity()) }
}
#[must_use]
pub fn to_vec_token_sys(vec_llama: Vec<LlamaToken>) -> Vec<llama_cpp_sys_4::llama_token> {
let mut vec_llama = ManuallyDrop::new(vec_llama);
let ptr = vec_llama
.as_mut_ptr()
.cast::<llama_cpp_sys_4::llama_token>();
unsafe { Vec::from_raw_parts(ptr, vec_llama.len(), vec_llama.capacity()) }
}
#[cfg(test)]
mod tests {
use super::*;
use std::time::Instant;
#[test]
fn test_new_llama_token() {
let token = LlamaToken::new(42);
assert_eq!(token, LlamaToken(42)); }
#[test]
fn test_llama_token_display() {
let token = LlamaToken::new(99);
assert_eq!(format!("{}", token), "99"); }
#[test]
fn test_from_vec_token_sys() {
let vec_sys: Vec<llama_cpp_sys_4::llama_token> = vec![1, 2, 3];
let vec_llama = from_vec_token_sys(vec_sys);
assert_eq!(vec_llama.len(), 3);
assert_eq!(vec_llama[0], LlamaToken(1));
assert_eq!(vec_llama[1], LlamaToken(2));
assert_eq!(vec_llama[2], LlamaToken(3));
}
#[test]
fn test_to_vec_token_sys() {
let vec_llama = vec![LlamaToken(10), LlamaToken(20), LlamaToken(30)];
let vec_sys = to_vec_token_sys(vec_llama);
assert_eq!(vec_sys.len(), 3);
assert_eq!(vec_sys[0], 10);
assert_eq!(vec_sys[1], 20);
assert_eq!(vec_sys[2], 30);
}
#[test]
fn benchmark_to_vec_token_sys() {
let vec_llama: Vec<LlamaToken> = (0..100_000).map(LlamaToken::new).collect();
let start = Instant::now();
let _vec_sys = to_vec_token_sys(vec_llama);
let duration = start.elapsed();
println!(
"Time taken to convert Vec<LlamaToken> to Vec<llama_token>: {:?}",
duration
);
assert!(duration.as_micros() < 1_000); }
}