copy/paste caused some issues here
[swfdec.git] / libswfdec / swfdec_ringbuffer.c
blobacc8ba1a5efffb592bf1135fd2dde253d9632879
2 #ifdef HAVE_CONFIG_H
3 #include "config.h"
4 #endif
6 #include <string.h>
7 #include "swfdec_ringbuffer.h"
9 SwfdecRingBuffer *
10 swfdec_ring_buffer_new (guint element_size, guint size)
12 SwfdecRingBuffer *buffer;
14 g_return_val_if_fail (element_size > 0, NULL);
15 g_return_val_if_fail (size > 1, NULL);
17 buffer = g_new0 (SwfdecRingBuffer, 1);
18 buffer->element_size = element_size;
19 buffer->size = size;
20 buffer->data = g_malloc (element_size * size);
22 return buffer;
25 void
26 swfdec_ring_buffer_free (SwfdecRingBuffer *buffer)
28 g_return_if_fail (buffer != NULL);
30 g_free (buffer->data);
31 g_free (buffer);
34 guint
35 swfdec_ring_buffer_get_size (SwfdecRingBuffer *buffer)
37 g_return_val_if_fail (buffer != NULL, 0);
39 return buffer->size;
42 #define GET_ELEMENT(buffer,idx) (buffer->data + buffer->element_size * (idx))
43 void
44 swfdec_ring_buffer_set_size (SwfdecRingBuffer *buffer, guint new_size)
46 g_return_if_fail (buffer != NULL);
47 g_return_if_fail (buffer->size < new_size);
49 buffer->data = g_realloc (buffer->data, buffer->element_size * new_size);
50 if (buffer->tail <= buffer->head && buffer->n_elements) {
51 memmove (GET_ELEMENT (buffer, buffer->head + new_size - buffer->size),
52 GET_ELEMENT (buffer, buffer->head),
53 buffer->element_size * (buffer->size - buffer->head));
54 buffer->head += new_size - buffer->size;
56 buffer->size = new_size;
59 guint
60 swfdec_ring_buffer_get_n_elements (SwfdecRingBuffer *buffer)
62 g_return_val_if_fail (buffer != NULL, 0);
64 return buffer->n_elements;
67 gpointer
68 swfdec_ring_buffer_push (SwfdecRingBuffer *buffer)
70 gpointer ret;
72 g_return_val_if_fail (buffer != NULL, NULL);
74 if (buffer->n_elements == buffer->size)
75 return NULL;
77 ret = GET_ELEMENT (buffer, buffer->tail);
78 buffer->tail = (buffer->tail + 1) % buffer->size;
79 buffer->n_elements++;
80 return ret;
83 gpointer
84 swfdec_ring_buffer_pop (SwfdecRingBuffer *buffer)
86 gpointer ret;
88 g_return_val_if_fail (buffer != NULL, NULL);
90 if (buffer->n_elements == 0)
91 return NULL;
93 ret = GET_ELEMENT (buffer, buffer->head);
94 buffer->head = (buffer->head + 1) % buffer->size;
95 buffer->n_elements--;
96 return ret;
99 gpointer
100 swfdec_ring_buffer_peek_nth (SwfdecRingBuffer *buffer, guint id)
102 g_return_val_if_fail (buffer != NULL, NULL);
103 g_return_val_if_fail (id < buffer->n_elements, NULL);
105 id = (buffer->head + id) % buffer->size;
106 return GET_ELEMENT (buffer, id);