pub mod bridge;
pub mod ts;
pub mod pvec;
use crate::core::*;
use crate::w32a::utl::l;
use std::{ffi};
#[macro_export]
macro_rules! isnull {
($r:expr) => { $r == std::ptr::null_mut() };
}
pub use isnull;
#[macro_export]
macro_rules! failed {
($hr:expr) => { $hr.is_err() };
}
pub use failed;
#[macro_export]
macro_rules! cast_any {
($t:ty, $f:ty, $o:expr) => { (*(&$o as *const $f as *const $t)) };
}
pub use cast_any;
#[macro_export]
macro_rules! cast_any_mut {
($t:ty, $f:ty, $o:expr) => { (*(&mut $o as *mut $f as *mut $t)) };
}
pub use cast_any_mut;
pub type Voidp = *const ffi::c_void;
pub type VoidpMut = *mut ffi::c_void;
pub struct TVoidp<T>(pub T);
impl<T> Into<Voidp> for TVoidp<T> {
#[inline]
fn into(self) -> Voidp {
unsafe {
cast_any!(Voidp, T, self.0)
}
}
}
#[inline]
pub fn voidp<T>(p: T) -> Voidp { TVoidp(p).into() }
pub struct TVoidpMut<T>(pub T);
impl<T> Into<VoidpMut> for TVoidpMut<T> {
#[inline]
fn into(mut self) -> VoidpMut {
unsafe {
cast_any_mut!(VoidpMut, T, self.0)
}
}
}
#[inline]
pub fn voidp_mut<T>(p: T) -> VoidpMut { TVoidpMut(p).into() }
#[inline]
pub fn from_voidp<T: Clone>(p: Voidp) -> T {
unsafe{
cast_any!(T, Voidp, p).clone()
}
}
#[inline]
pub fn from_voidp_mut<T: Clone>(mut p: VoidpMut) -> T {
unsafe{
cast_any_mut!(T, VoidpMut, p).clone()
}
}
pub fn init_log(f: &str) {
unsafe {
initLog(&l(f)[0]);
}
}
pub fn out_log(f: &str, s: &str) {
unsafe {
outLog(&l(f)[0], &l("%s")[0], &l(s)[0]); }
}
pub fn ref_c_u8z(p: &*const u8, sz: usize) -> &[u8] {
let e = unsafe { std::slice::from_raw_parts(*p, sz) };
let sz = (0..sz).into_iter().map_while(|i|
if e[i] != b'\0' { Some(1) } else { None }).sum();
&e[..sz]
}
pub fn copy_bytes(u: *mut u8, l: usize, s: String) -> usize {
let o = unsafe { std::slice::from_raw_parts_mut(u, l) };
for i in 0..s.len() { o[i] = s.as_bytes()[i]; }
o[s.len()] = b'\0';
s.len()
}
#[unsafe(no_mangle)]
pub extern "C" fn cb_u64(u: *mut u8, l: usize, p: *mut DispMatParam) -> usize {
unsafe {
let q = std::slice::from_raw_parts(
(*p).m as *const u64, (*p).rows * (*p).cols); let d = q[(*p).cols * (*p).r + (*p).c]; let s = format!("{:di$}", d, di=(*p).di);
copy_bytes(u, l, s)
}
}
#[unsafe(no_mangle)]
pub extern "C" fn cb_u32(u: *mut u8, l: usize, p: *mut DispMatParam) -> usize {
unsafe {
let q = std::slice::from_raw_parts(
(*p).m as *const u32, (*p).rows * (*p).cols); let d = q[(*p).cols * (*p).r + (*p).c]; let s = format!("{:di$}", d, di=(*p).di);
copy_bytes(u, l, s)
}
}
#[unsafe(no_mangle)]
pub extern "C" fn cb_i64(u: *mut u8, l: usize, p: *mut DispMatParam) -> usize {
unsafe {
let q = std::slice::from_raw_parts(
(*p).m as *const i64, (*p).rows * (*p).cols); let d = q[(*p).cols * (*p).r + (*p).c]; let s = format!("{:di$}", d, di=(*p).di);
copy_bytes(u, l, s)
}
}
#[unsafe(no_mangle)]
pub extern "C" fn cb_i32(u: *mut u8, l: usize, p: *mut DispMatParam) -> usize {
unsafe {
let q = std::slice::from_raw_parts(
(*p).m as *const i32, (*p).rows * (*p).cols); let d = q[(*p).cols * (*p).r + (*p).c]; let s = format!("{:di$}", d, di=(*p).di);
copy_bytes(u, l, s)
}
}
#[unsafe(no_mangle)]
pub extern "C" fn cb_f32(u: *mut u8, l: usize, p: *mut DispMatParam) -> usize {
unsafe {
let q = std::slice::from_raw_parts(
(*p).m as *const f32, (*p).rows * (*p).cols); let f = q[(*p).cols * (*p).r + (*p).c]; let s = format!("{:di$.df$}", f, di=(*p).di, df=(*p).df);
copy_bytes(u, l, s)
}
}