diff options
author | Brian Pane <brianp@apache.org> | 2002-07-27 23:43:20 +0000 |
---|---|---|
committer | Brian Pane <brianp@apache.org> | 2002-07-27 23:43:20 +0000 |
commit | 3df22a6db269364098300f31b858a238cd791b4d (patch) | |
tree | a8572122a9d99181979f3b08201b2945d9f60001 /tables | |
parent | fe0dd0e41bb7e75ad6df49ed57ea0b0da245e8d4 (diff) | |
download | apr-3df22a6db269364098300f31b858a238cd791b4d.tar.gz |
Optimization for apr_table_overlap(): because the destination
array is pre-allocated to ensure that it's big enough to hold
the result table, just use simple pointer arithmetic to write
to successive elements, rather than calling the array push
function
git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@63737 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'tables')
-rw-r--r-- | tables/apr_tables.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/tables/apr_tables.c b/tables/apr_tables.c index 8e5107520..3d59d3105 100644 --- a/tables/apr_tables.c +++ b/tables/apr_tables.c @@ -1211,6 +1211,7 @@ APR_DECLARE(void) apr_table_overlap(apr_table_t *a, const apr_table_t *b, int nhash; int i; apr_table_entry_t *elts; + apr_table_entry_t *dst_elt; max_keys = a->a.nelts + b->a.nelts; if (!max_keys) { @@ -1265,6 +1266,7 @@ APR_DECLARE(void) apr_table_overlap(apr_table_t *a, const apr_table_t *b, */ make_array_core(&a->a, b->a.pool, max_keys, sizeof(apr_table_entry_t), 0); nkeys = 0; + dst_elt = (apr_table_entry_t *)a->a.elts; for (i = 0; i < max_keys; i++) { if (cat_keys[i].skip) { continue; @@ -1301,18 +1303,19 @@ APR_DECLARE(void) apr_table_overlap(apr_table_t *a, const apr_table_t *b, next = next->merge_next; } while (next); *val_next = 0; - elt = (apr_table_entry_t *)table_push(a); - elt->key = cat_keys[i].elt->key; - elt->val = new_val; - elt->key_checksum = cat_keys[i].elt->key_checksum; + dst_elt->key = cat_keys[i].elt->key; + dst_elt->val = new_val; + dst_elt->key_checksum = cat_keys[i].elt->key_checksum; + dst_elt++; } else { - apr_table_entry_t *elt = (apr_table_entry_t *)table_push(a); - elt->key = cat_keys[i].elt->key; - elt->val = cat_keys[i].elt->val; - elt->key_checksum = cat_keys[i].elt->key_checksum; + dst_elt->key = cat_keys[i].elt->key; + dst_elt->val = cat_keys[i].elt->val; + dst_elt->key_checksum = cat_keys[i].elt->key_checksum; + dst_elt++; } } + a->a.nelts = dst_elt - (apr_table_entry_t *)a->a.elts; table_reindex(a); } |