| /* |
| Permission is hereby granted, free of charge, to any person |
| obtaining a copy of this software and associated documentation |
| files (the "Software"), to deal in the Software without |
| restriction, including without limitation the rights to use, |
| copy, modify, merge, publish, distribute, sublicense, and/or sell |
| copies of the Software, and to permit persons to whom the |
| Software is furnished to do so, subject to the following |
| conditions: |
| |
| The above copyright notice and this permission notice shall be |
| included in all copies or substantial portions of the Software. |
| |
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES |
| OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT |
| HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
| WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
| FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
| OTHER DEALINGS IN THE SOFTWARE. |
| */ |
| #include <string.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include "queue.h" |
| #include "types.h" |
| #include "vtr_memory.h" |
| |
| void ___queue_add(queue_t *q, void *item); |
| void *___queue_remove(queue_t *q); |
| void **___queue_remove_all(queue_t *q); |
| int ___queue_is_empty (queue_t *q); |
| void ___queue_destroy(queue_t *q); |
| |
| queue_t* create_queue() |
| { |
| queue_t *q = (queue_t *)vtr::malloc(sizeof(queue_t)); |
| |
| q->head = NULL; |
| q->tail = NULL; |
| q->count = 0; |
| |
| q->add = ___queue_add; |
| q->remove = ___queue_remove; |
| q->remove_all = ___queue_remove_all; |
| q->is_empty = ___queue_is_empty; |
| q->destroy = ___queue_destroy; |
| |
| return q; |
| } |
| |
| void ___queue_destroy(queue_t *q) |
| { |
| while (q->remove(q)); |
| vtr::free(q); |
| } |
| |
| void ___queue_add(queue_t *q, void *item) |
| { |
| queue_node_t *node = (queue_node_t *)vtr::malloc(sizeof(queue_node_t)); |
| |
| node->next = NULL; |
| node->item = item; |
| |
| if (q->tail) |
| q->tail->next = node; |
| |
| q->tail = node; |
| |
| if (!q->head) |
| q->head = node; |
| |
| q->count++; |
| } |
| |
| void* ___queue_remove(queue_t *q) |
| { |
| void *item = NULL; |
| if (!q->is_empty(q)) |
| { |
| queue_node_t *node = q->head; |
| item = node->item; |
| q->head = node->next; |
| vtr::free(node); |
| q->count--; |
| |
| if (!q->count) |
| { |
| q->head = NULL; |
| q->tail = NULL; |
| } |
| } |
| return item; |
| } |
| |
| void **___queue_remove_all(queue_t *q) |
| { |
| void **items = NULL; |
| if (!q->is_empty(q)) |
| { |
| items = (void **)vtr::malloc(q->count * sizeof(void *)); |
| int count = 0; |
| void *item; |
| while ((item = q->remove(q))) |
| items[count++] = item; |
| } |
| return items; |
| } |
| |
| int ___queue_is_empty (queue_t *q) |
| { |
| return !q->head; |
| } |