2009-11-18 02:42:52 +03:00
/*-*- Mode: C; c-basic-offset: 8 -*-*/
# ifndef foosethfoo
# define foosethfoo
/* Pretty straightforward set implementation. Internally based on the
* hashmap . That means that as a minor optimization a NULL set
* object will be treated as empty set for all read
* operations . That way it is not necessary to instantiate an object
* for each set use . */
# include "hashmap.h"
typedef struct Set Set ;
Set * set_new ( hash_func_t hash_func , compare_func_t compare_func ) ;
2010-01-19 01:49:49 +03:00
Set * set_copy ( Set * s ) ;
void set_free ( Set * s ) ;
2009-11-18 02:42:52 +03:00
int set_put ( Set * s , void * value ) ;
2010-01-20 04:12:36 +03:00
int set_replace ( Set * s , void * value ) ;
2009-11-18 02:42:52 +03:00
void * set_get ( Set * s , void * value ) ;
void * set_remove ( Set * s , void * value ) ;
2010-01-19 01:49:49 +03:00
int set_merge ( Set * s , Set * other ) ;
2009-11-18 02:42:52 +03:00
unsigned set_size ( Set * s ) ;
bool set_isempty ( Set * s ) ;
2010-01-19 01:49:49 +03:00
void * set_iterate ( Set * s , void * * state ) ;
void * set_iterate_backwards ( Set * s , void * * state ) ;
2009-11-18 02:42:52 +03:00
2010-01-19 06:15:20 +03:00
void set_clear ( Set * s ) ;
2010-01-19 01:49:49 +03:00
void * set_steal_first ( Set * s ) ;
void * set_first ( Set * s ) ;
void * set_last ( Set * s ) ;
2009-11-18 02:42:52 +03:00
# define SET_FOREACH(e, s, state) \
for ( ( state ) = NULL , ( e ) = set_iterate ( ( s ) , & ( state ) ) ; ( e ) ; ( e ) = set_iterate ( ( s ) , & ( state ) ) )
# define SET_FOREACH_BACKWARDS(e, s, state) \
for ( ( state ) = NULL , ( e ) = set_iterate_backwards ( ( s ) , & ( state ) ) ; ( e ) ; ( e ) = set_iterate_backwards ( ( s ) , & ( state ) ) )
# endif