1 //------------------------------------------------------------------------------
2 // GxB_Desc_get: get a field in a descriptor
3 //------------------------------------------------------------------------------
4 
5 // SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2021, All Rights Reserved.
6 // SPDX-License-Identifier: Apache-2.0
7 
8 //------------------------------------------------------------------------------
9 
10 #include "GB.h"
11 
GxB_Desc_get(GrB_Descriptor desc,GrB_Desc_Field field,...)12 GrB_Info GxB_Desc_get           // get a parameter from a descriptor
13 (
14     GrB_Descriptor desc,        // descriptor to query; NULL is ok
15     GrB_Desc_Field field,       // parameter to query
16     ...                         // return value of the descriptor
17 )
18 {
19 
20     //--------------------------------------------------------------------------
21     // check inputs
22     //--------------------------------------------------------------------------
23 
24     GB_WHERE1 ("GxB_Desc_get (desc, field, &value)") ;
25     GB_RETURN_IF_FAULTY (desc) ;
26 
27     //--------------------------------------------------------------------------
28     // get the parameter
29     //--------------------------------------------------------------------------
30 
31     va_list ap ;
32 
33     switch (field)
34     {
35         case GrB_OUTP :
36 
37             {
38                 va_start (ap, field) ;
39                 GrB_Desc_Value *value = va_arg (ap, GrB_Desc_Value *) ;
40                 va_end (ap) ;
41                 GB_RETURN_IF_NULL (value) ;
42                 (*value) = (desc == NULL) ? GxB_DEFAULT : desc->out ;
43             }
44             break ;
45 
46         case GrB_MASK :
47 
48             {
49                 va_start (ap, field) ;
50                 GrB_Desc_Value *value = va_arg (ap, GrB_Desc_Value *) ;
51                 va_end (ap) ;
52                 GB_RETURN_IF_NULL (value) ;
53                 (*value) = (desc == NULL) ? GxB_DEFAULT : desc->mask ;
54             }
55             break ;
56 
57         case GrB_INP0 :
58 
59             {
60                 va_start (ap, field) ;
61                 GrB_Desc_Value *value = va_arg (ap, GrB_Desc_Value *) ;
62                 va_end (ap) ;
63                 GB_RETURN_IF_NULL (value) ;
64                 (*value) = (desc == NULL) ? GxB_DEFAULT : desc->in0 ;
65             }
66             break ;
67 
68         case GrB_INP1 :
69 
70             {
71                 va_start (ap, field) ;
72                 GrB_Desc_Value *value = va_arg (ap, GrB_Desc_Value *) ;
73                 va_end (ap) ;
74                 GB_RETURN_IF_NULL (value) ;
75                 (*value) = (desc == NULL) ? GxB_DEFAULT : desc->in1 ;
76             }
77             break ;
78 
79         case GxB_DESCRIPTOR_NTHREADS :  // same as GxB_NTHREADS
80 
81             {
82                 va_start (ap, field) ;
83                 int *nthreads = va_arg (ap, int *) ;
84                 va_end (ap) ;
85                 GB_RETURN_IF_NULL (nthreads) ;
86                 int nth = (desc == NULL) ? GxB_DEFAULT : desc->nthreads_max ;
87                 (*nthreads) = nth ;
88             }
89             break ;
90 
91         case GxB_DESCRIPTOR_CHUNK :     // same as GxB_CHUNK
92 
93             {
94                 va_start (ap, field) ;
95                 double *chunk = va_arg (ap, double *) ;
96                 va_end (ap) ;
97                 GB_RETURN_IF_NULL (chunk) ;
98                 (*chunk) = (desc == NULL) ? GxB_DEFAULT : desc->chunk ;
99             }
100             break ;
101 
102         case GxB_AxB_METHOD :
103 
104             {
105                 va_start (ap, field) ;
106                 GrB_Desc_Value *value = va_arg (ap, GrB_Desc_Value *) ;
107                 va_end (ap) ;
108                 GB_RETURN_IF_NULL (value) ;
109                 (*value) = (desc == NULL) ? GxB_DEFAULT : desc->axb ;
110             }
111             break ;
112 
113         case GxB_SORT :
114 
115             {
116                 va_start (ap, field) ;
117                 int *do_sort = va_arg (ap, int *) ;
118                 va_end (ap) ;
119                 GB_RETURN_IF_NULL (do_sort) ;
120                 int s = (desc == NULL) ? GxB_DEFAULT : desc->do_sort ;
121                 (*do_sort) = s ;
122             }
123             break ;
124 
125         default :
126 
127             return (GrB_INVALID_VALUE) ;
128     }
129 
130     return (GrB_SUCCESS) ;
131 }
132 
133