#![allow(non_camel_case_types)]
#![allow(non_snake_case)]
#![allow(clippy::too_many_arguments)]
use std::ffi::c_char;
use std::sync::OnceLock;
use num_complex::{Complex32, Complex64};
pub type SSelectFn2 = unsafe extern "C" fn(ar: *const f32, ai: *const f32) -> i32;
pub type DSelectFn2 = unsafe extern "C" fn(ar: *const f64, ai: *const f64) -> i32;
pub type SSelectFn3 = unsafe extern "C" fn(ar: *const f32, ai: *const f32, b: *const f32) -> i32;
pub type DSelectFn3 = unsafe extern "C" fn(ar: *const f64, ai: *const f64, b: *const f64) -> i32;
pub type CSelectFn1 = unsafe extern "C" fn(w: *const Complex32) -> i32;
pub type ZSelectFn1 = unsafe extern "C" fn(w: *const Complex64) -> i32;
pub type CSelectFn2 = unsafe extern "C" fn(a: *const Complex32, b: *const Complex32) -> i32;
pub type ZSelectFn2 = unsafe extern "C" fn(a: *const Complex64, b: *const Complex64) -> i32;
macro_rules! define_dual_backend {
($name:ident, $lp64_type:ty, $ilp64_type:ty) => {
paste::paste! {
static [<$name:upper _LP64>]: OnceLock<$lp64_type> = OnceLock::new();
static [<$name:upper _ILP64>]: OnceLock<$ilp64_type> = OnceLock::new();
#[no_mangle]
pub unsafe extern "C" fn [<register_ $name _lp64>](f: $lp64_type) -> i32 {
match [<$name:upper _LP64>].set(f) {
Ok(()) => 0,
Err(_) => 2,
}
}
#[no_mangle]
pub unsafe extern "C" fn [<register_ $name _ilp64>](f: $ilp64_type) -> i32 {
match [<$name:upper _ILP64>].set(f) {
Ok(()) => 0,
Err(_) => 2,
}
}
#[allow(dead_code)]
pub enum [<$name:camel Provider>] {
Lp64($lp64_type),
Ilp64($ilp64_type),
}
#[allow(dead_code)]
pub(crate) fn [<get_ $name _for_lp64>]() -> [<$name:camel Provider>] {
if let Some(f) = [<$name:upper _LP64>].get() {
return [<$name:camel Provider>]::Lp64(*f);
}
if let Some(f) = [<$name:upper _ILP64>].get() {
return [<$name:camel Provider>]::Ilp64(*f);
}
panic!(concat!(
"lapack function `", stringify!($name),
"` is not registered (call register_", stringify!($name),
"_lp64 or register_", stringify!($name), "_ilp64 first)"
));
}
#[allow(dead_code)]
pub(crate) fn [<get_ $name _for_ilp64>]() -> [<$name:camel Provider>] {
if let Some(f) = [<$name:upper _ILP64>].get() {
return [<$name:camel Provider>]::Ilp64(*f);
}
if let Some(f) = [<$name:upper _LP64>].get() {
return [<$name:camel Provider>]::Lp64(*f);
}
panic!(concat!(
"lapack function `", stringify!($name),
"` is not registered (call register_", stringify!($name),
"_lp64 or register_", stringify!($name), "_ilp64 first)"
));
}
}
};
}
include!("backend_gen.rs");