void sparseset_copy (sparseset d, sparseset s) { SPARSESET_ELT_TYPE i; if (d == s) return; sparseset_clear (d); for (i = 0; i < s->members; i++) sparseset_insert_bit (d, s->dense[i], i); d->members = s->members; }
sparseset sparseset_alloc (SPARSESET_ELT_TYPE n_elms) { unsigned int n_bytes = sizeof (struct sparseset_def) + ((n_elms - 1) * 2 * sizeof (SPARSESET_ELT_TYPE)); /* We use xcalloc rather than xmalloc to silence some valgrind uninitialized read errors when accessing set->sparse[n] when "n" is not, and never has been, in the set. These uninitialized reads are expected, by design and harmless. If this turns into a performance problem due to some future additional users of sparseset, we can revisit this decision. */ sparseset set = (sparseset) xcalloc (1, n_bytes); set->dense = &(set->elms[0]); set->sparse = &(set->elms[n_elms]); set->size = n_elms; sparseset_clear (set); return set; }
sparseset sparseset_alloc (SPARSESET_ELT_TYPE n_elms) { unsigned int n_bytes = sizeof (struct sparseset_def) + ((n_elms - 1) * 2 * sizeof (SPARSESET_ELT_TYPE)); sparseset set = XNEWVAR (struct sparseset_def, n_bytes); /* Mark the sparseset as defined to silence some valgrind uninitialized read errors when accessing set->sparse[n] when "n" is not, and never has been, in the set. These uninitialized reads are expected, by design and harmless. */ VALGRIND_DISCARD (VALGRIND_MAKE_MEM_DEFINED (set, n_bytes)); set->dense = &(set->elms[0]); set->sparse = &(set->elms[n_elms]); set->size = n_elms; sparseset_clear (set); return set; }