Skip to main content

llama_cpp_bindings/model/params/
kv_override_value_iterator.rs

1use std::ffi::{CStr, CString};
2use std::fmt::Debug;
3
4use crate::model::params::LlamaModelParams;
5use crate::model::params::param_override_value::ParamOverrideValue;
6
7#[derive(Debug)]
8pub struct KvOverrideValueIterator<'model_params> {
9    model_params: &'model_params LlamaModelParams,
10    current: usize,
11}
12
13impl<'model_params> KvOverrideValueIterator<'model_params> {
14    #[must_use]
15    pub const fn new(model_params: &'model_params LlamaModelParams) -> Self {
16        Self {
17            model_params,
18            current: 0,
19        }
20    }
21}
22
23impl Iterator for KvOverrideValueIterator<'_> {
24    type Item = (CString, ParamOverrideValue);
25
26    fn next(&mut self) -> Option<Self::Item> {
27        let overrides = self.model_params.params.kv_overrides;
28
29        if overrides.is_null() {
30            return None;
31        }
32
33        loop {
34            // SAFETY: llama.cpp guarantees the last element contains an empty key.
35            let current = unsafe { *overrides.add(self.current) };
36
37            if current.key[0] == 0 {
38                return None;
39            }
40
41            self.current += 1;
42
43            if let Ok(value) = ParamOverrideValue::try_from(&current) {
44                let key = unsafe { CStr::from_ptr(current.key.as_ptr()).to_owned() };
45
46                return Some((key, value));
47            }
48        }
49    }
50}