aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/mmgr/oset.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/mmgr/oset.c')
-rw-r--r--src/backend/utils/mmgr/oset.c173
1 files changed, 173 insertions, 0 deletions
diff --git a/src/backend/utils/mmgr/oset.c b/src/backend/utils/mmgr/oset.c
new file mode 100644
index 00000000000..478fe1516ab
--- /dev/null
+++ b/src/backend/utils/mmgr/oset.c
@@ -0,0 +1,173 @@
+/*-------------------------------------------------------------------------
+ *
+ * oset.c--
+ * Fixed format ordered set definitions.
+ *
+ * Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * $Header: /cvsroot/pgsql/src/backend/utils/mmgr/Attic/oset.c,v 1.1.1.1 1996/07/09 06:22:09 scrappy Exp $
+ *
+ * NOTE
+ * XXX This is a preliminary implementation which lacks fail-fast
+ * XXX validity checking of arguments.
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "c.h"
+
+#include "utils/memutils.h" /* where declarations of this file goes */
+
+static Pointer OrderedElemGetBase(OrderedElem elem);
+static void OrderedElemInit(OrderedElem elem, OrderedSet set);
+static void OrderedElemPush(OrderedElem elem);
+static void OrderedElemPushHead(OrderedElem elem);
+
+/*
+ * OrderedElemGetBase --
+ * Returns base of enclosing structure.
+ */
+static Pointer
+OrderedElemGetBase(OrderedElem elem)
+{
+ if (elem == (OrderedElem) NULL)
+ return (Pointer) NULL;
+
+ return ((Pointer)((char*)(elem) - (elem)->set->offset));
+}
+
+/*
+ * OrderedSetInit --
+ */
+void
+OrderedSetInit(OrderedSet set, Offset offset)
+{
+ set->head = (OrderedElem)&set->dummy;
+ set->dummy = NULL;
+ set->tail = (OrderedElem)&set->head;
+ set->offset = offset;
+}
+
+/*
+ * OrderedElemInit --
+ */
+static void
+OrderedElemInit(OrderedElem elem, OrderedSet set)
+{
+ elem->set = set;
+ /* mark as unattached */
+ elem->next = NULL;
+ elem->prev = NULL;
+}
+
+/*
+ * OrderedSetContains --
+ * True iff ordered set contains given element.
+ */
+bool
+OrderedSetContains(OrderedSet set, OrderedElem elem)
+{
+ return ((bool)(elem->set == set && (elem->next || elem->prev)));
+}
+
+/*
+ * OrderedSetGetHead --
+ */
+Pointer
+OrderedSetGetHead(OrderedSet set)
+{
+ register OrderedElem elem;
+
+ elem = set->head;
+ if (elem->next) {
+ return (OrderedElemGetBase(elem));
+ }
+ return (NULL);
+}
+
+/*
+ * OrderedSetGetTail --
+ */
+Pointer
+OrderedSetGetTail(OrderedSet set)
+{
+ register OrderedElem elem;
+
+ elem = set->tail;
+ if (elem->prev) {
+ return (OrderedElemGetBase(elem));
+ }
+ return (NULL);
+}
+
+/*
+ * OrderedElemGetPredecessor --
+ */
+Pointer
+OrderedElemGetPredecessor(OrderedElem elem)
+{
+ elem = elem->prev;
+ if (elem->prev) {
+ return (OrderedElemGetBase(elem));
+ }
+ return (NULL);
+}
+
+/*
+ * OrderedElemGetSuccessor --
+ */
+Pointer
+OrderedElemGetSuccessor(OrderedElem elem)
+{
+ elem = elem->next;
+ if (elem->next) {
+ return (OrderedElemGetBase(elem));
+ }
+ return (NULL);
+}
+
+/*
+ * OrderedElemPop --
+ */
+void
+OrderedElemPop(OrderedElem elem)
+{
+ elem->next->prev = elem->prev;
+ elem->prev->next = elem->next;
+ /* assignments used only for error detection */
+ elem->next = NULL;
+ elem->prev = NULL;
+}
+
+/*
+ * OrderedElemPushInto --
+ */
+void
+OrderedElemPushInto(OrderedElem elem, OrderedSet set)
+{
+ OrderedElemInit(elem, set);
+ OrderedElemPush(elem);
+}
+
+/*
+ * OrderedElemPush --
+ */
+static void
+OrderedElemPush(OrderedElem elem)
+{
+ OrderedElemPushHead(elem);
+}
+
+/*
+ * OrderedElemPushHead --
+ */
+static void
+OrderedElemPushHead(OrderedElem elem)
+{
+ elem->next = elem->set->head;
+ elem->prev = (OrderedElem)&elem->set->head;
+ elem->next->prev = elem;
+ elem->prev->next = elem;
+}
+