mirror of
https://github.com/Unidata/netcdf-c.git
synced 2024-11-21 03:13:42 +08:00
Merged var/dim name hashing for fast lookups into my branch.
This commit is contained in:
parent
e3bb962085
commit
0790f81cf9
@ -34,7 +34,7 @@ netcdf.3: $(top_srcdir)/man4/netcdf.m4
|
||||
libnetcdf3_la_SOURCES = nc.h error3.c libvers.c string.c v1hpg.c fbits.h ncio.h \
|
||||
onstack.h rnd.h utf8proc.c utf8proc.h utf8proc_data.h nclistmgr.c \
|
||||
putget.m4 attr.m4 nc3dispatch.c nc3dispatch.h nc.c var.c dim.c ncx.m4 \
|
||||
ncx.h
|
||||
ncx.h lookup3.c
|
||||
|
||||
# Does the user want to use ffio or posixio?
|
||||
if USE_FFIO
|
||||
|
10
libsrc/dim.c
10
libsrc/dim.c
@ -37,6 +37,7 @@ new_x_NC_dim(NC_string *name)
|
||||
return NULL;
|
||||
|
||||
dimp->name = name;
|
||||
dimp->hash = hash_fast(name->cp, strlen(name->cp));
|
||||
dimp->size = 0;
|
||||
|
||||
return(dimp);
|
||||
@ -126,7 +127,7 @@ NC_finddim(const NC_dimarray *ncap, const char *uname, NC_dim **dimpp)
|
||||
{
|
||||
|
||||
int dimid;
|
||||
size_t slen;
|
||||
uint32_t shash;
|
||||
NC_dim ** loc;
|
||||
char *name;
|
||||
|
||||
@ -142,11 +143,11 @@ NC_finddim(const NC_dimarray *ncap, const char *uname, NC_dim **dimpp)
|
||||
name = (char *)utf8proc_NFC((const unsigned char *)uname);
|
||||
if(name == NULL)
|
||||
return NC_ENOMEM;
|
||||
slen = strlen(name);
|
||||
shash = hash_fast(name, strlen(name));
|
||||
|
||||
for(; (size_t) dimid < ncap->nelems
|
||||
&& (strlen((*loc)->name->cp) != slen
|
||||
|| strncmp((*loc)->name->cp, name, slen) != 0);
|
||||
&& ((*loc)->hash != shash
|
||||
|| strncmp((*loc)->name->cp, name, strlen(name)) != 0);
|
||||
dimid++, loc++)
|
||||
{
|
||||
/*EMPTY*/
|
||||
@ -469,6 +470,7 @@ NC3_rename_dim( int ncid, int dimid, const char *unewname)
|
||||
if(newStr == NULL)
|
||||
return NC_ENOMEM;
|
||||
dimp->name = newStr;
|
||||
dimp->hash = hash_fast(newStr->cp, strlen(newStr->cp));
|
||||
free_NC_string(old);
|
||||
return NC_NOERR;
|
||||
}
|
||||
|
14
libsrc/nc.h
14
libsrc/nc.h
@ -11,6 +11,11 @@
|
||||
*/
|
||||
#include <config.h>
|
||||
#include <stddef.h> /* size_t */
|
||||
#ifndef HAVE_STDINT_H
|
||||
# include "pstdint.h" /* attempts to define uint32_t etc portably */
|
||||
#else
|
||||
# include <stdint.h>
|
||||
#endif /* HAVE_STDINT_H */
|
||||
#include <sys/types.h> /* off_t */
|
||||
#ifdef USE_PARALLEL
|
||||
#include <netcdf_par.h>
|
||||
@ -80,6 +85,7 @@ set_NC_string(NC_string *ncstrp, const char *str);
|
||||
typedef struct {
|
||||
/* all xdr'd */
|
||||
NC_string *name;
|
||||
uint32_t hash;
|
||||
size_t size;
|
||||
} NC_dim;
|
||||
|
||||
@ -178,6 +184,7 @@ typedef struct NC_var {
|
||||
off_t *dsizes; /* compiled info: the right to left product of shape */
|
||||
/* below gets xdr'd */
|
||||
NC_string *name;
|
||||
uint32_t hash;
|
||||
/* next two: formerly NC_iarray *assoc */ /* user definition */
|
||||
size_t ndims; /* assoc->count */
|
||||
int *dimids; /* assoc->value */
|
||||
@ -195,6 +202,13 @@ typedef struct NC_vararray {
|
||||
NC_var **value;
|
||||
} NC_vararray;
|
||||
|
||||
/* Begin defined in lookup3.c */
|
||||
|
||||
extern uint32_t
|
||||
hash_fast(const void *key, size_t length);
|
||||
|
||||
/* End defined in lookup3.c */
|
||||
|
||||
/* Begin defined in var.c */
|
||||
|
||||
extern void
|
||||
|
11
libsrc/var.c
11
libsrc/var.c
@ -65,6 +65,7 @@ new_x_NC_var(
|
||||
(void) memset(varp, 0, sz);
|
||||
varp->name = strp;
|
||||
varp->ndims = ndims;
|
||||
varp->hash = hash_fast(strp->cp, strlen(strp->cp));
|
||||
|
||||
if(ndims != 0)
|
||||
{
|
||||
@ -321,7 +322,7 @@ int
|
||||
NC_findvar(const NC_vararray *ncap, const char *uname, NC_var **varpp)
|
||||
{
|
||||
NC_var **loc;
|
||||
size_t slen;
|
||||
uint32_t shash;
|
||||
int varid;
|
||||
char *name;
|
||||
|
||||
@ -336,12 +337,12 @@ NC_findvar(const NC_vararray *ncap, const char *uname, NC_var **varpp)
|
||||
name = (char *)utf8proc_NFC((const unsigned char *)uname);
|
||||
if(name == NULL)
|
||||
return NC_ENOMEM;
|
||||
slen = strlen(name);
|
||||
shash = hash_fast(name, strlen(name));
|
||||
|
||||
for(varid = 0; (size_t) varid < ncap->nelems; varid++, loc++)
|
||||
{
|
||||
if(strlen((*loc)->name->cp) == slen &&
|
||||
strncmp((*loc)->name->cp, name, slen) == 0)
|
||||
if((*loc)->hash == shash &&
|
||||
strncmp((*loc)->name->cp, name, strlen(name)) == 0)
|
||||
{
|
||||
if(varpp != NULL)
|
||||
*varpp = *loc;
|
||||
@ -714,12 +715,14 @@ NC3_rename_var(int ncid, int varid, const char *unewname)
|
||||
if(newStr == NULL)
|
||||
return(-1);
|
||||
varp->name = newStr;
|
||||
varp->hash = hash_fast(newStr->cp, strlen(newStr->cp));
|
||||
free_NC_string(old);
|
||||
return NC_NOERR;
|
||||
}
|
||||
|
||||
/* else, not in define mode */
|
||||
status = set_NC_string(varp->name, newname);
|
||||
varp->hash = hash_fast(newname, strlen(newname));
|
||||
free(newname);
|
||||
if(status != NC_NOERR)
|
||||
return status;
|
||||
|
Loading…
Reference in New Issue
Block a user