diff options
| author | Omar Rizwan <omar@omar.website> | 2023-09-06 09:44:09 +0000 |
|---|---|---|
| committer | Omar Rizwan <omar@omar.website> | 2023-09-06 09:44:09 +0000 |
| commit | 9ebac6f7ca740f916abd9ca457fe4dca55016417 (patch) | |
| tree | a7be3c327af7a701f5b65fd0010f6ea1abda5699 /vendor/libpqueue/pqueue.h | |
| parent | Merge branch 'main' into osnr/operation-log (diff) | |
| download | folk-9ebac6f7ca740f916abd9ca457fe4dca55016417.tar.gz folk-9ebac6f7ca740f916abd9ca457fe4dca55016417.zip | |
WIP: Start work on pqueue-based evaluator
Need to fix ordering of entries with same priority.
Diffstat (limited to 'vendor/libpqueue/pqueue.h')
| -rw-r--r-- | vendor/libpqueue/pqueue.h | 193 |
1 files changed, 193 insertions, 0 deletions
diff --git a/vendor/libpqueue/pqueue.h b/vendor/libpqueue/pqueue.h new file mode 100644 index 00000000..dadc43b8 --- /dev/null +++ b/vendor/libpqueue/pqueue.h @@ -0,0 +1,193 @@ +/* + * Copyright (c) 2014, Volkan Yazıcı <volkan.yazici@gmail.com> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +/** + * @file pqueue.h + * @brief Priority Queue function declarations + * + * @{ + */ + + +#ifndef PQUEUE_H +#define PQUEUE_H + +/** priority data type */ +typedef unsigned long long pqueue_pri_t; + +/** callback functions to get/set/compare the priority of an element */ +typedef pqueue_pri_t (*pqueue_get_pri_f)(void *a); +typedef void (*pqueue_set_pri_f)(void *a, pqueue_pri_t pri); +typedef int (*pqueue_cmp_pri_f)(pqueue_pri_t next, pqueue_pri_t curr); + + +/** callback functions to get/set the position of an element */ +typedef size_t (*pqueue_get_pos_f)(void *a); +typedef void (*pqueue_set_pos_f)(void *a, size_t pos); + + +/** debug callback function to print a entry */ +typedef void (*pqueue_print_entry_f)(FILE *out, void *a); + + +/** the priority queue handle */ +typedef struct pqueue_t +{ + size_t size; /**< number of elements in this queue */ + size_t avail; /**< slots available in this queue */ + size_t step; /**< growth stepping setting */ + pqueue_cmp_pri_f cmppri; /**< callback to compare nodes */ + pqueue_get_pri_f getpri; /**< callback to get priority of a node */ + pqueue_set_pri_f setpri; /**< callback to set priority of a node */ + pqueue_get_pos_f getpos; /**< callback to get position of a node */ + pqueue_set_pos_f setpos; /**< callback to set position of a node */ + void **d; /**< The actualy queue in binary heap form */ +} pqueue_t; + + +/** + * initialize the queue + * + * @param n the initial estimate of the number of queue items for which memory + * should be preallocated + * @param cmppri The callback function to run to compare two elements + * This callback should return 0 for 'lower' and non-zero + * for 'higher', or vice versa if reverse priority is desired + * @param setpri the callback function to run to assign a score to an element + * @param getpri the callback function to run to set a score to an element + * @param getpos the callback function to get the current element's position + * @param setpos the callback function to set the current element's position + * + * @return the handle or NULL for insufficent memory + */ +pqueue_t * +pqueue_init(size_t n, + pqueue_cmp_pri_f cmppri, + pqueue_get_pri_f getpri, + pqueue_set_pri_f setpri, + pqueue_get_pos_f getpos, + pqueue_set_pos_f setpos); + + +/** + * free all memory used by the queue + * @param q the queue + */ +void pqueue_free(pqueue_t *q); + + +/** + * return the size of the queue. + * @param q the queue + */ +size_t pqueue_size(pqueue_t *q); + + +/** + * insert an item into the queue. + * @param q the queue + * @param d the item + * @return 0 on success + */ +int pqueue_insert(pqueue_t *q, void *d); + + +/** + * move an existing entry to a different priority + * @param q the queue + * @param new_pri the new priority + * @param d the entry + */ +void +pqueue_change_priority(pqueue_t *q, + pqueue_pri_t new_pri, + void *d); + + +/** + * pop the highest-ranking item from the queue. + * @param q the queue + * @return NULL on error, otherwise the entry + */ +void *pqueue_pop(pqueue_t *q); + + +/** + * remove an item from the queue. + * @param q the queue + * @param d the entry + * @return 0 on success + */ +int pqueue_remove(pqueue_t *q, void *d); + + +/** + * access highest-ranking item without removing it. + * @param q the queue + * @return NULL on error, otherwise the entry + */ +void *pqueue_peek(pqueue_t *q); + + +/** + * print the queue + * @internal + * DEBUG function only + * @param q the queue + * @param out the output handle + * @param the callback function to print the entry + */ +void +pqueue_print(pqueue_t *q, + FILE *out, + pqueue_print_entry_f print); + + +/** + * dump the queue and it's internal structure + * @internal + * debug function only + * @param q the queue + * @param out the output handle + * @param the callback function to print the entry + */ +void +pqueue_dump(pqueue_t *q, + FILE *out, + pqueue_print_entry_f print); + + +/** + * checks that the pq is in the right order, etc + * @internal + * debug function only + * @param q the queue + */ +int pqueue_is_valid(pqueue_t *q); + + +#endif /* PQUEUE_H */ +/** @} */ |
