#ifndef SSET_H
#define SSET_H
#include <stdbool.h>
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