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/// An iterator over the key-value overrides for a model.
8#[derive(Debug)]
9pub struct KvOverrideValueIterator<'model_params> {
10    model_params: &'model_params LlamaModelParams,
11    current: usize,
12}
13
14impl<'model_params> KvOverrideValueIterator<'model_params> {
15    #[must_use]
16    pub const fn new(model_params: &'model_params LlamaModelParams) -> Self {
17        Self {
18            model_params,
19            current: 0,
20        }
21    }
22}
23
24impl Iterator for KvOverrideValueIterator<'_> {
25    type Item = (CString, ParamOverrideValue);
26
27    fn next(&mut self) -> Option<Self::Item> {
28        let overrides = self.model_params.params.kv_overrides;
29
30        if overrides.is_null() {
31            return None;
32        }
33
34        loop {
35            // SAFETY: llama.cpp guarantees the last element contains an empty key.
36            // We've checked the previous one in the last iteration, the next one
37            // should be valid or 0 (and thus safe to deref).
38            let current = unsafe { *overrides.add(self.current) };
39
40            if current.key[0] == 0 {
41                return None;
42            }
43
44            self.current += 1;
45
46            if let Ok(value) = ParamOverrideValue::try_from(&current) {
47                let key = unsafe { CStr::from_ptr(current.key.as_ptr()).to_owned() };
48
49                return Some((key, value));
50            }
51        }
52    }
53}