1
0
mirror of https://github.com/postgres/postgres.git synced 2025-11-15 03:41:20 +03:00
Files
postgres/src/backend/utils/mmgr/oset.c
1998-06-15 19:30:31 +00:00

162 lines
2.9 KiB
C

/*-------------------------------------------------------------------------
*
* 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.8 1998/06/15 19:29:53 momjian 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 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;
}
/*
* 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)
{
OrderedElem elem;
elem = set->head;
if (elem->next)
return (OrderedElemGetBase(elem));
return (NULL);
}
/*
* OrderedSetGetTail --
*/
#ifdef NOT_USED
Pointer
OrderedSetGetTail(OrderedSet set)
{
OrderedElem elem;
elem = set->tail;
if (elem->prev)
return (OrderedElemGetBase(elem));
return (NULL);
}
#endif
/*
* 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)
{
elem->set = set;
/* mark as unattached */
elem->next = NULL;
elem->prev = NULL;
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;
}