diffsol_c/
host_array_c.rs1use std::ptr;
2
3use crate::c_invalid_arg;
4use crate::host_array::HostArray;
5use crate::scalar_type_c::{scalar_type_from_i32, scalar_type_to_i32};
6
7#[unsafe(no_mangle)]
13pub unsafe extern "C" fn diffsol_host_array_alloc_vector(len: usize, dtype: i32) -> *mut HostArray {
14 let dtype = match scalar_type_from_i32(dtype) {
15 Some(value) => value,
16 None => {
17 c_invalid_arg!("invalid dtype");
18 return ptr::null_mut();
19 }
20 };
21 let array = HostArray::alloc_vector(len, dtype);
22 Box::into_raw(Box::new(array))
23}
24
25#[unsafe(no_mangle)]
31pub unsafe extern "C" fn diffsol_host_array_free(array: *mut HostArray) {
32 if array.is_null() {
33 c_invalid_arg!("host array is null");
34 return;
35 }
36 unsafe {
37 drop(Box::from_raw(array));
38 }
39}
40
41#[unsafe(no_mangle)]
47pub unsafe extern "C" fn diffsol_host_array_ptr(array: *const HostArray) -> *const u8 {
48 if array.is_null() {
49 c_invalid_arg!("host array is null");
50 return ptr::null();
51 }
52 let array = unsafe { &*array };
53 array.data_ptr()
54}
55
56#[unsafe(no_mangle)]
61pub unsafe extern "C" fn diffsol_host_array_ndim(array: *const HostArray) -> usize {
62 if array.is_null() {
63 c_invalid_arg!("host array is null");
64 return 0;
65 }
66 let array = unsafe { &*array };
67 array.ndim()
68}
69
70#[unsafe(no_mangle)]
76pub unsafe extern "C" fn diffsol_host_array_dim(array: *const HostArray, index: usize) -> usize {
77 if array.is_null() {
78 c_invalid_arg!("host array is null");
79 return 0;
80 }
81 let array = unsafe { &*array };
82 array.dim(index)
83}
84
85#[unsafe(no_mangle)]
91pub unsafe extern "C" fn diffsol_host_array_stride(array: *const HostArray, index: usize) -> usize {
92 if array.is_null() {
93 c_invalid_arg!("host array is null");
94 return 0;
95 }
96 let array = unsafe { &*array };
97 array.stride(index)
98}
99
100#[unsafe(no_mangle)]
105pub unsafe extern "C" fn diffsol_host_array_dtype(array: *const HostArray) -> i32 {
106 if array.is_null() {
107 c_invalid_arg!("host array is null");
108 return -1;
109 }
110 let array = unsafe { &*array };
111 scalar_type_to_i32(array.dtype())
112}