mirror of
https://github.com/MariaDB/server.git
synced 2026-05-06 23:25:34 +02:00
Remove ut0bh.h and ut0bh.c and re-add so that we can sync the file ids with
the trunk.
This commit is contained in:
parent
da66465afd
commit
c08a820d14
2 changed files with 0 additions and 316 deletions
|
|
@ -1,152 +0,0 @@
|
||||||
/***************************************************************************//**
|
|
||||||
|
|
||||||
Copyright (c) 2011, Oracle Corpn. All Rights Reserved.
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it under
|
|
||||||
the terms of the GNU General Public License as published by the Free Software
|
|
||||||
Foundation; version 2 of the License.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
||||||
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along with
|
|
||||||
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
|
||||||
Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
/******************************************************************//**
|
|
||||||
@file include/ut0bh.h
|
|
||||||
Binary min-heap interface.
|
|
||||||
|
|
||||||
Created 2010-05-28 by Sunny Bains
|
|
||||||
*******************************************************/
|
|
||||||
|
|
||||||
#ifndef INNOBASE_UT0BH_H
|
|
||||||
#define INNOBASE_UT0BH_H
|
|
||||||
|
|
||||||
#include "univ.i"
|
|
||||||
|
|
||||||
/** Comparison function for objects in the binary heap. */
|
|
||||||
typedef int (*ib_bh_cmp_t)(const void* p1, const void* p2);
|
|
||||||
|
|
||||||
typedef struct ib_bh_struct ib_bh_t;
|
|
||||||
|
|
||||||
/**********************************************************************//**
|
|
||||||
Get the number of elements in the binary heap.
|
|
||||||
@return number of elements */
|
|
||||||
UNIV_INLINE
|
|
||||||
ulint
|
|
||||||
ib_bh_size(
|
|
||||||
/*=======*/
|
|
||||||
const ib_bh_t* ib_bh); /*!< in: instance */
|
|
||||||
|
|
||||||
/**********************************************************************//**
|
|
||||||
Test if binary heap is empty.
|
|
||||||
@return TRUE if empty. */
|
|
||||||
UNIV_INLINE
|
|
||||||
ibool
|
|
||||||
ib_bh_is_empty(
|
|
||||||
/*===========*/
|
|
||||||
const ib_bh_t* ib_bh); /*!< in: instance */
|
|
||||||
|
|
||||||
/**********************************************************************//**
|
|
||||||
Test if binary heap is full.
|
|
||||||
@return TRUE if full. */
|
|
||||||
UNIV_INLINE
|
|
||||||
ibool
|
|
||||||
ib_bh_is_full(
|
|
||||||
/*===========*/
|
|
||||||
const ib_bh_t* ib_bh); /*!< in: instance */
|
|
||||||
|
|
||||||
/**********************************************************************//**
|
|
||||||
Get a pointer to the element.
|
|
||||||
@return pointer to element */
|
|
||||||
UNIV_INLINE
|
|
||||||
void*
|
|
||||||
ib_bh_get(
|
|
||||||
/*=======*/
|
|
||||||
ib_bh_t* ib_bh, /*!< in: instance */
|
|
||||||
ulint i); /*!< in: index */
|
|
||||||
|
|
||||||
/**********************************************************************//**
|
|
||||||
Copy an element to the binary heap.
|
|
||||||
@return pointer to copied element */
|
|
||||||
UNIV_INLINE
|
|
||||||
void*
|
|
||||||
ib_bh_set(
|
|
||||||
/*======*/
|
|
||||||
ib_bh_t* ib_bh, /*!< in/out: instance */
|
|
||||||
ulint i, /*!< in: index */
|
|
||||||
const void* elem); /*!< in: element to add */
|
|
||||||
|
|
||||||
/**********************************************************************//**
|
|
||||||
Return the first element from the binary heap.
|
|
||||||
@return pointer to first element or NULL if empty. */
|
|
||||||
UNIV_INLINE
|
|
||||||
void*
|
|
||||||
ib_bh_first(
|
|
||||||
/*========*/
|
|
||||||
ib_bh_t* ib_bh); /*!< in: instance */
|
|
||||||
|
|
||||||
/**********************************************************************//**
|
|
||||||
Return the last element from the binary heap.
|
|
||||||
@return pointer to last element or NULL if empty. */
|
|
||||||
UNIV_INLINE
|
|
||||||
void*
|
|
||||||
ib_bh_last(
|
|
||||||
/*========*/
|
|
||||||
ib_bh_t* ib_bh); /*!< in/out: instance */
|
|
||||||
|
|
||||||
/**********************************************************************//**
|
|
||||||
Create a binary heap.
|
|
||||||
@return a new binary heap */
|
|
||||||
UNIV_INTERN
|
|
||||||
ib_bh_t*
|
|
||||||
ib_bh_create(
|
|
||||||
/*=========*/
|
|
||||||
ib_bh_cmp_t compare, /*!< in: comparator */
|
|
||||||
ulint sizeof_elem, /*!< in: size of one element */
|
|
||||||
ulint max_elems); /*!< in: max elements allowed */
|
|
||||||
|
|
||||||
/**********************************************************************//**
|
|
||||||
Free a binary heap.
|
|
||||||
@return a new binary heap */
|
|
||||||
UNIV_INTERN
|
|
||||||
void
|
|
||||||
ib_bh_free(
|
|
||||||
/*=======*/
|
|
||||||
ib_bh_t* ib_bh); /*!< in,own: instance */
|
|
||||||
|
|
||||||
/**********************************************************************//**
|
|
||||||
Add an element to the binary heap. Note: The element is copied.
|
|
||||||
@return pointer to added element or NULL if full. */
|
|
||||||
UNIV_INTERN
|
|
||||||
void*
|
|
||||||
ib_bh_push(
|
|
||||||
/*=======*/
|
|
||||||
ib_bh_t* ib_bh, /*!< in/out: instance */
|
|
||||||
const void* elem); /*!< in: element to add */
|
|
||||||
|
|
||||||
/**********************************************************************//**
|
|
||||||
Remove the first element from the binary heap. */
|
|
||||||
UNIV_INTERN
|
|
||||||
void
|
|
||||||
ib_bh_pop(
|
|
||||||
/*======*/
|
|
||||||
ib_bh_t* ib_bh); /*!< in/out: instance */
|
|
||||||
|
|
||||||
/** Binary heap data structure */
|
|
||||||
struct ib_bh_struct {
|
|
||||||
ulint max_elems; /*!< max elements allowed */
|
|
||||||
ulint n_elems; /*!< current size */
|
|
||||||
ulint sizeof_elem; /*!< sizeof element */
|
|
||||||
ib_bh_cmp_t compare; /*!< comparator */
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifndef UNIV_NONINL
|
|
||||||
#include "ut0bh.ic"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* INNOBASE_UT0BH_H */
|
|
||||||
|
|
@ -1,164 +0,0 @@
|
||||||
/***************************************************************************//**
|
|
||||||
Copyright (c) 2010, 2011, Oracle Corpn. All Rights Reserved.
|
|
||||||
|
|
||||||
Portions of this file contain modifications contributed and copyrighted by
|
|
||||||
Sun Microsystems, Inc. Those modifications are gratefully acknowledged and
|
|
||||||
are described briefly in the InnoDB documentation. The contributions by
|
|
||||||
Sun Microsystems are incorporated with their permission, and subject to the
|
|
||||||
conditions contained in the file COPYING.Sun_Microsystems.
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it under
|
|
||||||
the terms of the GNU General Public License as published by the Free Software
|
|
||||||
Foundation; version 2 of the License.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
||||||
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along with
|
|
||||||
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
|
||||||
Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
/******************************************************************//**
|
|
||||||
@file ut/ut0bh.c
|
|
||||||
Binary min-heap implementation.
|
|
||||||
|
|
||||||
Created 2010-05-28 by Sunny Bains
|
|
||||||
*******************************************************/
|
|
||||||
|
|
||||||
#include "ut0bh.h"
|
|
||||||
#include "ut0mem.h"
|
|
||||||
|
|
||||||
#ifdef UNIV_NONINL
|
|
||||||
#include "ut0bh.ic"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
/**********************************************************************//**
|
|
||||||
Create a binary heap.
|
|
||||||
@return a new binary heap */
|
|
||||||
UNIV_INTERN
|
|
||||||
ib_bh_t*
|
|
||||||
ib_bh_create(
|
|
||||||
/*=========*/
|
|
||||||
ib_bh_cmp_t compare, /*!< in: comparator */
|
|
||||||
ulint sizeof_elem, /*!< in: size of one element */
|
|
||||||
ulint max_elems) /*!< in: max elements allowed */
|
|
||||||
{
|
|
||||||
ulint sz;
|
|
||||||
ib_bh_t* ib_bh;
|
|
||||||
|
|
||||||
sz = sizeof(*ib_bh) + (sizeof_elem * max_elems);
|
|
||||||
|
|
||||||
ib_bh = (ib_bh_t*) ut_malloc(sz);
|
|
||||||
memset(ib_bh, 0x0, sz);
|
|
||||||
|
|
||||||
ib_bh->compare = compare;
|
|
||||||
ib_bh->max_elems = max_elems;
|
|
||||||
ib_bh->sizeof_elem = sizeof_elem;
|
|
||||||
|
|
||||||
return(ib_bh);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**********************************************************************//**
|
|
||||||
Free a binary heap.
|
|
||||||
@return a new binary heap */
|
|
||||||
UNIV_INTERN
|
|
||||||
void
|
|
||||||
ib_bh_free(
|
|
||||||
/*=======*/
|
|
||||||
ib_bh_t* ib_bh) /*!< in/own: instance */
|
|
||||||
{
|
|
||||||
ut_free(ib_bh);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**********************************************************************//**
|
|
||||||
Add an element to the binary heap. Note: The element is copied.
|
|
||||||
@return pointer to added element or NULL if full. */
|
|
||||||
UNIV_INTERN
|
|
||||||
void*
|
|
||||||
ib_bh_push(
|
|
||||||
/*=======*/
|
|
||||||
ib_bh_t* ib_bh, /*!< in/out: instance */
|
|
||||||
const void* elem) /*!< in: element to add */
|
|
||||||
{
|
|
||||||
void* ptr;
|
|
||||||
|
|
||||||
if (ib_bh_is_full(ib_bh)) {
|
|
||||||
return(NULL);
|
|
||||||
} else if (ib_bh_is_empty(ib_bh)) {
|
|
||||||
++ib_bh->n_elems;
|
|
||||||
return(ib_bh_set(ib_bh, 0, elem));
|
|
||||||
} else {
|
|
||||||
ulint i;
|
|
||||||
|
|
||||||
i = ib_bh->n_elems;
|
|
||||||
|
|
||||||
++ib_bh->n_elems;
|
|
||||||
|
|
||||||
for (ptr = ib_bh_get(ib_bh, i >> 1);
|
|
||||||
i > 0 && ib_bh->compare(ptr, elem) > 0;
|
|
||||||
i >>= 1, ptr = ib_bh_get(ib_bh, i >> 1)) {
|
|
||||||
|
|
||||||
ib_bh_set(ib_bh, i, ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
ptr = ib_bh_set(ib_bh, i, elem);
|
|
||||||
}
|
|
||||||
|
|
||||||
return(ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**********************************************************************//**
|
|
||||||
Remove the first element from the binary heap. */
|
|
||||||
UNIV_INTERN
|
|
||||||
void
|
|
||||||
ib_bh_pop(
|
|
||||||
/*======*/
|
|
||||||
ib_bh_t* ib_bh) /*!< in/out: instance */
|
|
||||||
{
|
|
||||||
byte* ptr;
|
|
||||||
byte* last;
|
|
||||||
ulint parent = 0;
|
|
||||||
|
|
||||||
if (ib_bh_is_empty(ib_bh)) {
|
|
||||||
return;
|
|
||||||
} else if (ib_bh_size(ib_bh) == 1) {
|
|
||||||
--ib_bh->n_elems;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
last = (byte*) ib_bh_last(ib_bh);
|
|
||||||
|
|
||||||
/* Start from the child node */
|
|
||||||
ptr = (byte*) ib_bh_get(ib_bh, 1);
|
|
||||||
|
|
||||||
while (ptr < last) {
|
|
||||||
/* If the "right" child node is < "left" child node */
|
|
||||||
if (ib_bh->compare(ptr + ib_bh->sizeof_elem, ptr) < 0) {
|
|
||||||
ptr += ib_bh->sizeof_elem;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ib_bh->compare(last, ptr) <= 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
ib_bh_set(ib_bh, parent, ptr);
|
|
||||||
|
|
||||||
parent = (ptr - (byte*) ib_bh_first(ib_bh))
|
|
||||||
/ ib_bh->sizeof_elem;
|
|
||||||
|
|
||||||
if ((parent << 1) >= ib_bh_size(ib_bh)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
ptr = (byte*) ib_bh_get(ib_bh, parent << 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
--ib_bh->n_elems;
|
|
||||||
|
|
||||||
ib_bh_set(ib_bh, parent, last);
|
|
||||||
}
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue