5 typedef unsigned long setkey_t;
6 typedef void *setval_t;
9 #ifdef __SET_IMPLEMENTATION__
11 /*************************************
12 * INTERNAL DEFINITIONS
15 /* Fine for 2^NUM_LEVELS nodes. */
19 /* Internal key values with special meanings. */
20 #define INVALID_FIELD (0) /* Uninitialised field value. */
21 #define SENTINEL_KEYMIN ( 1UL) /* Key value of first dummy node. */
22 #define SENTINEL_KEYMAX (~0UL) /* Key value of last dummy node. */
26 * Used internally be set access functions, so that callers can use
27 * key values 0 and 1, without knowing these have special meanings.
29 #define CALLER_TO_INTERNAL_KEY(_k) ((_k) + 2)
33 * SUPPORT FOR WEAK ORDERING OF MEMORY ACCESSES
38 /* Read field @_f into variable @_x. */
39 #define READ_FIELD(_x,_f) \
42 if ( (_x) == INVALID_FIELD ) { RMB(); (_x) = (_f); } \
43 assert((_x) != INVALID_FIELD); \
48 /* Read field @_f into variable @_x. */
49 #define READ_FIELD(_x,_f) ((_x) = (_f))
56 /*************************************
61 * Key range accepted by set functions.
62 * We lose three values (conveniently at top end of key space).
63 * - Known invalid value to which all fields are initialised.
64 * - Sentinel key values for up to two dummy nodes.
67 #define KEY_MAX ((~0U) - 3)
69 typedef void set_t; /* opaque */
71 void _init_set_subsystem(void);
74 * Allocate an empty set.
76 set_t *set_alloc(void);
79 * Add mapping (@k -> @v) into set @s. Return previous mapped value if
80 * one existed, or NULL if no previous mapping for @k existed.
82 * If @overwrite is FALSE, then if a mapping already exists it is not
83 * modified, and the existing value is returned unchanged. It is possible
84 * to see if the value was changed by observing if the return value is NULL.
86 setval_t set_update(set_t *s, setkey_t k, setval_t v, int overwrite);
89 * Remove mapping for key @k from set @s. Return value associated with
90 * removed mapping, or NULL is there was no mapping to delete.
92 setval_t set_remove(set_t *s, setkey_t k);
95 * Look up mapping for key @k in set @s. Return value if found, else NULL.
97 setval_t set_lookup(set_t *s, setkey_t k);
99 #endif /* __SET_IMPLEMENTATION__ */
102 #endif /* __SET_H__ */