mirror of
https://github.com/MariaDB/server.git
synced 2025-01-15 19:42:28 +01:00
88 lines
3.4 KiB
C
88 lines
3.4 KiB
C
/* Copyright (C) 2010 Monty Program Ab
|
|
All Rights reserved
|
|
|
|
Redistribution and use in source and binary forms, with or without
|
|
modification, are permitted provided that the following conditions are met:
|
|
* Redistributions of source code must retain the above copyright
|
|
notice, this list of conditions and the following disclaimer.
|
|
* Redistributions in binary form must reproduce 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
|
|
<COPYRIGHT HOLDER> 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.
|
|
*/
|
|
|
|
/*
|
|
Code for general handling of priority Queues.
|
|
Implementation of queues from "Algorithms in C" by Robert Sedgewick.
|
|
*/
|
|
|
|
#ifndef _queues_h
|
|
#define _queues_h
|
|
|
|
#include <my_cmp.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
typedef struct st_queue {
|
|
uchar **root;
|
|
void *first_cmp_arg;
|
|
uint elements;
|
|
uint max_elements;
|
|
uint offset_to_key; /* compare is done on element+offset */
|
|
uint offset_to_queue_pos; /* If we want to store position in element */
|
|
uint auto_extent;
|
|
int max_at_top; /* Normally 1, set to -1 if queue_top gives max */
|
|
qsort_cmp2 compare;
|
|
} QUEUE;
|
|
|
|
#define queue_first_element(queue) 1
|
|
#define queue_last_element(queue) (queue)->elements
|
|
#define queue_empty(queue) ((queue)->elements == 0)
|
|
#define queue_top(queue) ((queue)->root[1])
|
|
#define queue_element(queue,index) ((queue)->root[index])
|
|
#define queue_end(queue) ((queue)->root[(queue)->elements])
|
|
#define queue_replace_top(queue) _downheap(queue, 1)
|
|
#define queue_set_cmp_arg(queue, set_arg) (queue)->first_cmp_arg= set_arg
|
|
#define queue_set_max_at_top(queue, set_arg) \
|
|
(queue)->max_at_top= set_arg ? -1 : 1
|
|
#define queue_remove_top(queue_arg) queue_remove((queue_arg), queue_first_element(queue_arg))
|
|
|
|
int init_queue(QUEUE *queue,uint max_elements,uint offset_to_key,
|
|
my_bool max_at_top, qsort_cmp2 compare,
|
|
void *first_cmp_arg, uint offset_to_queue_pos,
|
|
uint auto_extent);
|
|
int reinit_queue(QUEUE *queue,uint max_elements,uint offset_to_key,
|
|
my_bool max_at_top, qsort_cmp2 compare,
|
|
void *first_cmp_arg, uint offset_to_queue_pos,
|
|
uint auto_extent);
|
|
int resize_queue(QUEUE *queue, uint max_elements);
|
|
void delete_queue(QUEUE *queue);
|
|
void queue_insert(QUEUE *queue, uchar *element);
|
|
int queue_insert_safe(QUEUE *queue, uchar *element);
|
|
uchar *queue_remove(QUEUE *queue,uint idx);
|
|
void queue_replace(QUEUE *queue,uint idx);
|
|
|
|
#define queue_remove_all(queue) { (queue)->elements= 0; }
|
|
#define queue_is_full(queue) ((queue)->elements == (queue)->max_elements)
|
|
void _downheap(QUEUE *queue, uint idx);
|
|
void queue_fix(QUEUE *queue);
|
|
#define is_queue_inited(queue) ((queue)->root != 0)
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif
|