ReactOS 0.4.16-dev-2546-g56481e1
tif_hash_set.h File Reference
#include <stdbool.h>
Include dependency graph for tif_hash_set.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Typedefs

typedef struct _TIFFHashSet TIFFHashSet
 
typedef unsigned long(* TIFFHashSetHashFunc) (const void *elt)
 
typedef bool(* TIFFHashSetEqualFunc) (const void *elt1, const void *elt2)
 
typedef void(* TIFFHashSetFreeEltFunc) (void *elt)
 

Functions

TIFFHashSetTIFFHashSetNew (TIFFHashSetHashFunc fnHashFunc, TIFFHashSetEqualFunc fnEqualFunc, TIFFHashSetFreeEltFunc fnFreeEltFunc)
 
void TIFFHashSetDestroy (TIFFHashSet *set)
 
int TIFFHashSetSize (const TIFFHashSet *set)
 
bool TIFFHashSetInsert (TIFFHashSet *set, void *elt)
 
voidTIFFHashSetLookup (TIFFHashSet *set, const void *elt)
 
bool TIFFHashSetRemove (TIFFHashSet *set, const void *elt)
 

Detailed Description

Hash set implementation.

An hash set is a data structure that holds elements that are unique according to a comparison function. Operations on the hash set, such as insertion, removal or lookup, are supposed to be fast if an efficient "hash" function is provided.

Definition in file tif_hash_set.h.

Typedef Documentation

◆ TIFFHashSet

Opaque type for a hash set

Definition at line 55 of file tif_hash_set.h.

◆ TIFFHashSetEqualFunc

typedef bool(* TIFFHashSetEqualFunc) (const void *elt1, const void *elt2)

TIFFHashSetEqualFunc

Definition at line 61 of file tif_hash_set.h.

◆ TIFFHashSetFreeEltFunc

typedef void(* TIFFHashSetFreeEltFunc) (void *elt)

TIFFHashSetFreeEltFunc

Definition at line 64 of file tif_hash_set.h.

◆ TIFFHashSetHashFunc

typedef unsigned long(* TIFFHashSetHashFunc) (const void *elt)

TIFFHashSetHashFunc

Definition at line 58 of file tif_hash_set.h.

Function Documentation

◆ TIFFHashSetDestroy()

void TIFFHashSetDestroy ( TIFFHashSet set)

Destroys an allocated hash set.

This function also frees the elements if a free function was provided at the creation of the hash set.

Parameters
setthe hash set

Definition at line 285 of file tif_hash_set.c.

286{
287 if (set)
288 {
290 free(set->tabList);
291 TIFFListDestroy(set->psRecyclingList);
292 free(set);
293 }
294}
Definition: _set.h:50
#define free
Definition: debug_ros.c:5
static void TIFFListDestroy(TIFFList *psList)
Definition: tif_hash_set.c:260
static void TIFFHashSetClearInternal(TIFFHashSet *set, bool bFinalize)
Definition: tif_hash_set.c:226

Referenced by _TIFFCleanupIFDOffsetAndNumberMaps().

◆ TIFFHashSetInsert()

bool TIFFHashSetInsert ( TIFFHashSet set,
void elt 
)

Inserts an element into a hash set.

If the element was already inserted in the hash set, the previous element is replaced by the new element. If a free function was provided, it is used to free the previously inserted element

Parameters
setthe hash set
eltthe new element to insert in the hash set
Returns
true if success. If false is returned, elt has not been inserted, but TIFFHashSetInsert() will have run the free function if provided.

Definition at line 440 of file tif_hash_set.c.

441{
442 assert(set != NULL);
443 void **pElt = TIFFHashSetFindPtr(set, elt);
444 if (pElt)
445 {
446 if (set->fnFreeEltFunc)
447 set->fnFreeEltFunc(*pElt);
448
449 *pElt = elt;
450 return true;
451 }
452
453 if (set->nSize >= 2 * set->nAllocatedSize / 3 ||
454 (set->bRehash && set->nIndiceAllocatedSize > 0 &&
455 set->nSize <= set->nAllocatedSize / 2))
456 {
457 set->nIndiceAllocatedSize++;
459 {
460 set->nIndiceAllocatedSize--;
461 if (set->fnFreeEltFunc)
462 set->fnFreeEltFunc(elt);
463 return false;
464 }
465 }
466
467 const unsigned long nHashVal = set->fnHashFunc(elt) % set->nAllocatedSize;
468#ifdef HASH_DEBUG
469 if (set->tabList[nHashVal])
470 set->nCollisions++;
471#endif
472
474 if (new_elt == NULL)
475 {
476 if (set->fnFreeEltFunc)
477 set->fnFreeEltFunc(elt);
478 return false;
479 }
480 new_elt->pData = elt;
481 new_elt->psNext = set->tabList[nHashVal];
482 set->tabList[nHashVal] = new_elt;
483 set->nSize++;
484
485 return true;
486}
#define NULL
Definition: types.h:112
#define assert(_expr)
Definition: assert.h:32
struct _TIFFList * psNext
Definition: tif_hash_set.c:52
void * pData
Definition: tif_hash_set.c:48
static TIFFList * TIFFHashSetGetNewListElt(TIFFHashSet *set)
Definition: tif_hash_set.c:190
static void ** TIFFHashSetFindPtr(TIFFHashSet *set, const void *elt)
Definition: tif_hash_set.c:409
static bool TIFFHashSetRehash(TIFFHashSet *set)
Definition: tif_hash_set.c:366

