summaryrefslogtreecommitdiffstats
path: root/ctrl/facemgr/src/util/set.h
diff options
context:
space:
mode:
Diffstat (limited to 'ctrl/facemgr/src/util/set.h')
-rw-r--r--ctrl/facemgr/src/util/set.h127
1 files changed, 127 insertions, 0 deletions
diff --git a/ctrl/facemgr/src/util/set.h b/ctrl/facemgr/src/util/set.h
new file mode 100644
index 000000000..47a6eeaff
--- /dev/null
+++ b/ctrl/facemgr/src/util/set.h
@@ -0,0 +1,127 @@
+/*
+ * Copyright (c) 2017-2019 Cisco and/or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UTIL_SET_H
+#define UTIL_SET_H
+
+#include <search.h>
+#include <string.h>
+#include "token.h"
+#include "../common.h"
+
+#define ERR_SET_EXISTS -2
+#define ERR_SET_NOT_FOUND -3
+
+#define BUFSIZE 80
+
+static inline
+int
+string_snprintf(char * buf, size_t size, const char * s) {
+ return snprintf(buf, size, "%s", s);
+}
+
+static inline
+int
+generic_snprintf(char * buf, size_t size, void * value) {
+ return snprintf(buf, BUFSIZE, "%p", value);
+}
+
+#define TYPEDEF_SET_H(NAME, T) \
+ \
+typedef struct { \
+ size_t size; \
+ void * root; \
+} NAME ## _t; \
+ \
+int NAME ## _initialize(NAME ## _t * set); \
+ \
+int NAME ## _finalize(NAME ## _t * set); \
+ \
+NAME ## _t * NAME ## _create(); \
+ \
+void NAME ## _free(NAME ## _t * set); \
+ \
+int NAME ## _add(NAME ## _t * set, const T element); \
+ \
+int NAME ## _remove(NAME ## _t * set, const T search, T * element); \
+ \
+int NAME ## _get(NAME ## _t * set, const T search, T * element); \
+ \
+void NAME ## _dump(NAME ## _t * set);
+
+
+
+
+#define TYPEDEF_SET(NAME, T, CMP, SNPRINTF) \
+int \
+NAME ## _initialize(NAME ## _t * set) \
+{ \
+ set->root = NULL; \
+ set->size = 0; \
+ return FACEMGR_SUCCESS; \
+} \
+ \
+NO_FINALIZE(NAME); \
+AUTOGENERATE_CREATE_FREE(NAME); \
+ \
+int \
+NAME ## _add(NAME ## _t * set, const T element) \
+{ \
+ return tsearch(element, &set->root, (cmp_t)CMP) \
+ ? FACEMGR_SUCCESS : FACEMGR_FAILURE; \
+} \
+ \
+int \
+NAME ## _remove(NAME ## _t * set, const T search, T * element) \
+{ \
+ T * found = tdelete(search, &set->root, (cmp_t)CMP); \
+ if (found && element) \
+ *element = *found; \
+ return found ? FACEMGR_SUCCESS : ERR_SET_NOT_FOUND; \
+} \
+ \
+int \
+NAME ## _get(NAME ## _t * set, const T search, T * element) \
+{ \
+ T * found = tfind(search, &set->root, (cmp_t)CMP); \
+ if (found && element) \
+ *element = *found; \
+ return found ? FACEMGR_SUCCESS : ERR_SET_NOT_FOUND; \
+} \
+ \
+void \
+__ ## NAME ## _dump_node(const void *nodep, const VISIT which, const int depth) \
+{ \
+ char buf[BUFSIZE]; \
+ switch (which) { \
+ case preorder: \
+ break; \
+ case postorder: \
+ break; \
+ case endorder: \
+ break; \
+ case leaf: \
+ SNPRINTF(buf, BUFSIZE, *(T*)nodep); \
+ printf("%s\n", buf); \
+ break; \
+ } \
+} \
+ \
+void \
+NAME ## _dump(NAME ## _t * set) { \
+ twalk(set->root, __ ## NAME ## _dump_node); \
+} \
+
+#endif /* UTIL_SET_H */