| 1 | /* Copyright (C) 2010 Monty Program Ab |
| 2 | All Rights reserved |
| 3 | |
| 4 | Redistribution and use in source and binary forms, with or without |
| 5 | modification, are permitted provided that the following conditions are met: |
| 6 | * Redistributions of source code must retain the above copyright |
| 7 | notice, this list of conditions and the following disclaimer. |
| 8 | * Redistributions in binary form must reproduce the following disclaimer |
| 9 | in the documentation and/or other materials provided with the |
| 10 | distribution. |
| 11 | |
| 12 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| 13 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| 14 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS |
| 15 | FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL |
| 16 | <COPYRIGHT HOLDER> BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| 17 | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| 18 | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF |
| 19 | USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
| 20 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
| 21 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT |
| 22 | OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
| 23 | SUCH DAMAGE. |
| 24 | */ |
| 25 | |
| 26 | /* |
| 27 | Code for generell handling of priority Queues. |
| 28 | Implementation of queues from "Algorithms in C" by Robert Sedgewick. |
| 29 | */ |
| 30 | |
| 31 | #ifndef _queues_h |
| 32 | #define _queues_h |
| 33 | |
| 34 | #ifdef __cplusplus |
| 35 | extern "C" { |
| 36 | #endif |
| 37 | |
| 38 | typedef struct st_queue { |
| 39 | uchar **root; |
| 40 | void *first_cmp_arg; |
| 41 | uint elements; |
| 42 | uint max_elements; |
| 43 | uint offset_to_key; /* compare is done on element+offset */ |
| 44 | uint offset_to_queue_pos; /* If we want to store position in element */ |
| 45 | uint auto_extent; |
| 46 | int max_at_top; /* Normally 1, set to -1 if queue_top gives max */ |
| 47 | int (*compare)(void *, uchar *,uchar *); |
| 48 | } QUEUE; |
| 49 | |
| 50 | #define queue_first_element(queue) 1 |
| 51 | #define queue_last_element(queue) (queue)->elements |
| 52 | #define queue_empty(queue) ((queue)->elements == 0) |
| 53 | #define queue_top(queue) ((queue)->root[1]) |
| 54 | #define queue_element(queue,index) ((queue)->root[index]) |
| 55 | #define queue_end(queue) ((queue)->root[(queue)->elements]) |
| 56 | #define queue_replace_top(queue) _downheap(queue, 1, (queue)->root[1]) |
| 57 | #define queue_set_cmp_arg(queue, set_arg) (queue)->first_cmp_arg= set_arg |
| 58 | #define queue_set_max_at_top(queue, set_arg) \ |
| 59 | (queue)->max_at_top= set_arg ? -1 : 1 |
| 60 | #define queue_remove_top(queue_arg) queue_remove((queue_arg), queue_first_element(queue_arg)) |
| 61 | typedef int (*queue_compare)(void *,uchar *, uchar *); |
| 62 | |
| 63 | int init_queue(QUEUE *queue,uint max_elements,uint offset_to_key, |
| 64 | pbool max_at_top, queue_compare compare, |
| 65 | void *first_cmp_arg, uint offset_to_queue_pos, |
| 66 | uint auto_extent); |
| 67 | int reinit_queue(QUEUE *queue,uint max_elements,uint offset_to_key, |
| 68 | pbool max_at_top, queue_compare compare, |
| 69 | void *first_cmp_arg, uint offset_to_queue_pos, |
| 70 | uint auto_extent); |
| 71 | int resize_queue(QUEUE *queue, uint max_elements); |
| 72 | void delete_queue(QUEUE *queue); |
| 73 | void queue_insert(QUEUE *queue,uchar *element); |
| 74 | int queue_insert_safe(QUEUE *queue, uchar *element); |
| 75 | uchar *queue_remove(QUEUE *queue,uint idx); |
| 76 | void queue_replace(QUEUE *queue,uint idx); |
| 77 | |
| 78 | #define queue_remove_all(queue) { (queue)->elements= 0; } |
| 79 | #define queue_is_full(queue) (queue->elements == queue->max_elements) |
| 80 | void _downheap(QUEUE *queue, uint idx, uchar *element); |
| 81 | void queue_fix(QUEUE *queue); |
| 82 | #define is_queue_inited(queue) ((queue)->root != 0) |
| 83 | |
| 84 | #ifdef __cplusplus |
| 85 | } |
| 86 | #endif |
| 87 | #endif |
| 88 | |