#ifndef _SET4_H_
#define _SET4_H_
#ifdef __cplusplus
extern "C" {
#endif
#define SET_TYPE_COUNT 11
enum set_type {
SET_ERROR = 0,
SET_EMPTY = 1,
SET_PSEUDO = 2,
SET_LIST = 3,
SET_RANGE = 4,
SET_PROD = 5,
SET_MULTI = 6,
SET_UNION = 7,
SET_INTER = 8,
SET_MINUS = 9,
SET_SYMDIFF = 10,
SET_TYPES = SET_TYPE_COUNT
};
typedef enum set_type SetType;
typedef struct set_vtab SetVTab;
typedef struct set_empty SetEmpty;
typedef struct set_pseudo SetPseudo;
typedef struct set_head SetHead;
typedef struct set_list SetList;
typedef struct set_range SetRange;
typedef struct set_prod SetProd;
typedef struct set_multi SetMulti;
typedef struct set_empty_iter SetEmptyIter;
typedef struct set_pseudo_iter SetPseudoIter;
typedef struct set_list_iter SetListIter;
typedef struct set_range_iter SetRangeIter;
typedef struct set_prod_iter SetProdIter;
typedef struct set_multi_iter SetMultiIter;
struct set_head
{
int refc;
int dim;
SetIterIdx members;
SetType type;
};
struct set_empty
{
SetHead head;
SID
};
struct set_pseudo
{
SetHead head;
SID
};
struct set_list
{
SetHead head;
int size;
Elem** member;
Hash* hash;
SID
};
struct set_range
{
SetHead head;
int begin;
int end;
int step;
SID
};
struct set_prod
{
SetHead head;
Set* set_a;
Set* set_b;
SID
};
struct set_multi
{
SetHead head;
Set** set;
SetIterIdx* subset;
SetIterIdx** order;
SID
};
union set
{
SetHead head;
SetEmpty empty;
SetPseudo pseudo;
SetList list;
SetRange range;
SetProd prod;
SetMulti multi;
};
struct set_empty_iter
{
int dummy;
SID
};
struct set_pseudo_iter
{
bool first;
SID
};
struct set_list_iter
{
SetIterIdx first;
SetIterIdx last;
SetIterIdx now;
SID
};
struct set_range_iter
{
SetIterIdx first;
SetIterIdx last;
SetIterIdx now;
SID
};
struct set_prod_iter
{
bool first;
SetIter* iter_a;
SetIter* iter_b;
Elem** elem;
SID
};
struct set_multi_iter
{
int dim;
SetIterIdx members;
SetIterIdx now;
SetIterIdx* subset;
SID
};
union set_iter
{
SetEmptyIter empty;
SetPseudoIter pseudo;
SetListIter list;
SetRangeIter range;
SetProdIter prod;
SetMultiIter multi;
};
struct set_vtab
{
expects_NONNULL void (*set_free) (Set* set);
expects_NONNULL returns_NONNULL Set* (*set_copy) (Set const* set);
expects_NONNULL SetIterIdx (*set_lookup_idx)(Set const* set, Tuple const* tuple, int offset);
expects_NONNULL void (*set_get_tuple) (Set const* set, SetIterIdx idx, Tuple* tuple, int offset);
expects_NONNULL1 returns_NONNULL SetIter* (*iter_init) (Set const* set, Tuple const* pattern, int offset);
expects_NONNULL bool (*iter_next) (SetIter* iter, Set const* set, Tuple* tuple, int offset);
expects_NONNULL void (*iter_exit) (SetIter* iter, Set const* set);
expects_NONNULL void (*iter_reset) (SetIter* iter, Set const* set);
bool (*set_is_valid) (Set const* set);
};
#define SET_DEFAULT 0x0
#define SET_NO_HASH 0x1
#ifdef NDEBUG
extern SetVTab* set_vtab_global;
#endif
extern SetIterIdx set_lookup_idx(Set const* set, Tuple const* tuple, int offset) expects_NONNULL;
extern void set_get_tuple_intern(Set const* set, SetIterIdx idx, Tuple* tuple, int offset) expects_NONNULL;
extern SetIter* set_iter_init_intern(Set const* set, Tuple const* pattern, int offset) expects_NONNULL1 returns_NONNULL;
extern bool set_iter_next_intern(SetIter* iter, Set const* set, Tuple* tuple, int offset) expects_NONNULL;
extern void set_iter_exit_intern(SetIter* iter, Set const* set) expects_NONNULL;
extern void set_iter_reset_intern(SetIter* iter, Set const* set) expects_NONNULL;
extern void set_empty_init(SetVTab* vtab) expects_NONNULL;
extern void set_pseudo_init(SetVTab* vtab) expects_NONNULL;
extern void set_list_init(SetVTab* vtab) expects_NONNULL;
extern Set* set_list_new(int size, int flags) returns_NONNULL;
extern SetIterIdx set_list_add_elem(Set* set, Elem const* elem, SetCheckType check) expects_NONNULL;
extern Set* set_list_new_from_elems(List const* list, SetCheckType check) expects_NONNULL returns_NONNULL;
extern Set* set_list_new_from_tuples(List const* list, SetCheckType check) expects_NONNULL returns_NONNULL;
extern Set* set_list_new_from_entries(List const* list, SetCheckType check) expects_NONNULL returns_NONNULL;
extern Elem const* set_list_get_elem(Set const* set, SetIterIdx idx) expects_NONNULL returns_NONNULL is_PURE;
extern void set_range_init(SetVTab* vtab) expects_NONNULL;
extern void set_prod_init(SetVTab* vtab) expects_NONNULL;
extern void set_multi_init(SetVTab* vtab) expects_NONNULL;
extern Set* set_multi_new_from_list(List const* list, SetCheckType check) expects_NONNULL returns_NONNULL;
#ifdef __cplusplus
}
#endif
#endif