oset.c
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:3k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * oset.c
  4.  *   Fixed format ordered set definitions.
  5.  *
  6.  * Copyright (c) 1994, Regents of the University of California
  7.  *
  8.  *
  9.  * IDENTIFICATION
  10.  *   $Header: /usr/local/cvsroot/pgsql/src/backend/utils/mmgr/oset.c,v 1.13.2.1 1999/08/02 05:25:16 scrappy Exp $
  11.  *
  12.  * NOTE
  13.  *   XXX This is a preliminary implementation which lacks fail-fast
  14.  *   XXX validity checking of arguments.
  15.  *
  16.  *-------------------------------------------------------------------------
  17.  */
  18. #include "postgres.h"
  19. #include "utils/memutils.h"
  20. static Pointer OrderedElemGetBase(OrderedElem elem);
  21. static void OrderedElemPush(OrderedElem elem);
  22. static void OrderedElemPushHead(OrderedElem elem);
  23. /*
  24.  * OrderedElemGetBase
  25.  * Returns base of enclosing structure.
  26.  */
  27. static Pointer
  28. OrderedElemGetBase(OrderedElem elem)
  29. {
  30. if (elem == (OrderedElem) NULL)
  31. return (Pointer) NULL;
  32. return (Pointer) ((char *) (elem) - (elem)->set->offset);
  33. }
  34. /*
  35.  * OrderedSetInit
  36.  */
  37. void
  38. OrderedSetInit(OrderedSet set, Offset offset)
  39. {
  40. set->head = (OrderedElem) &set->dummy;
  41. set->dummy = NULL;
  42. set->tail = (OrderedElem) &set->head;
  43. set->offset = offset;
  44. }
  45. /*
  46.  * OrderedSetContains
  47.  * True iff ordered set contains given element.
  48.  */
  49. #ifdef NOT_USED
  50. bool
  51. OrderedSetContains(OrderedSet set, OrderedElem elem)
  52. {
  53. return (bool) (elem->set == set && (elem->next || elem->prev));
  54. }
  55. #endif
  56. /*
  57.  * OrderedSetGetHead
  58.  */
  59. Pointer
  60. OrderedSetGetHead(OrderedSet set)
  61. {
  62. OrderedElem elem;
  63. elem = set->head;
  64. if (elem->next)
  65. return OrderedElemGetBase(elem);
  66. return NULL;
  67. }
  68. /*
  69.  * OrderedSetGetTail
  70.  */
  71. #ifdef NOT_USED
  72. Pointer
  73. OrderedSetGetTail(OrderedSet set)
  74. {
  75. OrderedElem elem;
  76. elem = set->tail;
  77. if (elem->prev)
  78. return OrderedElemGetBase(elem);
  79. return NULL;
  80. }
  81. #endif
  82. /*
  83.  * OrderedElemGetPredecessor
  84.  */
  85. Pointer
  86. OrderedElemGetPredecessor(OrderedElem elem)
  87. {
  88. elem = elem->prev;
  89. if (elem->prev)
  90. return OrderedElemGetBase(elem);
  91. return NULL;
  92. }
  93. /*
  94.  * OrderedElemGetSuccessor
  95.  */
  96. Pointer
  97. OrderedElemGetSuccessor(OrderedElem elem)
  98. {
  99. elem = elem->next;
  100. if (elem->next)
  101. return OrderedElemGetBase(elem);
  102. return NULL;
  103. }
  104. /*
  105.  * OrderedElemPop
  106.  */
  107. void
  108. OrderedElemPop(OrderedElem elem)
  109. {
  110. elem->next->prev = elem->prev;
  111. elem->prev->next = elem->next;
  112. /* assignments used only for error detection */
  113. elem->next = NULL;
  114. elem->prev = NULL;
  115. }
  116. /*
  117.  * OrderedElemPushInto
  118.  */
  119. void
  120. OrderedElemPushInto(OrderedElem elem, OrderedSet set)
  121. {
  122. elem->set = set;
  123. /* mark as unattached */
  124. elem->next = NULL;
  125. elem->prev = NULL;
  126. OrderedElemPush(elem);
  127. }
  128. /*
  129.  * OrderedElemPush
  130.  */
  131. static void
  132. OrderedElemPush(OrderedElem elem)
  133. {
  134. OrderedElemPushHead(elem);
  135. }
  136. /*
  137.  * OrderedElemPushHead
  138.  */
  139. static void
  140. OrderedElemPushHead(OrderedElem elem)
  141. {
  142. elem->next = elem->set->head;
  143. elem->prev = (OrderedElem) &elem->set->head;
  144. elem->next->prev = elem;
  145. elem->prev->next = elem;
  146. }