Path: blob/devel/elmergrid/src/metis-5.1.0/GKlib/gk_mkpqueue2.h
3206 views
/*!1\file gk_mkpqueue2.h2\brief Templates for priority queues that do not utilize locators and as such3they can use different types of values.45\date Started 4/09/076\author George7\version\verbatim $Id: gk_mkpqueue2.h 13005 2012-10-23 22:34:36Z karypis $ \endverbatim8*/91011#ifndef _GK_MKPQUEUE2_H12#define _GK_MKPQUEUE2_H131415#define GK_MKPQUEUE2(FPRFX, PQT, KT, VT, KMALLOC, VMALLOC, KMAX, KEY_LT)\16/*************************************************************************/\17/*! This function creates and initializes a priority queue */\18/**************************************************************************/\19PQT *FPRFX ## Create2(ssize_t maxnodes)\20{\21PQT *queue; \22\23if ((queue = (PQT *)gk_malloc(sizeof(PQT), "gk_pqCreate2: queue")) != NULL) {\24memset(queue, 0, sizeof(PQT));\25queue->nnodes = 0;\26queue->maxnodes = maxnodes;\27queue->keys = KMALLOC(maxnodes, "gk_pqCreate2: keys");\28queue->vals = VMALLOC(maxnodes, "gk_pqCreate2: vals");\29\30if (queue->keys == NULL || queue->vals == NULL)\31gk_free((void **)&queue->keys, &queue->vals, &queue, LTERM);\32}\33\34return queue;\35}\36\37\38/*************************************************************************/\39/*! This function resets the priority queue */\40/**************************************************************************/\41void FPRFX ## Reset2(PQT *queue)\42{\43queue->nnodes = 0;\44}\45\46\47/*************************************************************************/\48/*! This function frees the internal datastructures of the priority queue */\49/**************************************************************************/\50void FPRFX ## Destroy2(PQT **r_queue)\51{\52PQT *queue = *r_queue; \53if (queue == NULL) return;\54gk_free((void **)&queue->keys, &queue->vals, &queue, LTERM);\55*r_queue = NULL;\56}\57\58\59/*************************************************************************/\60/*! This function returns the length of the queue */\61/**************************************************************************/\62size_t FPRFX ## Length2(PQT *queue)\63{\64return queue->nnodes;\65}\66\67\68/*************************************************************************/\69/*! This function adds an item in the priority queue. */\70/**************************************************************************/\71int FPRFX ## Insert2(PQT *queue, VT val, KT key)\72{\73ssize_t i, j;\74KT *keys=queue->keys;\75VT *vals=queue->vals;\76\77ASSERT2(FPRFX ## CheckHeap2(queue));\78\79if (queue->nnodes == queue->maxnodes) \80return 0;\81\82ASSERT2(FPRFX ## CheckHeap2(queue));\83\84i = queue->nnodes++;\85while (i > 0) {\86j = (i-1)>>1;\87if (KEY_LT(key, keys[j])) {\88keys[i] = keys[j];\89vals[i] = vals[j];\90i = j;\91}\92else\93break;\94}\95ASSERT(i >= 0);\96keys[i] = key;\97vals[i] = val;\98\99ASSERT2(FPRFX ## CheckHeap2(queue));\100\101return 1;\102}\103\104\105/*************************************************************************/\106/*! This function returns the item at the top of the queue and removes\107it from the priority queue */\108/**************************************************************************/\109int FPRFX ## GetTop2(PQT *queue, VT *r_val)\110{\111ssize_t i, j;\112KT key, *keys=queue->keys;\113VT val, *vals=queue->vals;\114\115ASSERT2(FPRFX ## CheckHeap2(queue));\116\117if (queue->nnodes == 0)\118return 0;\119\120queue->nnodes--;\121\122*r_val = vals[0];\123\124if ((i = queue->nnodes) > 0) {\125key = keys[i];\126val = vals[i];\127i = 0;\128while ((j=2*i+1) < queue->nnodes) {\129if (KEY_LT(keys[j], key)) {\130if (j+1 < queue->nnodes && KEY_LT(keys[j+1], keys[j]))\131j = j+1;\132keys[i] = keys[j];\133vals[i] = vals[j];\134i = j;\135}\136else if (j+1 < queue->nnodes && KEY_LT(keys[j+1], key)) {\137j = j+1;\138keys[i] = keys[j];\139vals[i] = vals[j];\140i = j;\141}\142else\143break;\144}\145\146keys[i] = key;\147vals[i] = val;\148}\149\150ASSERT2(FPRFX ## CheckHeap2(queue));\151\152return 1;\153}\154\155\156/*************************************************************************/\157/*! This function returns the item at the top of the queue. The item is not\158deleted from the queue. */\159/**************************************************************************/\160int FPRFX ## SeeTopVal2(PQT *queue, VT *r_val)\161{\162if (queue->nnodes == 0) \163return 0;\164\165*r_val = queue->vals[0];\166\167return 1;\168}\169\170\171/*************************************************************************/\172/*! This function returns the key of the top item. The item is not\173deleted from the queue. */\174/**************************************************************************/\175KT FPRFX ## SeeTopKey2(PQT *queue)\176{\177return (queue->nnodes == 0 ? KMAX : queue->keys[0]);\178}\179\180\181/*************************************************************************/\182/*! This functions checks the consistency of the heap */\183/**************************************************************************/\184int FPRFX ## CheckHeap2(PQT *queue)\185{\186ssize_t i;\187KT *keys=queue->keys;\188\189if (queue->nnodes == 0)\190return 1;\191\192for (i=1; i<queue->nnodes; i++) {\193ASSERT(!KEY_LT(keys[i], keys[(i-1)/2]));\194}\195for (i=1; i<queue->nnodes; i++)\196ASSERT(!KEY_LT(keys[i], keys[0]));\197\198return 1;\199}\200201202#define GK_MKPQUEUE2_PROTO(FPRFX, PQT, KT, VT)\203PQT * FPRFX ## Create2(ssize_t maxnodes);\204void FPRFX ## Reset2(PQT *queue);\205void FPRFX ## Destroy2(PQT **r_queue);\206size_t FPRFX ## Length2(PQT *queue);\207int FPRFX ## Insert2(PQT *queue, VT node, KT key);\208int FPRFX ## GetTop2(PQT *queue, VT *r_val);\209int FPRFX ## SeeTopVal2(PQT *queue, VT *r_val);\210KT FPRFX ## SeeTopKey2(PQT *queue);\211int FPRFX ## CheckHeap2(PQT *queue);\212213214#endif215216217