use super::{
ffi,
pool::{Pool, StringId},
};
use std::ptr::NonNull;
#[derive(Copy, Clone, Debug)]
pub struct SolvableId(pub(super) ffi::Id);
impl From<SolvableId> for ffi::Id {
fn from(s: SolvableId) -> Self {
s.0
}
}
impl SolvableId {
pub fn resolve_raw(self, pool: &Pool) -> NonNull<ffi::Solvable> {
let pool = pool.as_ref();
if self.0 < pool.nsolvables {
let solvable_ptr = unsafe { pool.solvables.offset(self.0 as isize) };
NonNull::new(solvable_ptr).expect("solvable ptr was null")
} else {
panic!("invalid solvable id!")
}
}
}
pub fn lookup_num(solvable: *mut ffi::Solvable, key: StringId) -> Option<u64> {
let value = unsafe { ffi::solvable_lookup_num(solvable.cast(), key.0, u64::MAX) };
if value == u64::MAX { None } else { Some(value) }
}
pub fn lookup_id(solvable: *mut ffi::Solvable, key: StringId) -> Option<StringId> {
let value = unsafe { ffi::solvable_lookup_id(solvable.cast(), key.0) };
if value == 0 {
None
} else {
Some(StringId::from_id(value))
}
}