aboutsummaryrefslogtreecommitdiff
path: root/external/hash/int_set.h
diff options
context:
space:
mode:
Diffstat (limited to 'external/hash/int_set.h')
-rw-r--r--external/hash/int_set.h50
1 files changed, 50 insertions, 0 deletions
diff --git a/external/hash/int_set.h b/external/hash/int_set.h
new file mode 100644
index 0000000..b873ef9
--- /dev/null
+++ b/external/hash/int_set.h
@@ -0,0 +1,50 @@
+#ifndef INT_SET_H
+#define INT_SET_H
+
+#include "ptr_set.h"
+
+/*
+ * The values 0, 1, and 2 are reserved so we map integers
+ * before casting them to void *.
+ *
+ * Instead we disallow the largest positive integers.
+ *
+ * This is specfic to the implementation of ptr_set, so
+ * if it changes, we may have to change here as well.
+ */
+
+#define HT_INT_SET_OFFSET ((1 << (8 * sizeof(int) - 1)) - 2)
+#define HT_INT_TO_PTR(x) ((void *)(size_t)((x) - HT_INT_SET_OFFSET))
+#define HT_PTR_TO_INT(x) ((int)(size_t)(x) + HT_INT_SET_OFFSET)
+
+/* Return value helpers. */
+#define INT_SET_IS_MISSING(x) (HT_PTR_SET_MISSING(HT_INT_TO_PTR(x)))
+#define INT_SET_IS_ERROR(x) (HT_PTR_SET_IS_ERROR(HT_INT_TO_PTR(x)))
+#define INT_SET_IS_VALID(x) (HT_PTR_SET_IS_VALID(HT_INT_TO_PTR(x)))
+
+typedef ptr_set_t int_set_t;
+
+/* Returns 1 if already present, 0 otherwise. */
+static inline int int_set_add(int_set_t *S, int x)
+{
+ return ptr_set_insert_item(S, HT_INT_TO_PTR(x), ht_keep) != 0;
+}
+
+/* Returns 1 if removed, 0 otherwise. */
+static inline int int_set_remove(int_set_t *S, int x)
+{
+ return ptr_set_remove_item(S, HT_INT_TO_PTR(x)) != 0;
+}
+
+static inline int int_set_count(int_set_t *S)
+{
+ return ptr_set_count(S);
+}
+
+/* Returns 1 if present, 0 otherwise. */
+static inline int int_set_exists(int_set_t *S, int x)
+{
+ return ptr_set_exists(S, HT_INT_TO_PTR(x));
+}
+
+#endif /* INT_SET_H */