From 581105dc9abeff0e5a4b087fbfd4513f6fb3f727 Mon Sep 17 00:00:00 2001 From: Eric Fischer Date: Mon, 22 Sep 2014 22:31:32 -0700 Subject: [PATCH] Much faster to search and add to the string pool as a binary tree --- geojson.c | 29 +++++++++++++++++++++++------ tile.cc | 4 +++- tile.h | 6 ++++++ 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/geojson.c b/geojson.c index 32ded50..7153784 100644 --- a/geojson.c +++ b/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; } diff --git a/tile.cc b/tile.cc index b5d741c..a2a390e 100644 --- a/tile.cc +++ b/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); diff --git a/tile.h b/tile.h index faafb15..9d6f077 100644 --- a/tile.h +++ b/tile.h @@ -19,11 +19,17 @@ struct pool_val { int type; int n; + struct pool_val *left; + struct pool_val *right; + struct pool_val *next; }; struct pool { struct pool_val *vals; + + struct pool_val *head; + struct pool_val *tail; int n; };