// SPDX-License-Identifier: MIT #ifndef SSET_H #define SSET_H /* * sset.h - an all O(1) implementation of sparse sets as presented in: * "An Efficient Representation for Sparse Sets" * by Preston Briggs and Linda Torczon * * Copyright (C) 2017 - Luc Van Oostenryck */ #include struct sset { unsigned int nbr; unsigned int off; unsigned int size; unsigned int sets[0]; }; extern struct sset *sset_init(unsigned int size, unsigned int off); extern void sset_free(struct sset *s); static inline void sset_reset(struct sset *s) { s->nbr = 0; } static inline void sset_add(struct sset *s, unsigned int idx) { unsigned int __idx = idx - s->off; unsigned int n = s->nbr++; s->sets[__idx] = n; s->sets[s->size + n] = __idx; } static inline bool sset_test(struct sset *s, unsigned int idx) { unsigned int __idx = idx - s->off; unsigned int n = s->sets[__idx]; return (n < s->nbr) && (s->sets[s->size + n] == __idx); } static inline bool sset_testset(struct sset *s, unsigned int idx) { if (sset_test(s, idx)) return true; sset_add(s, idx); return false; } #endif