mirror of
https://github.com/postgres/postgres.git
synced 2025-11-16 15:02:33 +03:00
164 lines
2.8 KiB
C
164 lines
2.8 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.15 1999/07/16 05:23:29 momjian Exp $
|
|
*
|
|
* NOTE
|
|
* XXX This is a preliminary implementation which lacks fail-fast
|
|
* XXX validity checking of arguments.
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#include "postgres.h"
|
|
|
|
#include "utils/memutils.h"
|
|
|
|
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.
|
|
*/
|
|
#ifdef NOT_USED
|
|
bool
|
|
OrderedSetContains(OrderedSet set, OrderedElem elem)
|
|
{
|
|
return (bool) (elem->set == set && (elem->next || elem->prev));
|
|
}
|
|
#endif
|
|
|
|
/*
|
|
* 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;
|
|
}
|