|
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
|
// use this file except in compliance with the License. You may obtain a copy of
|
|
// the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
// License for the specific language governing permissions and limitations under
|
|
// the License.
|
|
|
|
#pragma once
|
|
|
|
|
|
#include <stdint.h>
|
|
|
|
#define HQ_VERSION 0
|
|
#define HQ_SCALE_FACTOR 2 // heap expansion scale factor
|
|
|
|
|
|
// Override the default memory allocator to use the Erlang versions.
|
|
// This bubbles up memory usage for the NIF into Erlang stats.
|
|
#ifdef HQ_ENIF_ALLOC
|
|
|
|
#include "erl_nif.h"
|
|
|
|
#define HQUEUE_ALLOC enif_alloc
|
|
#define HQUEUE_FREE enif_free
|
|
|
|
#else
|
|
|
|
#define HQUEUE_ALLOC malloc
|
|
#define HQUEUE_FREE free
|
|
|
|
#endif
|
|
|
|
|
|
typedef struct hqnode hqnode_t;
|
|
typedef struct hqueue hqueue_t;
|
|
|
|
|
|
hqueue_t* hqueue_new(uint32_t max_elems, uint32_t heap_size);
|
|
|
|
void hqueue_free(hqueue_t* hqueue);
|
|
void hqueue_free2(hqueue_t* hqueue, void (*free_node)(void* node));
|
|
|
|
int hqueue_insert(hqueue_t* hqueue, double priority, void* val);
|
|
int hqueue_extract_max(hqueue_t* hqueue, double* priority, void** value);
|
|
void hqueue_get_elem(hqueue_t* hqueue, uint32_t idx, double *priority,
|
|
void** value);
|
|
|
|
uint32_t hqueue_size(hqueue_t* hqueue);
|
|
uint32_t hqueue_heap_size(hqueue_t* hqueue);
|
|
|
|
uint32_t hqueue_max_elems(hqueue_t* hqueue);
|
|
int hqueue_set_max_elems(hqueue_t* hqueue, uint32_t new_max_elems);
|
|
|
|
void hqueue_scale_by(hqueue_t* hqueue, double factor);
|
|
uint32_t hqueue_resize_heap(hqueue_t* hqueue, uint32_t new_heap_size);
|