You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

88 lines
1.9 KiB

10 years ago
  1. /* -*- coding: utf-8 -*-
  2. * ----------------------------------------------------------------------
  3. * Copyright © 2011, RedJack, LLC.
  4. * All rights reserved.
  5. *
  6. * Please see the COPYING file in this distribution for license
  7. * details.
  8. * ----------------------------------------------------------------------
  9. */
  10. #include <stdlib.h>
  11. #include "libcork/core/allocator.h"
  12. #include "libcork/core/types.h"
  13. #include "libcork/ds/ring-buffer.h"
  14. int
  15. cork_ring_buffer_init(struct cork_ring_buffer *self, size_t size)
  16. {
  17. self->elements = cork_calloc(size, sizeof(void *));
  18. self->allocated_size = size;
  19. self->size = 0;
  20. self->read_index = 0;
  21. self->write_index = 0;
  22. return 0;
  23. }
  24. struct cork_ring_buffer *
  25. cork_ring_buffer_new(size_t size)
  26. {
  27. struct cork_ring_buffer *buf = cork_new(struct cork_ring_buffer);
  28. cork_ring_buffer_init(buf, size);
  29. return buf;
  30. }
  31. void
  32. cork_ring_buffer_done(struct cork_ring_buffer *self)
  33. {
  34. free(self->elements);
  35. }
  36. void
  37. cork_ring_buffer_free(struct cork_ring_buffer *buf)
  38. {
  39. cork_ring_buffer_done(buf);
  40. free(buf);
  41. }
  42. int
  43. cork_ring_buffer_add(struct cork_ring_buffer *self, void *element)
  44. {
  45. if (cork_ring_buffer_is_full(self)) {
  46. return -1;
  47. }
  48. self->elements[self->write_index++] = element;
  49. self->size++;
  50. if (self->write_index == self->allocated_size) {
  51. self->write_index = 0;
  52. }
  53. return 0;
  54. }
  55. void *
  56. cork_ring_buffer_pop(struct cork_ring_buffer *self)
  57. {
  58. if (cork_ring_buffer_is_empty(self)) {
  59. return NULL;
  60. } else {
  61. void *result = self->elements[self->read_index++];
  62. self->size--;
  63. if (self->read_index == self->allocated_size) {
  64. self->read_index = 0;
  65. }
  66. return result;
  67. }
  68. }
  69. void *
  70. cork_ring_buffer_peek(struct cork_ring_buffer *self)
  71. {
  72. if (cork_ring_buffer_is_empty(self)) {
  73. return NULL;
  74. } else {
  75. return self->elements[self->read_index];
  76. }
  77. }