1use std::ptr;
2
3use suitesparse_graphblas_sys::{
4 GrB_DESC_C, GrB_DESC_CT0, GrB_DESC_CT0T1, GrB_DESC_CT1, GrB_DESC_R, GrB_DESC_RC, GrB_DESC_RCT0,
5 GrB_DESC_RCT0T1, GrB_DESC_RCT1, GrB_DESC_RS, GrB_DESC_RSC, GrB_DESC_RSCT0, GrB_DESC_RSCT0T1,
6 GrB_DESC_RSCT1, GrB_DESC_RST0, GrB_DESC_RST0T1, GrB_DESC_RST1, GrB_DESC_RT0, GrB_DESC_RT0T1,
7 GrB_DESC_RT1, GrB_DESC_S, GrB_DESC_SC, GrB_DESC_SCT0, GrB_DESC_SCT0T1, GrB_DESC_SCT1,
8 GrB_DESC_ST0, GrB_DESC_ST0T1, GrB_DESC_ST1, GrB_DESC_T0, GrB_DESC_T0T1, GrB_DESC_T1,
9 GrB_Descriptor,
10};
11
12pub trait GetGraphblasDescriptor {
13 fn graphblas_descriptor(&self) -> GrB_Descriptor;
14}
15
16pub(crate) fn graphblas_descriptor(
17 clear_output_before_use: bool,
18 use_mask_structure_of_stored_values_as_mask: bool,
19 use_mask_complement: bool,
20 transpose_input0: bool,
21 transpose_input1: bool,
22) -> GrB_Descriptor {
23 match (
24 clear_output_before_use,
25 use_mask_structure_of_stored_values_as_mask,
26 use_mask_complement,
27 transpose_input0,
28 transpose_input1,
29 ) {
30 (false, false, false, false, false) => ptr::null_mut(),
31 (false, false, false, false, true) => unsafe { GrB_DESC_T1 },
32 (false, false, false, true, false) => unsafe { GrB_DESC_T0 },
33 (false, false, false, true, true) => unsafe { GrB_DESC_T0T1 },
34 (false, false, true, false, false) => unsafe { GrB_DESC_C },
35 (false, false, true, false, true) => unsafe { GrB_DESC_CT1 },
36 (false, false, true, true, false) => unsafe { GrB_DESC_CT0 },
37 (false, false, true, true, true) => unsafe { GrB_DESC_CT0T1 },
38 (false, true, false, false, false) => unsafe { GrB_DESC_S },
39 (false, true, false, false, true) => unsafe { GrB_DESC_ST1 },
40 (false, true, false, true, false) => unsafe { GrB_DESC_ST0 },
41 (false, true, false, true, true) => unsafe { GrB_DESC_ST0T1 },
42 (false, true, true, false, false) => unsafe { GrB_DESC_SC },
43 (false, true, true, true, false) => unsafe { GrB_DESC_SCT0 },
44 (false, true, true, false, true) => unsafe { GrB_DESC_SCT1 },
45 (false, true, true, true, true) => unsafe { GrB_DESC_SCT0T1 },
46 (true, false, false, false, false) => unsafe { GrB_DESC_R },
47 (true, false, false, false, true) => unsafe { GrB_DESC_RT1 },
48 (true, false, false, true, false) => unsafe { GrB_DESC_RT0 },
49 (true, false, false, true, true) => unsafe { GrB_DESC_RT0T1 },
50 (true, false, true, false, false) => unsafe { GrB_DESC_RC },
51 (true, false, true, false, true) => unsafe { GrB_DESC_RCT1 },
52 (true, false, true, true, false) => unsafe { GrB_DESC_RCT0 },
53 (true, false, true, true, true) => unsafe { GrB_DESC_RCT0T1 },
54 (true, true, false, false, false) => unsafe { GrB_DESC_RS },
55 (true, true, false, false, true) => unsafe { GrB_DESC_RST1 },
56 (true, true, false, true, false) => unsafe { GrB_DESC_RST0 },
57 (true, true, false, true, true) => unsafe { GrB_DESC_RST0T1 },
58 (true, true, true, false, false) => unsafe { GrB_DESC_RSC },
59 (true, true, true, true, false) => unsafe { GrB_DESC_RSCT0 },
60 (true, true, true, false, true) => unsafe { GrB_DESC_RSCT1 },
61 (true, true, true, true, true) => unsafe { GrB_DESC_RSCT0T1 },
62 }
63}