| 12
 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
 
 | //------------------------------------------------------------------------------
// GB_get_mask.h: get the user's mask and handle M->iso
//------------------------------------------------------------------------------
// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2022, All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
//------------------------------------------------------------------------------
#ifndef GB_GET_MASK_H
#define GB_GET_MASK_H
#include "GB_is_nonzero.h"
static inline GrB_Matrix GB_get_mask    // return M_in or NULL
(
    // inputs
    const GrB_Matrix M_in,      // user's input mask
    // input/output
    bool *Mask_comp,            // true if mask is complemented
    bool *Mask_struct           // true if mask is structural
)
{
    if (M_in != NULL && M_in->iso && !(*Mask_struct) &&
        (M_in->type->code != GB_UDT_code))
    {
        // The mask is present, iso, not structural, and does not have
        // a user-defined type.  Convert the mask to a structural mask.
        (*Mask_struct) = true ;
        // check the value of the mask; if M->x [0] is zero, then all entries
        // of M are zero.
        if (GB_is_nonzero ((GB_void *) M_in->x, M_in->type->size))
        { 
            // M->x [0] is nonzero, so M is a structural mask.
            GBURBLE ("(iso mask: struct) ") ;
            return (M_in) ;
        }
        else
        { 
            // M->x [0] is zero, so all entries present in the iso matrix M
            // have the value zero.  This is the same as a matrix M with no
            // entries at all.  If Mask_comp is true, this is the same as no
            // mask at all, with Mask_comp being false.  If Mask_comp is false,
            // then this is the same as no mask, complemented (the "quick mask"
            // case).
            GBURBLE ("(iso mask: all zero) ") ;
            (*Mask_comp) = !(*Mask_comp) ;
            return (NULL) ;
        }
    }
    else
    { 
        // no change to M_in, Mask_struct, or Mask_comp
        return (M_in) ;
    }
}
#endif
 |