1use crate::prelude_dev::*;
4use core::ffi::c_char;
5use rstsr_lapack_ffi::cblas::{CBLAS_DIAG, CBLAS_LAYOUT, CBLAS_SIDE, CBLAS_TRANSPOSE, CBLAS_UPLO};
6
7pub trait ChangeableDefault {
10 unsafe fn change_default(val: Self);
15 fn get_default() -> Self;
16}
17
18macro_rules! impl_changeable_default {
19 ($struct:ty, $val:ident, $default:expr) => {
20 static mut $val: $struct = $default;
21
22 impl ChangeableDefault for $struct {
23 unsafe fn change_default(val: Self) {
24 $val = val;
25 }
26
27 fn get_default() -> Self {
28 return unsafe { $val };
29 }
30 }
31
32 impl Default for $struct
33 where
34 Self: ChangeableDefault,
35 {
36 fn default() -> Self {
37 <$struct>::get_default()
38 }
39 }
40 };
41}
42
43#[repr(u8)]
60#[derive(Debug, Clone, Copy, PartialEq, Eq)]
61pub enum FlagOrder {
62 C = 101,
64 F = 102,
66}
67
68#[allow(non_upper_case_globals)]
69impl FlagOrder {
70 pub const RowMajor: Self = FlagOrder::C;
71 pub const ColMajor: Self = FlagOrder::F;
72}
73
74#[allow(clippy::derivable_impls)]
75impl Default for FlagOrder {
76 fn default() -> Self {
77 if cfg!(feature = "col_major") {
78 return FlagOrder::F;
79 } else {
80 return FlagOrder::C;
81 }
82 }
83}
84
85#[derive(Debug, Clone, Copy, PartialEq, Eq)]
91pub enum TensorIterOrder {
92 C,
96 F,
100 A,
111 K,
118 G,
123 B,
128}
129
130impl_changeable_default!(TensorIterOrder, DEFAULT_TENSOR_ITER_ORDER, TensorIterOrder::K);
131
132pub mod TensorCopyPolicy {
138 #![allow(non_snake_case)]
139
140 pub type FlagCopy = u8;
144
145 pub const COPY_NEEDED: FlagCopy = 0;
147 pub const COPY_TRUE: FlagCopy = 1;
149 pub const COPY_FALSE: FlagCopy = 2;
151
152 pub const COPY_DEFAULT: FlagCopy = COPY_NEEDED;
153}
154
155#[repr(u8)]
160#[derive(Debug, Clone, Copy, PartialEq, Eq)]
161pub enum FlagTrans {
162 N = 111,
164 T = 112,
166 C = 113,
168 CN = 114,
170}
171
172#[repr(u8)]
173#[derive(Debug, Clone, Copy, PartialEq, Eq)]
174pub enum FlagSide {
175 L = 141,
177 R = 142,
179}
180
181#[repr(u8)]
182#[derive(Debug, Clone, Copy, PartialEq, Eq)]
183pub enum FlagUpLo {
184 U = 121,
186 L = 122,
188}
189
190#[repr(u8)]
191#[derive(Debug, Clone, Copy, PartialEq, Eq)]
192pub enum FlagDiag {
193 N = 131,
195 U = 132,
197}
198
199#[derive(Debug, Clone, Copy, PartialEq, Eq)]
204pub enum FlagSymm {
205 Sy,
207 He,
209 Ay,
211 Ah,
213 N,
215}
216
217pub type TensorOrder = FlagOrder;
218pub type TensorDiag = FlagDiag;
219pub type TensorSide = FlagSide;
220pub type TensorUpLo = FlagUpLo;
221pub type TensorTrans = FlagTrans;
222pub type TensorSymm = FlagSymm;
223
224pub use FlagTrans::C as ConjTrans;
229pub use FlagTrans::N as NoTrans;
230pub use FlagTrans::T as Trans;
231
232pub use FlagSide::L as Left;
233pub use FlagSide::R as Right;
234
235pub use FlagUpLo::L as Lower;
236pub use FlagUpLo::U as Upper;
237
238pub use FlagDiag::N as NonUnit;
239pub use FlagDiag::U as Unit;
240
241pub use FlagOrder::C as RowMajor;
242pub use FlagOrder::F as ColMajor;
243
244impl From<char> for FlagTrans {
249 fn from(val: char) -> Self {
250 match val {
251 'N' | 'n' => FlagTrans::N,
252 'T' | 't' => FlagTrans::T,
253 'C' | 'c' => FlagTrans::C,
254 _ => rstsr_invalid!(val).unwrap(),
255 }
256 }
257}
258
259impl From<FlagTrans> for char {
260 fn from(val: FlagTrans) -> Self {
261 match val {
262 FlagTrans::N => 'N',
263 FlagTrans::T => 'T',
264 FlagTrans::C => 'C',
265 _ => rstsr_invalid!(val).unwrap(),
266 }
267 }
268}
269
270impl From<FlagTrans> for c_char {
271 fn from(val: FlagTrans) -> Self {
272 match val {
273 FlagTrans::N => b'N' as c_char,
274 FlagTrans::T => b'T' as c_char,
275 FlagTrans::C => b'C' as c_char,
276 _ => rstsr_invalid!(val).unwrap(),
277 }
278 }
279}
280
281impl From<c_char> for FlagTrans {
282 fn from(val: c_char) -> Self {
283 match val as u8 {
284 b'N' => FlagTrans::N,
285 b'T' => FlagTrans::T,
286 b'C' => FlagTrans::C,
287 _ => rstsr_invalid!(val).unwrap(),
288 }
289 }
290}
291
292impl From<CBLAS_TRANSPOSE> for FlagTrans {
293 fn from(val: CBLAS_TRANSPOSE) -> Self {
294 match val {
295 CBLAS_TRANSPOSE::CblasNoTrans => FlagTrans::N,
296 CBLAS_TRANSPOSE::CblasTrans => FlagTrans::T,
297 CBLAS_TRANSPOSE::CblasConjTrans => FlagTrans::C,
298 }
299 }
300}
301
302impl From<FlagTrans> for CBLAS_TRANSPOSE {
303 fn from(val: FlagTrans) -> Self {
304 match val {
305 FlagTrans::N => CBLAS_TRANSPOSE::CblasNoTrans,
306 FlagTrans::T => CBLAS_TRANSPOSE::CblasTrans,
307 FlagTrans::C => CBLAS_TRANSPOSE::CblasConjTrans,
308 _ => rstsr_invalid!(val).unwrap(),
309 }
310 }
311}
312
313impl From<char> for FlagDiag {
314 fn from(val: char) -> Self {
315 match val {
316 'N' | 'n' => FlagDiag::N,
317 'U' | 'u' => FlagDiag::U,
318 _ => rstsr_invalid!(val).unwrap(),
319 }
320 }
321}
322
323impl From<FlagDiag> for char {
324 fn from(val: FlagDiag) -> Self {
325 match val {
326 FlagDiag::N => 'N',
327 FlagDiag::U => 'U',
328 }
329 }
330}
331
332impl From<FlagDiag> for c_char {
333 fn from(val: FlagDiag) -> Self {
334 match val {
335 FlagDiag::N => b'N' as c_char,
336 FlagDiag::U => b'U' as c_char,
337 }
338 }
339}
340
341impl From<c_char> for FlagDiag {
342 fn from(val: c_char) -> Self {
343 match val as u8 {
344 b'N' => FlagDiag::N,
345 b'U' => FlagDiag::U,
346 _ => rstsr_invalid!(val).unwrap(),
347 }
348 }
349}
350
351impl From<CBLAS_DIAG> for FlagDiag {
352 fn from(val: CBLAS_DIAG) -> Self {
353 match val {
354 CBLAS_DIAG::CblasNonUnit => FlagDiag::N,
355 CBLAS_DIAG::CblasUnit => FlagDiag::U,
356 }
357 }
358}
359
360impl From<FlagDiag> for CBLAS_DIAG {
361 fn from(val: FlagDiag) -> Self {
362 match val {
363 FlagDiag::N => CBLAS_DIAG::CblasNonUnit,
364 FlagDiag::U => CBLAS_DIAG::CblasUnit,
365 }
366 }
367}
368
369impl From<char> for FlagSide {
370 fn from(val: char) -> Self {
371 match val {
372 'L' | 'l' => FlagSide::L,
373 'R' | 'r' => FlagSide::R,
374 _ => rstsr_invalid!(val).unwrap(),
375 }
376 }
377}
378
379impl From<FlagSide> for char {
380 fn from(val: FlagSide) -> Self {
381 match val {
382 FlagSide::L => 'L',
383 FlagSide::R => 'R',
384 }
385 }
386}
387
388impl From<FlagSide> for c_char {
389 fn from(val: FlagSide) -> Self {
390 match val {
391 FlagSide::L => b'L' as c_char,
392 FlagSide::R => b'R' as c_char,
393 }
394 }
395}
396
397impl From<c_char> for FlagSide {
398 fn from(val: c_char) -> Self {
399 match val as u8 {
400 b'L' => FlagSide::L,
401 b'R' => FlagSide::R,
402 _ => rstsr_invalid!(val).unwrap(),
403 }
404 }
405}
406
407impl From<CBLAS_SIDE> for FlagSide {
408 fn from(val: CBLAS_SIDE) -> Self {
409 match val {
410 CBLAS_SIDE::CblasLeft => FlagSide::L,
411 CBLAS_SIDE::CblasRight => FlagSide::R,
412 }
413 }
414}
415
416impl From<FlagSide> for CBLAS_SIDE {
417 fn from(val: FlagSide) -> Self {
418 match val {
419 FlagSide::L => CBLAS_SIDE::CblasLeft,
420 FlagSide::R => CBLAS_SIDE::CblasRight,
421 }
422 }
423}
424
425impl From<char> for FlagUpLo {
426 fn from(val: char) -> Self {
427 match val {
428 'U' | 'u' => FlagUpLo::U,
429 'L' | 'l' => FlagUpLo::L,
430 _ => rstsr_invalid!(val).unwrap(),
431 }
432 }
433}
434
435impl From<FlagUpLo> for char {
436 fn from(val: FlagUpLo) -> Self {
437 match val {
438 FlagUpLo::U => 'U',
439 FlagUpLo::L => 'L',
440 }
441 }
442}
443
444impl From<FlagUpLo> for c_char {
445 fn from(val: FlagUpLo) -> Self {
446 match val {
447 FlagUpLo::U => b'U' as c_char,
448 FlagUpLo::L => b'L' as c_char,
449 }
450 }
451}
452
453impl From<c_char> for FlagUpLo {
454 fn from(val: c_char) -> Self {
455 match val as u8 {
456 b'U' => FlagUpLo::U,
457 b'L' => FlagUpLo::L,
458 _ => rstsr_invalid!(val).unwrap(),
459 }
460 }
461}
462
463impl From<CBLAS_UPLO> for FlagUpLo {
464 fn from(val: CBLAS_UPLO) -> Self {
465 match val {
466 CBLAS_UPLO::CblasUpper => FlagUpLo::U,
467 CBLAS_UPLO::CblasLower => FlagUpLo::L,
468 }
469 }
470}
471
472impl From<FlagUpLo> for CBLAS_UPLO {
473 fn from(val: FlagUpLo) -> Self {
474 match val {
475 FlagUpLo::U => CBLAS_UPLO::CblasUpper,
476 FlagUpLo::L => CBLAS_UPLO::CblasLower,
477 }
478 }
479}
480
481impl From<CBLAS_LAYOUT> for FlagOrder {
482 fn from(val: CBLAS_LAYOUT) -> Self {
483 match val {
484 CBLAS_LAYOUT::CblasRowMajor => FlagOrder::C,
485 CBLAS_LAYOUT::CblasColMajor => FlagOrder::F,
486 }
487 }
488}
489
490impl From<FlagOrder> for CBLAS_LAYOUT {
491 fn from(val: FlagOrder) -> Self {
492 match val {
493 FlagOrder::C => CBLAS_LAYOUT::CblasRowMajor,
494 FlagOrder::F => CBLAS_LAYOUT::CblasColMajor,
495 }
496 }
497}
498
499impl FlagOrder {
504 pub fn flip(&self) -> Self {
505 match self {
506 FlagOrder::C => FlagOrder::F,
507 FlagOrder::F => FlagOrder::C,
508 }
509 }
510}
511
512impl FlagTrans {
513 pub fn flip(&self, hermi: bool) -> Result<Self> {
514 match self {
515 FlagTrans::N => match hermi {
516 true => Ok(FlagTrans::C),
517 false => Ok(FlagTrans::T),
518 },
519 FlagTrans::T => Ok(FlagTrans::N),
520 FlagTrans::C => Ok(FlagTrans::N),
521 _ => rstsr_invalid!(self)?,
522 }
523 }
524}
525
526impl FlagSide {
527 pub fn flip(&self) -> Result<Self> {
528 match self {
529 FlagSide::L => Ok(FlagSide::R),
530 FlagSide::R => Ok(FlagSide::L),
531 }
532 }
533}
534
535impl FlagUpLo {
536 pub fn flip(&self) -> Result<Self> {
537 match self {
538 FlagUpLo::U => Ok(FlagUpLo::L),
539 FlagUpLo::L => Ok(FlagUpLo::U),
540 }
541 }
542}
543
544