seq.c
资源名称:c.rar [点击查看]
上传用户:shmaik
上传日期:2014-06-01
资源大小:45093k
文件大小:3k
源码类别:

VC书籍

开发平台:

C/C++

  1. static char rcsid[] = "$Id: H:/drh/idioms/book/RCS/seq.doc,v 1.11 1997/02/21 19:48:24 drh Exp $";
  2. #include <stdlib.h>
  3. #include <stdarg.h>
  4. #include <string.h>
  5. #include "assert.h"
  6. #include "seq.h"
  7. #include "array.h"
  8. #include "arrayrep.h"
  9. #include "mem.h"
  10. #define T Seq_T
  11. struct T {
  12. struct Array_T array;
  13. int length;
  14. int head;
  15. };
  16. static void expand(T seq) {
  17. int n = seq->array.length;
  18. Array_resize(&seq->array, 2*n);
  19. if (seq->head > 0)
  20. {
  21. void **old = &((void **)seq->array.array)[seq->head];
  22. memcpy(old+n, old, (n - seq->head)*sizeof (void *));
  23. seq->head += n;
  24. }
  25. }
  26. T Seq_new(int hint) {
  27. T seq;
  28. assert(hint >= 0);
  29. NEW0(seq);
  30. if (hint == 0)
  31. hint = 16;
  32. ArrayRep_init(&seq->array, hint, sizeof (void *),
  33. ALLOC(hint*sizeof (void *)));
  34. return seq;
  35. }
  36. T Seq_seq(void *x, ...) {
  37. va_list ap;
  38. T seq = Seq_new(0);
  39. va_start(ap, x);
  40. for ( ; x; x = va_arg(ap, void *))
  41. Seq_addhi(seq, x);
  42. va_end(ap);
  43. return seq;
  44. }
  45. void Seq_free(T *seq) {
  46. assert(seq && *seq);
  47. assert((void *)*seq == (void *)&(*seq)->array);
  48. Array_free((Array_T *)seq);
  49. }
  50. int Seq_length(T seq) {
  51. assert(seq);
  52. return seq->length;
  53. }
  54. void *Seq_get(T seq, int i) {
  55. assert(seq);
  56. assert(i >= 0 && i < seq->length);
  57. return ((void **)seq->array.array)[
  58.         (seq->head + i)%seq->array.length];
  59. }
  60. void *Seq_put(T seq, int i, void *x) {
  61. void *prev;
  62. assert(seq);
  63. assert(i >= 0 && i < seq->length);
  64. prev = ((void **)seq->array.array)[
  65.         (seq->head + i)%seq->array.length];
  66. ((void **)seq->array.array)[
  67. (seq->head + i)%seq->array.length] = x;
  68. return prev;
  69. }
  70. void *Seq_remhi(T seq) {
  71. int i;
  72. assert(seq);
  73. assert(seq->length > 0);
  74. i = --seq->length;
  75. return ((void **)seq->array.array)[
  76.         (seq->head + i)%seq->array.length];
  77. }
  78. void *Seq_remlo(T seq) {
  79. int i = 0;
  80. void *x;
  81. assert(seq);
  82. assert(seq->length > 0);
  83. x = ((void **)seq->array.array)[
  84.      (seq->head + i)%seq->array.length];
  85. seq->head = (seq->head + 1)%seq->array.length;
  86. --seq->length;
  87. return x;
  88. }
  89. void *Seq_addhi(T seq, void *x) {
  90. int i;
  91. assert(seq);
  92. if (seq->length == seq->array.length)
  93. expand(seq);
  94. i = seq->length++;
  95. return ((void **)seq->array.array)[
  96.         (seq->head + i)%seq->array.length] = x;
  97. }
  98. void *Seq_addlo(T seq, void *x) {
  99. int i = 0;
  100. assert(seq);
  101. if (seq->length == seq->array.length)
  102. expand(seq);
  103. if (--seq->head < 0)
  104. seq->head = seq->array.length - 1;
  105. seq->length++;
  106. return ((void **)seq->array.array)[
  107.         (seq->head + i)%seq->array.length] = x;
  108. }