From ac535a261604f0163e7f8c9dd23389881deabd12 Mon Sep 17 00:00:00 2001 From: Sokolov Yura aka funny_falcon Date: Sun, 22 Dec 2013 07:36:25 +0400 Subject: [PATCH] sp_ar.c: implement ST_DELETE --- sp_ar.c | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/sp_ar.c b/sp_ar.c index e11da5c85641d0..52d6ad73e2d2a6 100644 --- a/sp_ar.c +++ b/sp_ar.c @@ -286,8 +286,8 @@ sa_free_table(sa_table *table) sa_table_dealloc(table); } -int -sa_delete(sa_table *table, sa_index_t key, st_data_t *value) +static int +sa_delete_internal(sa_table *table, sa_index_t key, st_data_t *value) { sa_index_t pos, prev_pos = ~0; sa_entry *entry; @@ -314,9 +314,6 @@ sa_delete(sa_table *table, sa_index_t key, st_data_t *value) } } table->num_entries--; - if (table->num_entries < table->num_bins / 4) { - resize(table); - } return 1; } if (entry->next == SA_LAST) break; @@ -330,6 +327,16 @@ sa_delete(sa_table *table, sa_index_t key, st_data_t *value) return 0; } +int +sa_delete(sa_table *table, sa_index_t key, st_data_t *value) +{ + int res = sa_delete_internal(table, key, value); + if (res == 1 && table->num_entries < table->num_bins / 4) { + resize(table); + } + return res; +} + int sa_foreach(register sa_table *table, int (*func)(), st_data_t arg) { @@ -344,7 +351,17 @@ sa_foreach(register sa_table *table, int (*func)(), st_data_t arg) st_data_t val = table->entries[i].value; ret = (*func)(key, val, arg); if (ret == SA_STOP) break; - /* else if (ret == SA_DELETE) TODO: implement */ + else if (ret == SA_DELETE) { + /* it is stable only in term of single iteration */ + /* do not parallel iteration, please */ + sa_index_t next = table->entries[i].next; + sa_delete_internal(table, key, NULL); + /* if item remains after deletion, then it is other item, */ + /* moved from `next` position */ + if (next > i + SA_OFFSET && table->entries[i].next != SA_EMPTY) { + i--; + } + } } } return 0; pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy