HDF5  1.12.0
Data Structures | Macros | Functions | Variables
H5SL.c File Reference
#include "H5SLmodule.h"
#include "H5private.h"
#include "H5Eprivate.h"
#include "H5FLprivate.h"
#include "H5MMprivate.h"
#include "H5SLprivate.h"

Data Structures

struct  H5SL_node_t
 
struct  H5SL_t
 

Macros

#define H5SL_LOCATE_SEARCH_FOUND(SLIST, X, I)
 
#define H5SL_LOCATE_SEARCH_DEFER_REMOVE_FOUND(SLIST, X, I)
 
#define H5SL_LOCATE_FIND_FOUND(SLIST, X, I)
 
#define H5SL_LOCATE_SCALAR_CMP(SLIST, TYPE, PNODE, PKEY, HASHVAL)   (*(TYPE *)((PNODE)->key) < *(TYPE *)PKEY)
 
#define H5SL_LOCATE_STRING_CMP(SLIST, TYPE, PNODE, PKEY, HASHVAL)
 
#define H5SL_LOCATE_OBJ_CMP(SLIST, TYPE, PNODE, PKEY, HASHVAL)
 
#define H5SL_LOCATE_GENERIC_CMP(SLIST, TYPE, PNODE, PKEY, HASHVAL)   ((SLIST)->cmp((TYPE *)((PNODE)->key), (TYPE *)PKEY) < 0)
 
#define H5SL_LOCATE_SCALAR_EQ(SLIST, TYPE, PNODE, PKEY, HASHVAL)   (*(TYPE *)((PNODE)->key) == *(TYPE *)PKEY)
 
#define H5SL_LOCATE_STRING_EQ(SLIST, TYPE, PNODE, PKEY, HASHVAL)   (((PNODE)->hashval == HASHVAL) && (HDstrcmp((const char *)(PNODE)->key, (const char *)PKEY) == 0))
 
#define H5SL_LOCATE_OBJ_EQ(SLIST, TYPE, PNODE, PKEY, HASHVAL)   ((((TYPE *)((PNODE)->key))->fileno == ((TYPE *)PKEY)->fileno) && (((TYPE *)((PNODE)->key))->addr == ((TYPE *)PKEY)->addr))
 
#define H5SL_LOCATE_GENERIC_EQ(SLIST, TYPE, PNODE, PKEY, HASHVAL)   ((SLIST)->cmp((TYPE *)((PNODE)->key), (TYPE *)PKEY) == 0)
 
#define H5SL_LOCATE_SCALAR_HASHINIT(KEY, HASHVAL)
 
#define H5SL_LOCATE_STRING_HASHINIT(KEY, HASHVAL)   HASHVAL = H5_hash_string((const char *)KEY);
 
#define H5SL_LOCATE_OBJ_HASHINIT(KEY, HASHVAL)
 
#define H5SL_LOCATE_GENERIC_HASHINIT(KEY, HASHVAL)
 
#define H5SL_LOCATE_OPT(OP, CMP, SLIST, X, TYPE, KEY, HASHVAL)
 
#define H5SL_LOCATE_SAFE(OP, CMP, SLIST, X, TYPE, KEY, HASHVAL)
 
#define H5SL_LOCATE(OP, CMP, SLIST, X, TYPE, KEY, HASHVAL)
 
#define H5SL_GROW(X, LVL, ERR)
 
#define H5SL_SHRINK(X, LVL)
 
#define H5SL_PROMOTE(SLIST, X, PREV, ERR)
 
#define H5SL_DEMOTE(X, PREV)
 
#define H5SL_INSERT(CMP, SLIST, X, TYPE, KEY, HASHVAL)
 
#define H5SL_REMOVE(CMP, SLIST, X, TYPE, KEY, HASHVAL)
 
#define H5SL_SEARCH(CMP, SLIST, X, TYPE, KEY, HASHVAL)   H5SL_LOCATE(SEARCH, CMP, SLIST, X, TYPE, KEY, HASHVAL)
 
#define H5SL_FIND(CMP, SLIST, X, TYPE, KEY, HASHVAL)   H5SL_LOCATE(FIND, CMP, SLIST, X, TYPE, KEY, HASHVAL)
 

Functions

 H5FL_DEFINE_STATIC (H5SL_t)
 
 H5FL_DEFINE_STATIC (H5SL_node_t)
 
herr_t H5SL__init_package (void)
 
int H5SL_term_package (void)
 
H5SL_tH5SL_create (H5SL_type_t type, H5SL_cmp_t cmp)
 
size_t H5SL_count (H5SL_t *slist)
 
herr_t H5SL_insert (H5SL_t *slist, void *item, const void *key)
 
H5SL_node_tH5SL_add (H5SL_t *slist, void *item, const void *key)
 
void * H5SL_remove (H5SL_t *slist, const void *key)
 
void * H5SL_remove_first (H5SL_t *slist)
 
void * H5SL_search (H5SL_t *slist, const void *key)
 
void * H5SL_less (H5SL_t *slist, const void *key)
 
void * H5SL_greater (H5SL_t *slist, const void *key)
 
H5SL_node_tH5SL_find (H5SL_t *slist, const void *key)
 
H5SL_node_tH5SL_below (H5SL_t *slist, const void *key)
 
H5SL_node_tH5SL_above (H5SL_t *slist, const void *key)
 
H5SL_node_tH5SL_first (H5SL_t *slist)
 
H5SL_node_tH5SL_next (H5SL_node_t *slist_node)
 
H5SL_node_tH5SL_prev (H5SL_node_t *slist_node)
 
H5SL_node_tH5SL_last (H5SL_t *slist)
 
void * H5SL_item (H5SL_node_t *slist_node)
 
herr_t H5SL_iterate (H5SL_t *slist, H5SL_operator_t op, void *op_data)
 
herr_t H5SL_release (H5SL_t *slist)
 
herr_t H5SL_free (H5SL_t *slist, H5SL_operator_t op, void *op_data)
 
herr_t H5SL_try_free_safe (H5SL_t *slist, H5SL_try_free_op_t op, void *op_data)
 
herr_t H5SL_destroy (H5SL_t *slist, H5SL_operator_t op, void *op_data)
 
herr_t H5SL_close (H5SL_t *slist)
 

Variables

hbool_t H5_PKG_INIT_VAR = FALSE
 

Macro Definition Documentation

◆ H5SL_DEMOTE

#define H5SL_DEMOTE (   X,
  PREV 
)
Value:
{ \
size_t _lvl = X->level; \
HDassert(PREV->forward[_lvl] == X); \
PREV->forward[_lvl] = X->forward[_lvl]; \
H5SL_SHRINK(X, _lvl); \
}

◆ H5SL_FIND

#define H5SL_FIND (   CMP,
  SLIST,
  X,
  TYPE,
  KEY,
  HASHVAL 
)    H5SL_LOCATE(FIND, CMP, SLIST, X, TYPE, KEY, HASHVAL)

◆ H5SL_GROW

#define H5SL_GROW (   X,
  LVL,
  ERR 
)

◆ H5SL_INSERT

#define H5SL_INSERT (   CMP,
  SLIST,
  X,
  TYPE,
  KEY,
  HASHVAL 
)

◆ H5SL_LOCATE

#define H5SL_LOCATE (   OP,
  CMP,
  SLIST,
  X,
  TYPE,
  KEY,
  HASHVAL 
)
Value:
{ \
if((SLIST)->safe_iterating) \
H5SL_LOCATE_SAFE(OP, CMP, SLIST, X, TYPE, KEY, HASHVAL) \
H5SL_LOCATE_OPT(OP, CMP, SLIST, X, TYPE, KEY, HASHVAL) \
}

◆ H5SL_LOCATE_FIND_FOUND

#define H5SL_LOCATE_FIND_FOUND (   SLIST,
  X,
 
)
Value:
{ \
HDassert(!X->removed); \
HGOTO_DONE(X); \
} /* end block */

◆ H5SL_LOCATE_GENERIC_CMP

#define H5SL_LOCATE_GENERIC_CMP (   SLIST,
  TYPE,
  PNODE,
  PKEY,
  HASHVAL 
)    ((SLIST)->cmp((TYPE *)((PNODE)->key), (TYPE *)PKEY) < 0)

◆ H5SL_LOCATE_GENERIC_EQ

#define H5SL_LOCATE_GENERIC_EQ (   SLIST,
  TYPE,
  PNODE,
  PKEY,
  HASHVAL 
)    ((SLIST)->cmp((TYPE *)((PNODE)->key), (TYPE *)PKEY) == 0)

◆ H5SL_LOCATE_GENERIC_HASHINIT

#define H5SL_LOCATE_GENERIC_HASHINIT (   KEY,
  HASHVAL 
)

◆ H5SL_LOCATE_OBJ_CMP

#define H5SL_LOCATE_OBJ_CMP (   SLIST,
  TYPE,
  PNODE,
  PKEY,
  HASHVAL 
)
Value:
((((TYPE *)((PNODE)->key))->fileno == ((TYPE *)PKEY)->fileno) \
? (((TYPE *)((PNODE)->key))->addr < ((TYPE *)PKEY)->addr) \
: (((TYPE *)((PNODE)->key))->fileno < ((TYPE *)PKEY)->fileno))

◆ H5SL_LOCATE_OBJ_EQ

#define H5SL_LOCATE_OBJ_EQ (   SLIST,
  TYPE,
  PNODE,
  PKEY,
  HASHVAL 
)    ((((TYPE *)((PNODE)->key))->fileno == ((TYPE *)PKEY)->fileno) && (((TYPE *)((PNODE)->key))->addr == ((TYPE *)PKEY)->addr))

◆ H5SL_LOCATE_OBJ_HASHINIT

#define H5SL_LOCATE_OBJ_HASHINIT (   KEY,
  HASHVAL 
)

◆ H5SL_LOCATE_OPT

#define H5SL_LOCATE_OPT (   OP,
  CMP,
  SLIST,
  X,
  TYPE,
  KEY,
  HASHVAL 
)
Value:
{ \
int _i; /* Local index variable */ \
unsigned _count; /* Num nodes searched at this height */ \
H5_GLUE3(H5SL_LOCATE_,CMP,_HASHINIT)(KEY, HASHVAL) \
for(_i = (int)SLIST->curr_level; _i >= 0; _i--) { \
_count = 0; \
while(_count < 3 && X->forward[_i] && \
H5_GLUE3(H5SL_LOCATE_,CMP,_CMP)(SLIST, TYPE, X->forward[_i], KEY, HASHVAL) ) { \
X = X->forward[_i]; \
_count++; \
} /* end while */ \
} /* end for */ \
X = X->forward[0]; \
if(X != NULL && H5_GLUE3(H5SL_LOCATE_,CMP,_EQ)(SLIST, TYPE, X, KEY, HASHVAL) ) { \
/* What to do when a node is found */ \
H5_GLUE3(H5SL_LOCATE_,OP,_FOUND)(SLIST, X, _i) \
} /* end if */ \
}

◆ H5SL_LOCATE_SAFE

#define H5SL_LOCATE_SAFE (   OP,
  CMP,
  SLIST,
  X,
  TYPE,
  KEY,
  HASHVAL 
)
Value:
{ \
int _i; /* Local index variable */ \
H5SL_node_t *_low = X; \
H5SL_node_t *_high = NULL; \
H5_GLUE3(H5SL_LOCATE_,CMP,_HASHINIT)(KEY, HASHVAL) \
for(_i = (int)SLIST->curr_level; _i >= 0; _i--) { \
X = _low->forward[_i]; \
while(X != _high) { \
if(!X->removed) { \
if(H5_GLUE3(H5SL_LOCATE_,CMP,_CMP)(SLIST, TYPE, X, KEY, HASHVAL)) \
_low = X; \
else \
break; \
} /* end if */ \
X = X->forward[_i]; \
} /* end while */ \
_high = X; \
if(X != NULL && H5_GLUE3(H5SL_LOCATE_,CMP,_EQ)(SLIST, TYPE, X, KEY, HASHVAL) ) { \
/* What to do when a node is found */ \
H5_GLUE3(H5SL_LOCATE_,OP,_FOUND)(SLIST, X, _i) \
break; \
} /* end if */ \
} /* end for */ \
}

◆ H5SL_LOCATE_SCALAR_CMP

#define H5SL_LOCATE_SCALAR_CMP (   SLIST,
  TYPE,
  PNODE,
  PKEY,
  HASHVAL 
)    (*(TYPE *)((PNODE)->key) < *(TYPE *)PKEY)

◆ H5SL_LOCATE_SCALAR_EQ

#define H5SL_LOCATE_SCALAR_EQ (   SLIST,
  TYPE,
  PNODE,
  PKEY,
  HASHVAL 
)    (*(TYPE *)((PNODE)->key) == *(TYPE *)PKEY)

◆ H5SL_LOCATE_SCALAR_HASHINIT

#define H5SL_LOCATE_SCALAR_HASHINIT (   KEY,
  HASHVAL 
)

◆ H5SL_LOCATE_SEARCH_DEFER_REMOVE_FOUND

#define H5SL_LOCATE_SEARCH_DEFER_REMOVE_FOUND (   SLIST,
  X,
 
)
Value:
{ \
HDassert(!X->removed); \
X->removed = TRUE; \
HGOTO_DONE(X->item); \
} /* end block */

◆ H5SL_LOCATE_SEARCH_FOUND

#define H5SL_LOCATE_SEARCH_FOUND (   SLIST,
  X,
 
)
Value:
{ \
HDassert(!X->removed); \
HGOTO_DONE(X->item); \
} /* end block */

◆ H5SL_LOCATE_STRING_CMP

#define H5SL_LOCATE_STRING_CMP (   SLIST,
  TYPE,
  PNODE,
  PKEY,
  HASHVAL 
)
Value:
(((PNODE)->hashval == HASHVAL) ? \
(HDstrcmp((const char *)(PNODE)->key, (const char *)PKEY) < 0) : \
((PNODE)->hashval < HASHVAL))

◆ H5SL_LOCATE_STRING_EQ

#define H5SL_LOCATE_STRING_EQ (   SLIST,
  TYPE,
  PNODE,
  PKEY,
  HASHVAL 
)    (((PNODE)->hashval == HASHVAL) && (HDstrcmp((const char *)(PNODE)->key, (const char *)PKEY) == 0))

◆ H5SL_LOCATE_STRING_HASHINIT

#define H5SL_LOCATE_STRING_HASHINIT (   KEY,
  HASHVAL 
)    HASHVAL = H5_hash_string((const char *)KEY);

◆ H5SL_PROMOTE

#define H5SL_PROMOTE (   SLIST,
  X,
  PREV,
  ERR 
)
Value:
{ \
size_t _lvl = X->level; \
H5SL_GROW(X, _lvl, ERR); \
if(_lvl == (size_t) SLIST->curr_level) { \
HDassert(PREV == SLIST->header); \
/* Grow the head */ \
H5SL_GROW(PREV, _lvl, ERR) \
SLIST->curr_level++; \
X->forward[_lvl+1] = NULL; \
} else { \
HDassert(_lvl < (size_t) SLIST->curr_level); \
X->forward[_lvl+1] = PREV->forward[_lvl+1]; \
} /* end else */ \
PREV->forward[_lvl+1] = X; \
}

◆ H5SL_REMOVE

#define H5SL_REMOVE (   CMP,
  SLIST,
  X,
  TYPE,
  KEY,
  HASHVAL 
)

◆ H5SL_SEARCH

#define H5SL_SEARCH (   CMP,
  SLIST,
  X,
  TYPE,
  KEY,
  HASHVAL 
)    H5SL_LOCATE(SEARCH, CMP, SLIST, X, TYPE, KEY, HASHVAL)

◆ H5SL_SHRINK

#define H5SL_SHRINK (   X,
  LVL 
)
Value:
{ \
/* Check if we can reduce the allocation of forward pointers */ \
if(LVL <= 1u << (X->log_nalloc - 1)) { \
H5SL_node_t **_tmp; \
HDassert(LVL == 1u << (X->log_nalloc - 1)); \
X->log_nalloc--; \
\
/* Allocate space for new forward pointers */ \
if(NULL == (_tmp = (H5SL_node_t **)H5FL_FAC_MALLOC(H5SL_fac_g[X->log_nalloc]))) \
HGOTO_ERROR(H5E_SLIST, H5E_NOSPACE, NULL, "memory allocation failed") \
H5MM_memcpy((void *)_tmp, (const void *)X->forward, (LVL) * sizeof(H5SL_node_t *)); \
X->forward = (H5SL_node_t **)H5FL_FAC_FREE(H5SL_fac_g[X->log_nalloc+1], (void *)X->forward); \
X->forward = _tmp; \
} /* end if */ \
\
X->level--; \
}

Function Documentation

◆ H5FL_DEFINE_STATIC() [1/2]

H5FL_DEFINE_STATIC ( H5SL_node_t  )

◆ H5FL_DEFINE_STATIC() [2/2]

H5FL_DEFINE_STATIC ( H5SL_t  )

◆ H5SL__init_package()

herr_t H5SL__init_package ( void  )

◆ H5SL_above()

H5SL_node_t* H5SL_above ( H5SL_t slist,
const void *  key 
)

◆ H5SL_add()

H5SL_node_t* H5SL_add ( H5SL_t slist,
void *  item,
const void *  key 
)

◆ H5SL_below()

H5SL_node_t* H5SL_below ( H5SL_t slist,
const void *  key 
)

◆ H5SL_close()

herr_t H5SL_close ( H5SL_t slist)

◆ H5SL_count()

size_t H5SL_count ( H5SL_t slist)

◆ H5SL_create()

H5SL_t* H5SL_create ( H5SL_type_t  type,
H5SL_cmp_t  cmp 
)

◆ H5SL_destroy()

herr_t H5SL_destroy ( H5SL_t slist,
H5SL_operator_t  op,
void *  op_data 
)

◆ H5SL_find()

H5SL_node_t* H5SL_find ( H5SL_t slist,
const void *  key 
)

◆ H5SL_first()

H5SL_node_t* H5SL_first ( H5SL_t slist)

◆ H5SL_free()

herr_t H5SL_free ( H5SL_t slist,
H5SL_operator_t  op,
void *  op_data 
)

◆ H5SL_greater()

void* H5SL_greater ( H5SL_t slist,
const void *  key 
)

◆ H5SL_insert()

herr_t H5SL_insert ( H5SL_t slist,
void *  item,
const void *  key 
)

◆ H5SL_item()

void* H5SL_item ( H5SL_node_t slist_node)

◆ H5SL_iterate()

herr_t H5SL_iterate ( H5SL_t slist,
H5SL_operator_t  op,
void *  op_data 
)

◆ H5SL_last()

H5SL_node_t* H5SL_last ( H5SL_t slist)

◆ H5SL_less()

void* H5SL_less ( H5SL_t slist,
const void *  key 
)

◆ H5SL_next()

H5SL_node_t* H5SL_next ( H5SL_node_t slist_node)

◆ H5SL_prev()

H5SL_node_t* H5SL_prev ( H5SL_node_t slist_node)

◆ H5SL_release()

herr_t H5SL_release ( H5SL_t slist)

◆ H5SL_remove()

void* H5SL_remove ( H5SL_t slist,
const void *  key 
)

◆ H5SL_remove_first()

void* H5SL_remove_first ( H5SL_t slist)

◆ H5SL_search()

void* H5SL_search ( H5SL_t slist,
const void *  key 
)

◆ H5SL_term_package()

int H5SL_term_package ( void  )

◆ H5SL_try_free_safe()

herr_t H5SL_try_free_safe ( H5SL_t slist,
H5SL_try_free_op_t  op,
void *  op_data 
)

Variable Documentation

◆ H5_PKG_INIT_VAR

hbool_t H5_PKG_INIT_VAR = FALSE
u
hsize_t u
Definition: H5EA.c:1007
ERR
CATCH ERR
Definition: H5EA.c:729
H5E_SLIST
Invalid arguments to routine Resource unavailable Internal File accessibility Low level I O Function entry exit Object atom Object cache Links B Tree node Symbol table Heap Object header Datatype Dataspace Dataset Data storage Property lists Attribute Data filters External file list References Virtual File Layer Virtual Object Layer Ternary Search Trees Reference Counted Strings Error API H5E_SLIST
Definition: H5err.txt:73
HDassert
#define HDassert(X)
Definition: H5private.h:669
H5_GLUE3
#define H5_GLUE3(x, y, z)
Definition: H5private.h:1586
H5SL_LOCATE_OPT
#define H5SL_LOCATE_OPT(OP, CMP, SLIST, X, TYPE, KEY, HASHVAL)
Definition: H5SL.c:149
H5SL_GROW
#define H5SL_GROW(X, LVL, ERR)
Definition: H5SL.c:211
H5FL_FAC_FREE
#define H5FL_FAC_FREE(f, obj)
Definition: H5FLprivate.h:379
H5E_NOSPACE
Invalid arguments to routine Resource unavailable Internal File accessibility Low level I O Function entry exit Object atom Object cache Links B Tree node Symbol table Heap Object header Datatype Dataspace Dataset Data storage Property lists Attribute Data filters External file list References Virtual File Layer Virtual Object Layer Ternary Search Trees Reference Counted Strings Error API Skip Lists Free Space Manager Shared Object Header Messages Extensible Array Fixed Array Plugin for dynamically loaded library Page Buffering API Context Map No error Argument errors Resource errors File accessibility errors Generic low level file I O errors Function entry exit interface errors Object atom related errors Cache related errors Link related errors B tree related errors Object header related errors Group related errors Datatype conversion errors Dataspace errors Property list errors Parallel MPI errors Heap errors Free space errors I O pipeline errors System level errors Plugin errors No error Information is uinitialized Feature is unsupported Inappropriate type Out of range Bad value H5E_NOSPACE
Definition: H5err.txt:117
HDstrcmp
#define HDstrcmp(X, Y)
Definition: H5private.h:1363
TRUE
#define TRUE
Definition: H5FDmulti.c:36
H5SL_node_t
Definition: H5SL.c:545
H5FL_FAC_MALLOC
#define H5FL_FAC_MALLOC(f)
Definition: H5FLprivate.h:373
if
if(NULL==(iblock=H5EA__iblock_protect(hdr, thing_acc)))
Definition: H5EA.c:408