From: Michael Tremer Date: Fri, 20 Nov 2020 16:42:55 +0000 (+0000) Subject: network-list: Implement merging in reverse in one step X-Git-Tag: 0.9.5~40 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a1024390795d60fab9f697fa230c9901ebd7d221;p=location%2Flibloc.git network-list: Implement merging in reverse in one step This will save us some time because we do not need to change the list in place first and then merge it. Signed-off-by: Michael Tremer --- diff --git a/src/database.c b/src/database.c index c21b957..ba4f98a 100644 --- a/src/database.c +++ b/src/database.c @@ -1381,8 +1381,7 @@ static int __loc_database_enumerator_next_network_flattened( *network = loc_network_list_pop_first(subnets); // Push the rest onto the stack - loc_network_list_reverse(subnets); - loc_network_list_merge(enumerator->stack, subnets); + loc_network_list_merge_reverse(enumerator->stack, subnets); loc_network_list_unref(subnets); diff --git a/src/libloc.sym b/src/libloc.sym index 406dd15..56cada8 100644 --- a/src/libloc.sym +++ b/src/libloc.sym @@ -140,6 +140,7 @@ global: loc_network_list_empty; loc_network_list_get; loc_network_list_merge; + loc_network_list_merge_reverse; loc_network_list_new; loc_network_list_pop; loc_network_list_pop_first; diff --git a/src/loc/network-list.h b/src/loc/network-list.h index af3b28d..89776a6 100644 --- a/src/loc/network-list.h +++ b/src/loc/network-list.h @@ -33,5 +33,6 @@ int loc_network_list_contains(struct loc_network_list* list, struct loc_network* void loc_network_list_sort(struct loc_network_list* list); void loc_network_list_reverse(struct loc_network_list* list); int loc_network_list_merge(struct loc_network_list* self, struct loc_network_list* other); +int loc_network_list_merge_reverse(struct loc_network_list* self, struct loc_network_list* other); #endif diff --git a/src/network-list.c b/src/network-list.c index 9cb4547..b455caf 100644 --- a/src/network-list.c +++ b/src/network-list.c @@ -242,3 +242,16 @@ LOC_EXPORT int loc_network_list_merge( return 0; } + +LOC_EXPORT int loc_network_list_merge_reverse( + struct loc_network_list* self, struct loc_network_list* other) { + int r; + + for (int i = other->size - 1; i >= 0; i--) { + r = loc_network_list_push(self, other->elements[i]); + if (r) + return r; + } + + return 0; +}