use std::ffi::CString;
use std::ptr;
use onnx_genai_ort_sys as ort;
use onnx_runtime_ir::NodeId;
use super::host::{
HostGraph, HostNode, HostOpAttr, HostOrtValue, HostSupportInfo, HostTensorTypeAndShapeInfo,
HostTypeInfo, HostValueInfo, ort_api,
};
pub(super) fn cstring_lossless(
value: &str,
field: &str,
node_id: NodeId,
) -> std::result::Result<CString, String> {
CString::new(value)
.map_err(|_| format!("{field} on node {node_id:?} contains an interior NUL byte"))
}
pub(super) fn value_ptr(value: &HostValueInfo) -> *const ort::OrtValueInfo {
(value as *const HostValueInfo).cast::<ort::OrtValueInfo>()
}
pub(super) fn node_from_ptr<'a>(node: *const ort::OrtNode) -> &'a HostNode {
unsafe { &*(node.cast::<HostNode>()) }
}
pub(super) fn value_from_ptr<'a>(value: *const ort::OrtValueInfo) -> &'a HostValueInfo {
unsafe { &*(value.cast::<HostValueInfo>()) }
}
pub(super) fn type_info_from_ptr<'a>(type_info: *const ort::OrtTypeInfo) -> &'a HostTypeInfo {
unsafe { &*(type_info.cast::<HostTypeInfo>()) }
}
pub(super) fn tensor_info_from_ptr<'a>(
info: *const ort::OrtTensorTypeAndShapeInfo,
) -> &'a HostTensorTypeAndShapeInfo {
unsafe { &*(info.cast::<HostTensorTypeAndShapeInfo>()) }
}
pub(super) fn ort_value_from_ptr<'a>(value: *const ort::OrtValue) -> &'a HostOrtValue {
unsafe { &*(value.cast::<HostOrtValue>()) }
}
pub(super) fn ort_value_from_mut_ptr<'a>(value: *mut ort::OrtValue) -> &'a mut HostOrtValue {
unsafe { &mut *(value.cast::<HostOrtValue>()) }
}
pub(super) fn attr_from_ptr<'a>(attr: *const ort::OrtOpAttr) -> &'a HostOpAttr {
unsafe { &*(attr.cast::<HostOpAttr>()) }
}
pub(super) fn graph_from_ptr<'a>(graph: *const ort::OrtGraph) -> &'a HostGraph {
unsafe { &*(graph.cast::<HostGraph>()) }
}
pub(super) const MAX_PLUGIN_EP_DEVICES: usize = 16;
pub(super) const MAX_PLUGIN_THREAD_STATES: usize = 64;
pub(super) unsafe fn ep_device_hardware(
device: *mut ort::OrtEpDevice,
) -> *const ort::OrtHardwareDevice {
unsafe {
match (*ort_api()).EpDevice_Device {
Some(accessor) => accessor(device),
None => ptr::null(),
}
}
}
pub(super) unsafe fn ep_device_metadata(
device: *mut ort::OrtEpDevice,
) -> *const ort::OrtKeyValuePairs {
unsafe {
match (*ort_api()).EpDevice_EpMetadata {
Some(accessor) => accessor(device),
None => ptr::null(),
}
}
}
pub(super) fn support_from_ptr<'a>(
support: *mut ort::OrtEpGraphSupportInfo,
) -> &'a mut HostSupportInfo {
unsafe { &mut *(support.cast::<HostSupportInfo>()) }
}