7 #include "swfdec_ringbuffer.h"
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
;
20 buffer
->data
= g_malloc (element_size
* size
);
26 swfdec_ring_buffer_free (SwfdecRingBuffer
*buffer
)
28 g_return_if_fail (buffer
!= NULL
);
30 g_free (buffer
->data
);
35 swfdec_ring_buffer_get_size (SwfdecRingBuffer
*buffer
)
37 g_return_val_if_fail (buffer
!= NULL
, 0);
42 #define GET_ELEMENT(buffer,idx) (buffer->data + buffer->element_size * (idx))
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
;
60 swfdec_ring_buffer_get_n_elements (SwfdecRingBuffer
*buffer
)
62 g_return_val_if_fail (buffer
!= NULL
, 0);
64 return buffer
->n_elements
;
68 swfdec_ring_buffer_push (SwfdecRingBuffer
*buffer
)
72 g_return_val_if_fail (buffer
!= NULL
, NULL
);
74 if (buffer
->n_elements
== buffer
->size
)
77 ret
= GET_ELEMENT (buffer
, buffer
->tail
);
78 buffer
->tail
= (buffer
->tail
+ 1) % buffer
->size
;
84 swfdec_ring_buffer_pop (SwfdecRingBuffer
*buffer
)
88 g_return_val_if_fail (buffer
!= NULL
, NULL
);
90 if (buffer
->n_elements
== 0)
93 ret
= GET_ELEMENT (buffer
, buffer
->head
);
94 buffer
->head
= (buffer
->head
+ 1) % buffer
->size
;
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
);