oset.c 2.87 KB
Newer Older
1 2 3
/*-------------------------------------------------------------------------
 *
 * oset.c--
4
 *	  Fixed format ordered set definitions.
5 6 7 8 9
 *
 * Copyright (c) 1994, Regents of the University of California
 *
 *
 * IDENTIFICATION
10
 *	  $Header: /cvsroot/pgsql/src/backend/utils/mmgr/Attic/oset.c,v 1.10 1999/01/17 03:04:53 tgl Exp $
11 12
 *
 * NOTE
13 14
 *	  XXX This is a preliminary implementation which lacks fail-fast
 *	  XXX validity checking of arguments.
15 16 17
 *
 *-------------------------------------------------------------------------
 */
18
#include "postgres.h"
19

20
#include "utils/memutils.h"		/* where declarations of this file goes */
21

22 23 24
static Pointer OrderedElemGetBase(OrderedElem elem);
static void OrderedElemPush(OrderedElem elem);
static void OrderedElemPushHead(OrderedElem elem);
25 26 27

/*
 * OrderedElemGetBase --
28
 *		Returns base of enclosing structure.
29
 */
30
static Pointer
31 32
OrderedElemGetBase(OrderedElem elem)
{
33 34 35
	if (elem == (OrderedElem) NULL)
		return (Pointer) NULL;

36
	return (Pointer) ((char *) (elem) - (elem)->set->offset);
37 38 39 40 41 42 43 44
}

/*
 * OrderedSetInit --
 */
void
OrderedSetInit(OrderedSet set, Offset offset)
{
45
	set->head = (OrderedElem) &set->dummy;
46
	set->dummy = NULL;
47
	set->tail = (OrderedElem) &set->head;
48
	set->offset = offset;
49 50 51 52
}

/*
 * OrderedSetContains --
53
 *		True iff ordered set contains given element.
54 55 56 57
 */
bool
OrderedSetContains(OrderedSet set, OrderedElem elem)
{
58
	return (bool) (elem->set == set && (elem->next || elem->prev));
59 60 61 62 63 64 65 66
}

/*
 * OrderedSetGetHead --
 */
Pointer
OrderedSetGetHead(OrderedSet set)
{
67
	OrderedElem elem;
68 69 70

	elem = set->head;
	if (elem->next)
71 72
		return OrderedElemGetBase(elem);
	return NULL;
73 74 75 76 77
}

/*
 * OrderedSetGetTail --
 */
78
#ifdef NOT_USED
79 80 81
Pointer
OrderedSetGetTail(OrderedSet set)
{
82
	OrderedElem elem;
83 84 85

	elem = set->tail;
	if (elem->prev)
86 87
		return OrderedElemGetBase(elem);
	return NULL;
88
}
89

90
#endif
91 92 93 94 95 96 97

/*
 * OrderedElemGetPredecessor --
 */
Pointer
OrderedElemGetPredecessor(OrderedElem elem)
{
98 99
	elem = elem->prev;
	if (elem->prev)
100 101
		return OrderedElemGetBase(elem);
	return NULL;
102 103 104 105 106 107 108 109
}

/*
 * OrderedElemGetSuccessor --
 */
Pointer
OrderedElemGetSuccessor(OrderedElem elem)
{
110 111
	elem = elem->next;
	if (elem->next)
112 113
		return OrderedElemGetBase(elem);
	return NULL;
114 115 116 117 118
}

/*
 * OrderedElemPop --
 */
119
void
120 121
OrderedElemPop(OrderedElem elem)
{
122 123 124 125 126
	elem->next->prev = elem->prev;
	elem->prev->next = elem->next;
	/* assignments used only for error detection */
	elem->next = NULL;
	elem->prev = NULL;
127 128 129 130 131 132 133 134
}

/*
 * OrderedElemPushInto --
 */
void
OrderedElemPushInto(OrderedElem elem, OrderedSet set)
{
135 136 137 138 139
	elem->set = set;
	/* mark as unattached */
	elem->next = NULL;
	elem->prev = NULL;
	OrderedElemPush(elem);
140 141 142 143 144 145 146 147
}

/*
 * OrderedElemPush --
 */
static void
OrderedElemPush(OrderedElem elem)
{
148
	OrderedElemPushHead(elem);
149 150 151 152 153 154 155 156
}

/*
 * OrderedElemPushHead --
 */
static void
OrderedElemPushHead(OrderedElem elem)
{
157
	elem->next = elem->set->head;
158
	elem->prev = (OrderedElem) &elem->set->head;
159 160
	elem->next->prev = elem;
	elem->prev->next = elem;
161
}