summaryrefslogtreecommitdiff
path: root/tables
diff options
context:
space:
mode:
authorbrianp <brianp@13f79535-47bb-0310-9956-ffa450edef68>2002-07-27 23:43:20 +0000
committerbrianp <brianp@13f79535-47bb-0310-9956-ffa450edef68>2002-07-27 23:43:20 +0000
commit0112566d1aa6c348d3fc065f40d22a2314e01724 (patch)
treea8572122a9d99181979f3b08201b2945d9f60001 /tables
parent6153fb2f0c009f979859ff495f343b1c1e592f50 (diff)
downloadlibapr-0112566d1aa6c348d3fc065f40d22a2314e01724.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: http://svn.apache.org/repos/asf/apr/apr/trunk@63737 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'tables')
-rw-r--r--tables/apr_tables.c19
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);
}