00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #ifndef __bitset_h__
00035 #define __bitset_h__
00036
00037 #include <inttypes.h>
00038 #include <assert.h>
00039
00040
00041
00042
00043
00044
00045
00046 typedef uint32_t _bitset_word_t;
00047 typedef _bitset_word_t *bitset_t;
00048
00049 #define WORD_SIZE(cardinality) (1+((cardinality)+31)/32)
00050 #define BYTE_SIZE(cardinality) (WORD_SIZE(cardinality)*sizeof(_bitset_word_t))
00051 #define WORD_INDEX(element) (1+(element)/32)
00052 #define BIT_INDEX(element) ((element)&037)
00053
00054 static inline void
00055 bitset_add(bitset_t set, unsigned int element)
00056 {
00057 assert(element < set[0]);
00058 set[WORD_INDEX(element)] |= (1 << BIT_INDEX(element));
00059 }
00060
00061 static inline void
00062 bitset_copy(bitset_t to_set, bitset_t from_set)
00063 {
00064 assert(to_set[0] == from_set[0]);
00065 memcpy(to_set, from_set, BYTE_SIZE(to_set[0]));
00066 }
00067
00068 static inline void
00069 bitset_create(bitset_t *set, unsigned int cardinality)
00070 {
00071 *set = (bitset_t) calloc(WORD_SIZE(cardinality),
00072 sizeof(_bitset_word_t));
00073 assert(*set);
00074 *set[0] = cardinality;
00075 }
00076
00077 static inline void
00078 bitset_destroy(bitset_t *set)
00079 {
00080 if (*set) {
00081 free(*set);
00082 *set = (bitset_t) 0;
00083 }
00084 }
00085
00086 static inline int
00087 bitset_empty(bitset_t set)
00088 {
00089 int i;
00090 _bitset_word_t result = 0;
00091 int nwords = WORD_SIZE(set[0]);
00092 for (i = 1; i < nwords; i++) {
00093 result |= set[i];
00094 }
00095 return (result == 0);
00096 }
00097
00098 static inline int
00099 bitset_contains(bitset_t set, unsigned int element)
00100 {
00101 assert(element < set[0]);
00102 return (0 != (set[WORD_INDEX(element)] & (1<<BIT_INDEX(element))));
00103 }
00104
00105 static inline void
00106 bitset_remove(bitset_t set, unsigned int element)
00107 {
00108 assert(element < set[0]);
00109 set[WORD_INDEX(element)] &= ~(1<<BIT_INDEX(element));
00110 }
00111
00112 #endif