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

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * arrayutils.c
  4.  *   This file contains some support routines required for array functions.
  5.  *
  6.  * Copyright (c) 1994, Regents of the University of California
  7.  *
  8.  *
  9.  * IDENTIFICATION
  10.  *   $Header: /usr/local/cvsroot/pgsql/src/backend/utils/adt/arrayutils.c,v 1.7.2.1 1999/08/02 05:24:50 scrappy Exp $
  11.  *
  12.  *-------------------------------------------------------------------------
  13.  */
  14. #define WEAK_C_OPTIMIZER
  15. #include "postgres.h"
  16. #include "utils/array.h"
  17. int
  18. GetOffset(int n, int *dim, int *lb, int *indx)
  19. {
  20. int i,
  21. scale,
  22. offset;
  23. for (i = n - 1, scale = 1, offset = 0; i >= 0; scale *= dim[i--])
  24. offset += (indx[i] - lb[i]) * scale;
  25. return offset;
  26. }
  27. int
  28. getNitems(int n, int *a)
  29. {
  30. int i,
  31. ret;
  32. for (i = 0, ret = 1; i < n; ret *= a[i++]);
  33. if (n == 0)
  34. ret = 0;
  35. return ret;
  36. }
  37. int
  38. compute_size(int *st, int *endp, int n, int base)
  39. {
  40. int i,
  41. ret;
  42. for (i = 0, ret = base; i < n; i++)
  43. ret *= (endp[i] - st[i] + 1);
  44. return ret;
  45. }
  46. void
  47. mda_get_offset_values(int n, int *dist, int *PC, int *span)
  48. {
  49. int i,
  50. j;
  51. for (j = n - 2, dist[n - 1] = 0; j >= 0; j--)
  52. for (i = j + 1, dist[j] = PC[j] - 1; i < n;
  53.  dist[j] -= (span[i] - 1) * PC[i], i++);
  54. }
  55. void
  56. mda_get_range(int n, int *span, int *st, int *endp)
  57. {
  58. int i;
  59. for (i = 0; i < n; i++)
  60. span[i] = endp[i] - st[i] + 1;
  61. }
  62. void
  63. mda_get_prod(int n, int *range, int *P)
  64. {
  65. int i;
  66. for (i = n - 2, P[n - 1] = 1; i >= 0; i--)
  67. P[i] = P[i + 1] * range[i + 1];
  68. }
  69. int
  70. tuple2linear(int n, int *tup, int *scale)
  71. {
  72. int i,
  73. lin;
  74. for (i = lin = 0; i < n; i++)
  75. lin += tup[i] * scale[i];
  76. return lin;
  77. }
  78. void
  79. array2chunk_coord(int n, int *C, int *a_coord, int *c_coord)
  80. {
  81. int i;
  82. for (i = 0; i < n; i++)
  83. c_coord[i] = a_coord[i] / C[i];
  84. }
  85. /*-----------------------------------------------------------------------------
  86.   generates the tuple that is lexicographically one greater than the current
  87.   n-tuple in "curr", with the restriction that the i-th element of "curr" is
  88.   less than the i-th element of "span".
  89.   RETURNS 0 if no next tuple exists
  90.   1   otherwise
  91.   -----------------------------------------------------------------------------*/
  92. int
  93. next_tuple(int n, int *curr, int *span)
  94. {
  95. int i;
  96. if (!n)
  97. return -1;
  98. curr[n - 1] = (curr[n - 1] + 1) % span[n - 1];
  99. for (i = n - 1; i * (!curr[i]); i--)
  100. curr[i - 1] = (curr[i - 1] + 1) % span[i - 1];
  101. if (i)
  102. return i;
  103. if (curr[0])
  104. return 0;
  105. return -1;
  106. }