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

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * pg_list.h
  4.  *   POSTGRES generic list package
  5.  *
  6.  *
  7.  * Copyright (c) 1994, Regents of the University of California
  8.  *
  9.  * $Id: pg_list.h,v 1.11 1999/02/22 05:26:47 momjian Exp $
  10.  *
  11.  *-------------------------------------------------------------------------
  12.  */
  13. #ifndef PG_LIST_H
  14. #define PG_LIST_H
  15. #include <nodes/nodes.h>
  16. /* ----------------------------------------------------------------
  17.  * node definitions
  18.  * ----------------------------------------------------------------
  19.  */
  20. /*----------------------
  21.  * Value node
  22.  *----------------------
  23.  */
  24. typedef struct Value
  25. {
  26. NodeTag type; /* tag appropriately (eg. T_String) */
  27. union ValUnion
  28. {
  29. char    *str; /* string */
  30. long ival;
  31. double dval;
  32. } val;
  33. } Value;
  34. #define intVal(v) (((Value *)v)->val.ival)
  35. #define floatVal(v) (((Value *)v)->val.dval)
  36. #define strVal(v) (((Value *)v)->val.str)
  37. /*----------------------
  38.  * List node
  39.  *----------------------
  40.  */
  41. typedef struct List
  42. {
  43. NodeTag type;
  44. union
  45. {
  46. void    *ptr_value;
  47. int int_value;
  48. } elem;
  49. struct List *next;
  50. } List;
  51. #define    NIL ((List *) NULL)
  52. /* ----------------
  53.  * accessor macros
  54.  * ----------------
  55.  */
  56. /* anything that doesn't end in 'i' is assumed to be referring to the */
  57. /* pointer version of the list (where it makes a difference)   */
  58. #define lfirst(l) ((l)->elem.ptr_value)
  59. #define lnext(l) ((l)->next)
  60. #define lsecond(l) (lfirst(lnext(l)))
  61. #define lfirsti(l) ((l)->elem.int_value)
  62. /*
  63.  * foreach -
  64.  *   a convenience macro which loops through the list
  65.  */
  66. #define foreach(_elt_,_list_)
  67. for(_elt_=_list_; _elt_!=NIL;_elt_=lnext(_elt_))
  68. /*
  69.  * function prototypes in nodes/list.c
  70.  */
  71. extern int length(List *list);
  72. extern List *nconc(List *list1, List *list2);
  73. extern List *lcons(void *datum, List *list);
  74. extern bool member(void *foo, List *bar);
  75. extern Value *makeInteger(long i);
  76. extern Value *makeFloat(double d);
  77. extern Value *makeString(char *str);
  78. extern List *makeList(void *elem,...);
  79. extern List *lappend(List *list, void *obj);
  80. extern List *lremove(void *elem, List *list);
  81. extern void freeList(List *list);
  82. extern List *LispRemove(void *elem, List *list);
  83. extern void *nth(int n, List *l);
  84. extern void set_nth(List *l, int n, void *elem);
  85. List    *lconsi(int datum, List *list);
  86. List    *lappendi(List *list, int datum);
  87. extern bool intMember(int, List *);
  88. extern int nthi(int n, List *l);
  89. extern List *set_difference(List *, List *);
  90. extern List *set_differencei(List *, List *);
  91. extern List *LispUnion(List *foo, List *bar);
  92. extern List *LispUnioni(List *foo, List *bar);
  93. extern bool same(List *foo, List *bar);
  94. /* should be in nodes.h but needs List */
  95. /* in copyfuncs.c */
  96. extern List *listCopy(List *);
  97. #endif  /* PG_LIST_H */