]> git.ipfire.org Git - people/ms/libloc.git/commitdiff
network-list: Implement merging in reverse in one step
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 20 Nov 2020 16:42:55 +0000 (16:42 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 20 Nov 2020 16:42:55 +0000 (16:42 +0000)
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 <michael.tremer@ipfire.org>
src/database.c
src/libloc.sym
src/loc/network-list.h
src/network-list.c

index c21b95765249a643c058d6f14265cc5a39c05906..ba4f98ad14b79191a85e050423cacef5a160f946 100644 (file)
@@ -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);
 
index 406dd15eba036dcb7526a629d8c111ca4872b6ac..56cada8e0028f150a410d99429c002824c0f6b46 100644 (file)
@@ -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;
index af3b28df1af5ad2bda55a5b6e0e30c5def8ca880..89776a6784012a0727f712fdc18a899c13403a69 100644 (file)
@@ -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
index 9cb4547cf497256c56e82a0ce77e81cb18687368..b455cafc38de1900e8a1e295331c2d09fe50b486 100644 (file)
@@ -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;
+}