1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|
//------------------------------------------------------------------------------
// GB_code_check: print an entry using a type code
//------------------------------------------------------------------------------
// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2022, All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
//------------------------------------------------------------------------------
// Only prints entries of built-in types; user-defined types can't be printed.
// Entries are always printed if this function is called
#include "GB.h"
#define GB_PRINT_INF(x) GBPR ((x < 0) ? "-Inf" : "Inf")
#define GB_PRINT_FLOAT(s) \
{ \
switch (fpclassify (s)) \
{ \
case FP_NAN: GBPR ("NaN") ; break ; \
case FP_INFINITE: GB_PRINT_INF (s) ; break ; \
case FP_ZERO: GBPR ("0") ; break ; \
default: GBPR ("%.6g", (double) s) ; \
} \
}
#define GB_PRINT_DOUBLE(d,pr_verbose) \
{ \
switch (fpclassify (d)) \
{ \
case FP_NAN: GBPR ("NaN") ; break ; \
case FP_INFINITE: GB_PRINT_INF (d) ; break ; \
case FP_ZERO: GBPR ("0") ; break ; \
default: \
if (pr_verbose) \
{ \
/* long format */ \
GBPR ("%.15g", d) ; \
} \
else \
{ \
/* short format */ \
GBPR ("%.6g", d) ; \
} \
break ; \
} \
}
GB_PUBLIC
GrB_Info GB_code_check // print an entry using a type code
(
const GB_Type_code code, // type code of value to print
const void *x, // entry to print
int pr, // print level
FILE *f // file to print to
)
{
ASSERT (code <= GB_UDT_code) ;
int64_t i ;
uint64_t u ;
double d ;
float s ;
GxB_FC32_t c ;
GxB_FC64_t z ;
bool pr_verbose = (pr == GxB_SHORT_VERBOSE || pr == GxB_COMPLETE_VERBOSE) ;
switch (code)
{
case GB_BOOL_code : i = *((bool *) x) ; GBPR (" " GBd, i) ;
break ;
case GB_INT8_code : i = *((int8_t *) x) ; GBPR (" " GBd, i) ;
break ;
case GB_UINT8_code : u = *((uint8_t *) x) ; GBPR (" " GBu, u) ;
break ;
case GB_INT16_code : i = *((int16_t *) x) ; GBPR (" " GBd, i) ;
break ;
case GB_UINT16_code : u = *((uint16_t *) x) ; GBPR (" " GBu, u) ;
break ;
case GB_INT32_code : i = *((int32_t *) x) ; GBPR (" " GBd, i) ;
break ;
case GB_UINT32_code : u = *((uint32_t *) x) ; GBPR (" " GBu, u) ;
break ;
case GB_INT64_code : i = *((int64_t *) x) ; GBPR (" " GBd, i) ;
break ;
case GB_UINT64_code : u = *((uint64_t *) x) ; GBPR (" " GBu, u) ;
break ;
case GB_FP32_code :
s = *((float *) x) ;
GBPR (" ") ;
GB_PRINT_FLOAT (s) ;
break ;
case GB_FP64_code :
d = *((double *) x) ;
GBPR (" ") ;
GB_PRINT_DOUBLE (d, pr_verbose) ;
break ;
case GB_FC32_code :
c = *((GxB_FC32_t *) x) ;
GBPR (" ") ;
GB_PRINT_FLOAT (crealf (c)) ;
s = cimagf (c) ;
if (s < 0)
{
GBPR (" - ") ;
GB_PRINT_FLOAT (-s) ;
}
else
{
GBPR (" + ") ;
GB_PRINT_FLOAT (s) ;
}
GBPR ("i") ;
break ;
case GB_FC64_code :
z = *((GxB_FC64_t *) x) ;
GBPR (" ") ;
GB_PRINT_DOUBLE (creal (z), pr_verbose) ;
d = cimag (z) ;
if (d < 0)
{
GBPR (" - ") ;
GB_PRINT_DOUBLE (-d, pr_verbose) ;
}
else
{
GBPR (" + ") ;
GB_PRINT_DOUBLE (d, pr_verbose) ;
}
GBPR ("i") ;
break ;
case GB_UDT_code :
{
GBPR ("[user-defined value]") ;
// FUTURE: GraphBLAS does not have a method for the user to
// register a print function for a user-defined type.
}
break ;
default: ;
}
return (GrB_SUCCESS) ;
}
|