Files
src/src/h5_core/h5_maps.c
T
2009-05-14 16:40:16 +00:00

132 lines
2.5 KiB
C

#include <stdlib.h>
#include <string.h>
#include <hdf5.h>
#include "h5_types.h"
#include "h5_core.h"
#include "h5_core_private.h"
h5_err_t
_h5_alloc_idlist (
h5_file_t * const f,
h5_idlist_t *list,
const h5_size_t size
) {
int new = ( list->items == NULL );
size_t size_in_bytes = size * sizeof ( list->items[0] );
TRY ( list->items = _h5_alloc ( f, list->items, size_in_bytes ) );
list->size = size;
if ( new ) list->num_items = 0;
return H5_SUCCESS;
}
h5_err_t
_h5_append_to_idlist (
h5_file_t * const f,
h5_idlist_t *list,
h5_id_t id
) {
if ( list->num_items == list->size ) {
h5_size_t size = list->size;
if ( size == 0 ) {
size = 16;
} else {
size *= 2;
}
TRY ( _h5_alloc_idlist ( f, list, size ) );
}
list->items[list->num_items++] = id;
return H5_SUCCESS;
}
h5_err_t
_h5_alloc_idmap (
h5_file_t * const f,
h5_idmap_t *map,
const h5_size_t size
) {
int new = ( map->items == NULL );
size_t size_in_bytes = size * sizeof ( map->items[0] );
TRY ( map->items = _h5_alloc ( f, map->items, size_in_bytes ) );
map->size = size;
if ( new ) map->num_items = 0;
return H5_SUCCESS;
}
h5_err_t
_h5_insert_idmap (
h5_file_t * const f,
h5_idmap_t *map,
h5_id_t global_id,
h5_id_t local_id
) {
if ( map->num_items == map->size )
return HANDLE_H5_OVERFLOW_ERR( f, "g2lmap", map->size );
h5_id_t i = _h5_search_idmap ( map, global_id );
if ( i >= 0 ) /* global id already in use ? */
return -1;
i = -(i+1);
memmove (
&map->items[i+1],
&map->items[i],
map->num_items - i );
map->items[i].global_id = global_id;
map->items[i].local_id = local_id;
map->num_items++;
return H5_SUCCESS;
}
/*!
\ingroup h5_core
binary search in id map.
\return index in array if found, othwise \c -(result+1) is the index
where \c value must be inserted.
*/
h5_id_t
_h5_search_idmap (
h5_idmap_t *map,
h5_id_t value
) {
register int low = 0;
register int high = map->num_items - 1;
while (low <= high) {
register int mid = (low + high) / 2;
register h5_id_t diff = map->items[mid].global_id - value;
if ( diff > 0 )
high = mid - 1;
else if ( diff < 0 )
low = mid + 1;
else
return mid; // found
}
return -(low+1); // not found
}
int
_cmp_idmap (
const void *id1,
const void *id2
) {
return *(h5_id_t*)id1 - *(h5_id_t*)id2;
}
h5_err_t
_h5_sort_idmap (
h5_idmap_t *map
) {
qsort ( map->items, map->num_items, sizeof(map->items[0]), _cmp_idmap );
return H5_SUCCESS;
}