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