Referenced by _TIFFCheckDirNumberAndOffset().

◆ TIFFHashSetLookup()

void * TIFFHashSetLookup ( TIFFHashSet set,
const void elt 
)

Returns the element found in the hash set corresponding to the element to look up The element must not be modified.

Parameters
setthe hash set
eltthe element to look up in the hash set
Returns
the element found in the hash set or NULL

Definition at line 502 of file tif_hash_set.c.

503{
504 assert(set != NULL);
505 void **pElt = TIFFHashSetFindPtr(set, elt);
506 if (pElt)
507 return *pElt;
508
509 return NULL;
510}

Referenced by _TIFFCheckDirNumberAndOffset(), _TIFFGetDirNumberFromOffset(), _TIFFGetOffsetFromDirNumber(), and _TIFFRemoveEntryFromDirectoryListByOffset().

◆ TIFFHashSetNew()

TIFFHashSet * TIFFHashSetNew ( TIFFHashSetHashFunc  fnHashFunc,
TIFFHashSetEqualFunc  fnEqualFunc,
TIFFHashSetFreeEltFunc  fnFreeEltFunc 
)

Creates a new hash set

The hash function must return a hash value for the elements to insert. If fnHashFunc is NULL, TIFFHashSetHashPointer will be used.

The equal function must return if two elements are equal. If fnEqualFunc is NULL, TIFFHashSetEqualPointer will be used.

The free function is used to free elements inserted in the hash set, when the hash set is destroyed, when elements are removed or replaced. If fnFreeEltFunc is NULL, elements inserted into the hash set will not be freed.

Parameters
fnHashFunchash function. May be NULL.
fnEqualFuncequal function. May be NULL.
fnFreeEltFuncelement free function. May be NULL.
Returns
a new hash set

Definition at line 138 of file tif_hash_set.c.

141{
143 if (set == NULL)
144 return NULL;
145 set->fnHashFunc = fnHashFunc ? fnHashFunc : TIFFHashSetHashPointer;
146 set->fnEqualFunc = fnEqualFunc ? fnEqualFunc : TIFFHashSetEqualPointer;
147 set->fnFreeEltFunc = fnFreeEltFunc;
148 set->nSize = 0;
149 set->tabList = (TIFFList **)(calloc(53, sizeof(TIFFList *)));
150 if (set->tabList == NULL)
151 {
152 free(set);
153 return NULL;
154 }
155 set->nIndiceAllocatedSize = 0;
156 set->nAllocatedSize = 53;
157 set->psRecyclingList = NULL;
158 set->nRecyclingListSize = 0;
159 set->bRehash = false;
160#ifdef HASH_DEBUG
161 set->nCollisions = 0;
162#endif
163 return set;
164}
#define malloc
Definition: debug_ros.c:4
#define calloc
Definition: rosglue.h:14
static unsigned long TIFFHashSetHashPointer(const void *elt)
Definition: tif_hash_set.c:90
static bool TIFFHashSetEqualPointer(const void *elt1, const void *elt2)
Definition: tif_hash_set.c:108

Referenced by _TIFFCheckDirNumberAndOffset().

◆ TIFFHashSetRemove()

bool TIFFHashSetRemove ( TIFFHashSet set,
const void elt 
)

Removes an element from a hash set

Parameters
setthe hash set
eltthe new element to remove from the hash set
Returns
true if the element was in the hash set

Definition at line 577 of file tif_hash_set.c.

578{
579 return TIFFHashSetRemoveInternal(set, elt, false);
580}
static bool TIFFHashSetRemoveInternal(TIFFHashSet *set, const void *elt, bool bDeferRehash)
Definition: tif_hash_set.c:516

Referenced by _TIFFCheckDirNumberAndOffset(), and _TIFFRemoveEntryFromDirectoryListByOffset().

◆ TIFFHashSetSize()

int TIFFHashSetSize ( const TIFFHashSet set)

Returns the number of elements inserted in the hash set

Note: this is not the internal size of the hash set

Parameters
setthe hash set
Returns
the number of elements in the hash set

Definition at line 180 of file tif_hash_set.c.

181{
182 assert(set != NULL);
183 return set->nSize;
184}

Referenced by _TIFFCheckDirNumberAndOffset().