Use a hash table for epair lookup.

This gives a very minor speedup to drawing large maps.
This commit is contained in:
Bill Currie 2011-04-09 14:34:27 +09:00
parent b5a4e330ca
commit 32f3f5c06b
2 changed files with 42 additions and 33 deletions

View file

@ -8,6 +8,7 @@
typedef struct epair_s {
struct epair_s *next;
struct epair_s **prev;
char *key;
char *value;
} epair_t;
@ -18,6 +19,7 @@ typedef struct epair_s {
{
NSMutableArray *array;
epair_t *epairs;
struct hashtab_s *epair_tab;
BOOL modifiable;
}

View file

@ -1,4 +1,5 @@
#include "QF/dstring.h"
#include "QF/hash.h"
#include "QF/script.h"
#include "QF/sys.h"
#include "QF/va.h"
@ -76,6 +77,25 @@ vec3_t bad_maxs = {8, 8, 8};
return new;
}
static const char *
epair_getkey (void *_ep, void *unused)
{
epair_t *ep = (epair_t *) _ep;
return ep->key;
}
static void
epair_free (void *_ep, void *unused)
{
epair_t *ep = (epair_t *) _ep;
free (ep->key);
free (ep->value);
if (ep->next)
ep->next->prev = ep->prev;
*ep->prev = ep->next;
free (ep);
}
- (Entity *) initClass: (const char *)classname
{
id new;
@ -86,6 +106,7 @@ vec3_t bad_maxs = {8, 8, 8};
self = [super init];
array = [[NSMutableArray alloc] init];
epair_tab = Hash_NewTable (61, epair_getkey, epair_free, 0);
modifiable = YES;
@ -117,14 +138,7 @@ vec3_t bad_maxs = {8, 8, 8};
- (oneway void) dealloc
{
epair_t *e, *n;
for (e = epairs; e; e = n) {
n = e->next;
free (e->key);
free (e->value);
free (e);
}
Hash_DelTable (epair_tab);
[array release];
[super dealloc];
}
@ -158,10 +172,9 @@ vec3_t bad_maxs = {8, 8, 8};
{
epair_t *e;
for (e = epairs; e; e = e->next) {
if (!strcmp (k, e->key))
return e->value;
}
e = Hash_Find (epair_tab, k);
if (e)
return e->value;
return "";
}
@ -198,14 +211,13 @@ vec3_t bad_maxs = {8, 8, 8};
if (!*k)
return;
for (e = epairs; e; e = e->next) {
if (!strcmp (k, e->key)) {
if (e->value == v)
return;
free (e->value);
e->value = strdup (v);
e = Hash_Find (epair_tab, k);
if (e) {
if (!strcmp (e->value, v))
return;
}
free (e->value);
e->value = strdup (v);
return;
}
e = malloc (sizeof (epair_t));
@ -213,7 +225,11 @@ vec3_t bad_maxs = {8, 8, 8};
e->key = strdup (k);
e->value = strdup (v);
e->next = epairs;
e->prev = &epairs;
if (epairs)
epairs->prev = &e->next;
epairs = e;
Hash_Add (epair_tab, e);
}
- (int) numPairs
@ -235,27 +251,17 @@ vec3_t bad_maxs = {8, 8, 8};
- (void) removeKeyPair: (char *)key
{
epair_t *e, *e2;
epair_t *e;
if (!epairs)
return;
e = epairs;
if (!strcmp (e->key, key)) {
epairs = e->next;
free (e);
e = Hash_Del (epair_tab, key);
if (e) {
Hash_Free (epair_tab, e);
return;
}
for ( ; e; e = e->next) {
if (e->next && !strcmp (e->next->key, key)) {
e2 = e->next;
e->next = e2->next;
free (e2);
return;
}
}
printf ("WARNING: removeKeyPair: %s not found\n", key);
return;
}
@ -320,6 +326,7 @@ int nument;
self = [super init];
array = [[NSMutableArray alloc] init];
epair_tab = Hash_NewTable (61, epair_getkey, epair_free, 0);
if (!Script_GetToken (script, true)) {
[self dealloc];