File: GB_scalar.h

package info (click to toggle)
suitesparse-graphblas 7.4.0%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 67,112 kB
  • sloc: ansic: 1,072,243; cpp: 8,081; sh: 512; makefile: 506; asm: 369; python: 125; awk: 10
file content (44 lines) | stat: -rw-r--r-- 2,107 bytes parent folder | download | duplicates (3)
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
//------------------------------------------------------------------------------
// GB_scalar.h: definitions for GrB_Scalar
//------------------------------------------------------------------------------

// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2022, All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

//------------------------------------------------------------------------------

#ifndef GB_SCALAR_H
#define GB_SCALAR_H

GrB_Scalar GB_Scalar_wrap   // create a new GrB_Scalar with one entry
(
    GrB_Scalar s,           // GrB_Scalar to create
    GrB_Type type,          // type of GrB_Scalar to create
    void *Sx                // becomes S->x, an array of size 1 * type->size
) ;

// stype can be NULL if op is positional

// wrap a bare scalar inside a statically-allocated GrB_Scalar
#define GB_SCALAR_WRAP(scalar,bare,stype)                                   \
    struct GB_Scalar_opaque scalar ## _header ;                             \
    size_t ssize = (stype == NULL) ? 1 : (stype->size) ;                    \
    GB_void Sx [GB_VLA(ssize)] ;                                            \
    GrB_Scalar scalar = GB_Scalar_wrap (& scalar ## _header, stype, Sx) ;   \
    memcpy (Sx, &bare, ssize) ;

// wrap a void *bare scalar inside a statically-allocated GrB_Scalar
#define GB_SCALAR_WRAP_UDT(scalar,bare,scalar_type)                         \
    GrB_Type stype = scalar_type ;                                          \
    struct GB_Scalar_opaque scalar ## _header ;                             \
    size_t ssize = (stype == NULL) ? 1 : (stype->size) ;                    \
    GB_void Sx [GB_VLA(ssize)] ;                                            \
    GrB_Scalar scalar = NULL ;                                              \
    if (bare != NULL && stype != NULL)                                      \
    {                                                                       \
        scalar = GB_Scalar_wrap (& scalar ## _header, stype, Sx) ;          \
        memcpy (Sx, bare, ssize) ;                                          \
    }

#endif