1 //------------------------------------------------------------------------------
2 // GB_Type_check: print a built-in type
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 // There are two character strings: name passed in from the caller, and
11 // type->name.  The caller can use the name argument to print "the type of
12 // matrix A:", for example.  The internal name is the C typedef with which the
13 // GraphBLAS GrB_Type was created.
14 
15 #include "GB.h"
16 
17 GB_PUBLIC   // accessed by the MATLAB tests in GraphBLAS/Test only
GB_Type_check(const GrB_Type type,const char * name,int pr,FILE * f)18 GrB_Info GB_Type_check      // check a GraphBLAS Type
19 (
20     const GrB_Type type,    // GraphBLAS type to print and check
21     const char *name,       // name of the type from the caller; optional
22     int pr,                 // print level
23     FILE *f                 // file for output
24 )
25 {
26 
27     //--------------------------------------------------------------------------
28     // check inputs
29     //--------------------------------------------------------------------------
30 
31     GBPR0 ("    GraphBLAS type: ") ;
32     if (name != NULL) GBPR0 ("%s ", name) ;
33 
34     if (type == NULL)
35     {
36         GBPR0 ("NULL\n") ;
37         return (GrB_NULL_POINTER) ;
38     }
39 
40     //--------------------------------------------------------------------------
41     // check object
42     //--------------------------------------------------------------------------
43 
44     GB_CHECK_MAGIC (type, "Type") ;
45 
46     switch (type->code)
47     {
48         case GB_BOOL_code   : GBPR0 ("bool"     ) ; break ;
49         case GB_INT8_code   : GBPR0 ("int8_t"   ) ; break ;
50         case GB_UINT8_code  : GBPR0 ("uint8_t"  ) ; break ;
51         case GB_INT16_code  : GBPR0 ("int16_t"  ) ; break ;
52         case GB_UINT16_code : GBPR0 ("uint16_t" ) ; break ;
53         case GB_INT32_code  : GBPR0 ("int32_t"  ) ; break ;
54         case GB_UINT32_code : GBPR0 ("uint32_t" ) ; break ;
55         case GB_INT64_code  : GBPR0 ("int64_t"  ) ; break ;
56         case GB_UINT64_code : GBPR0 ("uint64_t" ) ; break ;
57         case GB_FP32_code   : GBPR0 ("float"    ) ; break ;
58         case GB_FP64_code   : GBPR0 ("double"   ) ; break ;
59         case GB_FC32_code   : GBPR0 ("float complex" ) ; break ;
60         case GB_FC64_code   : GBPR0 ("double complex") ; break ;
61         case GB_UDT_code    : GBPR0 ("user-defined: [%s]", type->name) ; break ;
62         default             : GBPR0 ("unknown type\n") ;
63             return (GrB_INVALID_OBJECT) ;
64     }
65 
66     GBPR0 (" size: %zu\n", type->size) ;
67 
68     if (type->size == 0 || type->size != GB_code_size (type->code, type->size))
69     {
70         GBPR0 ("    Type has an invalid size\n") ;
71         return (GrB_INVALID_OBJECT) ;
72     }
73 
74     return (GrB_SUCCESS) ;
75 }
76 
77