mirror of
https://github.com/tesseract-ocr/tesseract.git
synced 2024-11-28 05:39:35 +08:00
425d593ebe
git-svn-id: https://tesseract-ocr.googlecode.com/svn/trunk/trunk@2 d0cd1f9f-072b-0410-8dd7-cf729c803f20
127 lines
3.4 KiB
C
127 lines
3.4 KiB
C
/******************************************************************************
|
|
** Filename: heap.h
|
|
** Purpose: Definition of heap access routines.
|
|
** Author: Dan Johnson
|
|
** History: 3/13/89, DSJ, Created.
|
|
**
|
|
** (c) Copyright Hewlett-Packard Company, 1988.
|
|
** 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.
|
|
******************************************************************************/
|
|
#ifndef HEAP_H
|
|
#define HEAP_H
|
|
|
|
/**----------------------------------------------------------------------------
|
|
Include Files and Type Defines
|
|
----------------------------------------------------------------------------**/
|
|
#include "general.h"
|
|
#include "cutil.h"
|
|
|
|
#define HEAPFULL 3000
|
|
|
|
#define OK 0
|
|
#define EMPTY -1
|
|
|
|
typedef struct
|
|
{
|
|
FLOAT32 Key;
|
|
void *Data;
|
|
}
|
|
|
|
|
|
HEAPENTRY;
|
|
|
|
typedef struct
|
|
{
|
|
INT32 Size;
|
|
INT32 FirstFree;
|
|
HEAPENTRY Entry[1];
|
|
}
|
|
|
|
|
|
HEAP;
|
|
|
|
/**----------------------------------------------------------------------------
|
|
Macros
|
|
----------------------------------------------------------------------------**/
|
|
#define FreeHeap(H) memfree(H)
|
|
#define MaxSizeOfHeap(H) (H->Size)
|
|
#define SizeOfHeap(H) (H->FirstFree - 1)
|
|
#define InitHeap(H) (H->FirstFree = 1)
|
|
#define HeapFull(H) ((H)->FirstFree > (H)->Size)
|
|
#define HeapEmpty(H) ((H)->FirstFree <= 1)
|
|
|
|
/* macros for accessing elements in heap by index. The indicies vary from
|
|
0 to SizeOfHeap-1. No bounds checking is done. Elements accessed in
|
|
this manner are in random order relative to the Key values. These
|
|
macros should never be used as the LHS of an assignment statement as this
|
|
will corrupt the heap.*/
|
|
#define HeapKeyFor(H,E) ((H)->Entry[(E)+1].Key)
|
|
#define HeapDataFor(H,E) ((H)->Entry[(E)+1].Data)
|
|
|
|
/**----------------------------------------------------------------------------
|
|
Public Function Prototypes
|
|
----------------------------------------------------------------------------**/
|
|
HEAP *MakeHeap(int Size);
|
|
|
|
int HeapPop(HEAP *Heap, FLOAT32 *Key, void *out_ptr);
|
|
|
|
int HeapPopWorst(HEAP *Heap, FLOAT32 *Key, void *out_ptr);
|
|
|
|
void HeapPush(HEAP *Heap, FLOAT32 Key, void *Data);
|
|
|
|
void HeapStore(HEAP *Heap, HEAPENTRY *Entry);
|
|
|
|
int GetTopOfHeap(HEAP *Heap, HEAPENTRY *Entry);
|
|
|
|
void FreeHeapData(HEAP *Heap, void_dest destructor);
|
|
|
|
/*
|
|
#if defined(__STDC__) || defined(__cplusplus)
|
|
# define _ARGS(s) s
|
|
#else
|
|
# define _ARGS(s) ()
|
|
#endif*/
|
|
|
|
/* heap.c
|
|
HEAP *MakeHeap
|
|
_ARGS((int Size));
|
|
|
|
int HeapPop
|
|
_ARGS((HEAP *Heap,
|
|
FLOAT32 *Key,
|
|
char **Data));
|
|
|
|
int HeapPopWorst
|
|
_ARGS((HEAP *Heap,
|
|
FLOAT32 *Key,
|
|
char **Data));
|
|
|
|
void HeapPush
|
|
_ARGS((HEAP *Heap,
|
|
FLOAT32 Key,
|
|
char *Data));
|
|
|
|
void HeapStore
|
|
_ARGS((HEAP *Heap,
|
|
HEAPENTRY *Entry));
|
|
|
|
int GetTopOfHeap
|
|
_ARGS((HEAP *Heap,
|
|
HEAPENTRY *Entry));
|
|
|
|
void FreeHeapData
|
|
_ARGS((HEAP *Heap,
|
|
void (*Deallocator )()));
|
|
|
|
#undef _ARGS
|
|
*/
|
|
#endif
|