mirror of
https://github.com/mapbox/tippecanoe.git
synced 2025-01-22 04:18:01 +00:00
Much faster to search and add to the string pool as a binary tree
This commit is contained in:
parent
d7cdbec980
commit
581105dc9a
29
geojson.c
29
geojson.c
@ -139,25 +139,42 @@ struct pool_val *pool(struct pool *p, char *s, int type) {
|
||||
|
||||
if (cmp == 0) {
|
||||
return *v;
|
||||
} else if (cmp < 0) {
|
||||
v = &((*v)->left);
|
||||
} else {
|
||||
v = &((*v)->right);
|
||||
}
|
||||
|
||||
v = &((*v)->next);
|
||||
}
|
||||
|
||||
*v = malloc(sizeof(struct pool_val));
|
||||
(*v)->left = NULL;
|
||||
(*v)->right = NULL;
|
||||
(*v)->next = NULL;
|
||||
(*v)->s = s;
|
||||
(*v)->type = type;
|
||||
(*v)->n = p->n++;
|
||||
|
||||
if (p->tail != NULL) {
|
||||
p->tail->next = *v;
|
||||
}
|
||||
p->tail = *v;
|
||||
if (p->head == NULL) {
|
||||
p->head = *v;
|
||||
}
|
||||
|
||||
return *v;
|
||||
}
|
||||
|
||||
void pool_free(struct pool *p) {
|
||||
while (p->vals != NULL) {
|
||||
struct pool_val *next = p->vals->next;
|
||||
free(p->vals);
|
||||
p->vals = next;
|
||||
while (p->head != NULL) {
|
||||
struct pool_val *next = p->head->next;
|
||||
free(p->head);
|
||||
p->head = next;
|
||||
}
|
||||
|
||||
p->head = NULL;
|
||||
p->tail = NULL;
|
||||
p->vals = NULL;
|
||||
}
|
||||
|
||||
|
||||
|
4
tile.cc
4
tile.cc
@ -59,6 +59,8 @@ void write_tile(struct index *start, struct index *end, char *metabase, unsigned
|
||||
struct pool keys;
|
||||
keys.n = 0;
|
||||
keys.vals = NULL;
|
||||
keys.head = NULL;
|
||||
keys.tail = NULL;
|
||||
|
||||
struct index *i;
|
||||
//printf("tile -----------------------------------------------\n");
|
||||
@ -165,7 +167,7 @@ void write_tile(struct index *start, struct index *end, char *metabase, unsigned
|
||||
}
|
||||
|
||||
struct pool_val *pv;
|
||||
for (pv = keys.vals; pv != NULL; pv = pv->next) {
|
||||
for (pv = keys.head; pv != NULL; pv = pv->next) {
|
||||
layer->add_keys(pv->s, strlen(pv->s));
|
||||
}
|
||||
pool_free(&keys);
|
||||
|
Loading…
Reference in New Issue
Block a user