use std::ptr;
use crate::c_invalid_arg;
use crate::scalar_type_c::scalar_type_to_i32;
use crate::tensor::Tensor;
#[unsafe(no_mangle)]
pub unsafe extern "C" fn diffsol_tensor_free(tensor: *mut Tensor) {
if tensor.is_null() {
c_invalid_arg!("tensor is null");
return;
}
unsafe {
drop(Box::from_raw(tensor));
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn diffsol_tensor_ptr(tensor: *const Tensor) -> *const u8 {
if tensor.is_null() {
c_invalid_arg!("tensor is null");
return ptr::null();
}
let tensor = unsafe { &*tensor };
tensor.data_ptr()
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn diffsol_tensor_ndim(tensor: *const Tensor) -> usize {
if tensor.is_null() {
c_invalid_arg!("tensor is null");
return 0;
}
let tensor = unsafe { &*tensor };
tensor.shape().len()
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn diffsol_tensor_dim(tensor: *const Tensor, index: usize) -> usize {
if tensor.is_null() {
c_invalid_arg!("tensor is null");
return 0;
}
let tensor = unsafe { &*tensor };
tensor.shape().get(index).copied().unwrap_or(0)
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn diffsol_tensor_stride(tensor: *const Tensor, index: usize) -> usize {
if tensor.is_null() {
c_invalid_arg!("tensor is null");
return 0;
}
let tensor = unsafe { &*tensor };
tensor.strides().get(index).copied().unwrap_or(0)
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn diffsol_tensor_dtype(tensor: *const Tensor) -> i32 {
if tensor.is_null() {
c_invalid_arg!("tensor is null");
return -1;
}
let tensor = unsafe { &*tensor };
scalar_type_to_i32(tensor.dtype())
}