slice.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /*
  2. * Copyright (c) 2016, Google Inc., Dan Cross <net!gajendra!cross>
  3. *
  4. * Permission to use, copy, modify, and/or distribute this software
  5. * for any purpose with or without fee is hereby granted, provided
  6. * that the above copyright notice and this permission notice appear
  7. * in all copies.
  8. *
  9. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
  10. * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
  11. * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
  12. * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
  13. * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
  14. * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
  15. * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  16. * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  17. */
  18. #include <u.h>
  19. #include <libc.h>
  20. void
  21. psliceinit(PSlice *slice)
  22. {
  23. memset(slice, 0, sizeof(*slice));
  24. }
  25. void
  26. psliceclear(PSlice *slice)
  27. {
  28. slice->len = 0;
  29. memset(slice->ptrs, 0, sizeof(*slice->ptrs) * slice->capacity);
  30. }
  31. void *
  32. psliceget(PSlice *slice, size_t i)
  33. {
  34. if (i >= slice->len)
  35. return nil;
  36. return slice->ptrs[i];
  37. }
  38. int
  39. psliceput(PSlice *slice, size_t i, void *p)
  40. {
  41. if (i >= slice->len)
  42. return 0;
  43. slice->ptrs[i] = p;
  44. return 1;
  45. }
  46. int
  47. pslicedel(PSlice *slice, size_t i)
  48. {
  49. if (i >= slice->len)
  50. return 0;
  51. memmove(slice->ptrs + i, slice->ptrs + i + 1,
  52. (slice->len - (i + 1)) * sizeof(void *));
  53. slice->len--;
  54. return 1;
  55. }
  56. void
  57. psliceappend(PSlice *s, void *p)
  58. {
  59. void **ps;
  60. assert(p != nil);
  61. if (s->len == s->capacity) {
  62. if (s->capacity == 0)
  63. s->capacity = 4;
  64. s->capacity *= 2;
  65. ps = reallocarray(s->ptrs, s->capacity, sizeof(void *));
  66. if (ps == nil) {
  67. print("realloc at %p failed, cap %d, size %d\n", s->ptrs, s->capacity, sizeof(void *));
  68. assert(0);
  69. }
  70. s->ptrs = ps;
  71. }
  72. s->ptrs[s->len] = p;
  73. s->len++;
  74. }
  75. size_t
  76. pslicelen(PSlice *slice)
  77. {
  78. return slice->len;
  79. }
  80. void **
  81. pslicefinalize(PSlice *slice)
  82. {
  83. void **ps;
  84. ps = reallocarray(slice->ptrs, slice->len, sizeof(void *));
  85. if (ps == nil) {
  86. print("realloc at %p failed, cap %d, size %d\n", slice->ptrs, slice->len, sizeof(void *));
  87. assert(0);
  88. }
  89. slice->len = 0;
  90. slice->capacity = 0;
  91. slice->ptrs = nil;
  92. return ps;
  93. }
  94. void
  95. pslicedestroy(PSlice *slice)
  96. {
  97. free(slice->ptrs);
  98. slice->ptrs = nil;
  99. slice->capacity = 0;
  100. slice->len = 0;
  101. }