use core::ffi::c_char;
use super::BlasError;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum Transpose {
None,
Transpose,
ConjugateTranspose,
}
#[allow(dead_code)]
impl Transpose {
pub(crate) fn real_character(self, operation: &'static str) -> Result<c_char, BlasError> {
match self {
Self::None => Ok(b'N' as c_char),
Self::Transpose => Ok(b'T' as c_char),
Self::ConjugateTranspose => Err(BlasError::UnsupportedTranspose {
operation,
transpose: self,
}),
}
}
pub(crate) fn is_transposed(self) -> bool {
!matches!(self, Self::None)
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum Triangle {
Upper,
Lower,
}
#[allow(dead_code)]
impl Triangle {
pub(crate) fn character(self) -> c_char {
match self {
Self::Upper => b'U' as c_char,
Self::Lower => b'L' as c_char,
}
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum Diagonal {
Unit,
NonUnit,
}
#[allow(dead_code)]
impl Diagonal {
pub(crate) fn character(self) -> c_char {
match self {
Self::Unit => b'U' as c_char,
Self::NonUnit => b'N' as c_char,
}
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum Side {
Left,
Right,
}
#[allow(dead_code)]
impl Side {
pub(crate) fn character(self) -> c_char {
match self {
Self::Left => b'L' as c_char,
Self::Right => b'R' as c_char,
}
}
}
#[cfg(test)]
mod tests {
use super::{Diagonal, Side, Transpose, Triangle};
use crate::blas::BlasError;
#[test]
fn real_selectors_reject_conjugate_transpose() {
assert_eq!(Transpose::None.real_character("DGEMM"), Ok(b'N' as i8));
assert_eq!(Transpose::Transpose.real_character("DGEMM"), Ok(b'T' as i8));
assert!(matches!(
Transpose::ConjugateTranspose.real_character("DGEMM"),
Err(BlasError::UnsupportedTranspose { .. })
));
assert_eq!(Triangle::Upper.character(), b'U' as i8);
assert_eq!(Diagonal::Unit.character(), b'U' as i8);
assert_eq!(Side::Right.character(), b'R' as i8);
}
}