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
|
//------------------------------------------------------------------------------
// GB_Scalar_extractElement_template: x = S
//------------------------------------------------------------------------------
// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2022, All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
//------------------------------------------------------------------------------
// Extract the value of single scalar, x = S, typecasting from the
// type of S to the type of x, as needed.
// Returns GrB_SUCCESS if the GrB_Scalar entry is present, and sets x to its
// value. Returns GrB_NO_VALUE if the GrB_Scalar is not present, and x is
// unmodified.
// This template constructs GrB_Scalar_extractElement_[TYPE] for each of the
// 13 built-in types, and the _UDT method for all user-defined types.
GrB_Info GB_EXTRACT_ELEMENT // extract a single entry from S
(
GB_XTYPE *x, // scalar to extract, not modified if not found
const GrB_Scalar S // GrB_Scalar to extract a scalar from
)
{
//--------------------------------------------------------------------------
// check inputs
//--------------------------------------------------------------------------
GB_RETURN_IF_NULL_OR_FAULTY (S) ;
GB_RETURN_IF_NULL (x) ;
// delete any lingering zombies, assemble any pending tuples, and unjumble
if (GB_ANY_PENDING_WORK (S))
{
// extract scalar with pending tuples or zombies. It cannot be
// actually jumbled, but S->jumbled might true anyway.
GrB_Info info ;
GB_WHERE1 (GB_WHERE_STRING) ;
GB_BURBLE_START ("GrB_Scalar_extractElement") ;
GB_OK (GB_wait ((GrB_Matrix) S, "s", Context)) ;
GB_BURBLE_END ;
}
ASSERT (!GB_ANY_PENDING_WORK (S)) ;
// GB_XCODE and S must be compatible
GB_Type_code scode = S->type->code ;
if (!GB_code_compatible (GB_XCODE, scode))
{
return (GrB_DOMAIN_MISMATCH) ;
}
if (GB_nnz ((GrB_Matrix) S) == 0 // empty
|| (S->p != NULL && S->p [1] == 0) // sparse/hyper with no entry
|| (S->b != NULL && S->b [0] == 0)) // bitmap with no entry
{
// quick return
return (GrB_NO_VALUE) ;
}
//--------------------------------------------------------------------------
// extract the scalar
//--------------------------------------------------------------------------
#if !defined ( GB_UDT_EXTRACT )
if (GB_XCODE == scode)
{
// copy S into x, no typecasting, for built-in types only.
GB_XTYPE *restrict Sx = ((GB_XTYPE *) (S->x)) ;
(*x) = Sx [0] ;
}
else
#endif
{
// typecast S into x
GB_cast_scalar (x, GB_XCODE, S->x, scode, S->type->size) ;
}
#pragma omp flush
return (GrB_SUCCESS) ;
}
#undef GB_UDT_EXTRACT
#undef GB_EXTRACT_ELEMENT
#undef GB_XTYPE
#undef GB_XCODE
|