diff options
author | Thomas Haller <thaller@redhat.com> | 2017-08-05 10:26:17 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2017-08-12 16:02:11 +0200 |
commit | 9012ae00aa8a36c7951e1eb47adcf717fd49c05c (patch) | |
tree | a964dcf59a561e5870652a9da530e2984c8890c3 | |
parent | 3e1914e4fcb19515874fcacd7dc0692a06618994 (diff) | |
download | NetworkManager-9012ae00aa8a36c7951e1eb47adcf717fd49c05c.tar.gz |
shared: add nm_dedup_multi_entry_reorder() function
This allows to reorder elements in NMDedupMultiIndex.
-rw-r--r-- | shared/nm-utils/nm-dedup-multi.c | 58 | ||||
-rw-r--r-- | shared/nm-utils/nm-dedup-multi.h | 4 |
2 files changed, 62 insertions, 0 deletions
diff --git a/shared/nm-utils/nm-dedup-multi.c b/shared/nm-utils/nm-dedup-multi.c index 000f8a7214..ac47d11b97 100644 --- a/shared/nm-utils/nm-dedup-multi.c +++ b/shared/nm-utils/nm-dedup-multi.c @@ -994,6 +994,64 @@ nm_dedup_multi_objs_to_ptr_array_head (const NMDedupMultiHeadEntry *head_entry, return result; } +/** + * nm_dedup_multi_entry_reorder: + * @entry: the entry to reorder. It must not be NULL (and tracked in an index). + * @entry_order: (allow-none): an optional other entry. It MUST be in the same + * list as entry. If given, @entry will be ordered after/before @entry_order. + * If left at %NULL, @entry will be moved to the front/end of the list. + * @order_after: if @entry_order is given, %TRUE means to move @entry after + * @entry_order (otherwise before). + * If @entry_order is %NULL, %TRUE means to move @entry to the tail of the list + * (otherwise the beginning). Note that "tail of the list" here means that @entry + * will be linked before the head of the circular list. + * + * Returns: %TRUE, if anything was changed. Otherwise, @entry was already at the + * right place and nothing was done. + */ +gboolean +nm_dedup_multi_entry_reorder (const NMDedupMultiEntry *entry, + const NMDedupMultiEntry *entry_order, + gboolean order_after) +{ + nm_assert (entry); + + if (!entry_order) { + const NMDedupMultiHeadEntry *head_entry = entry->head; + + nm_assert (c_list_contains (&head_entry->lst_entries_head, &entry->lst_entries)); + if (order_after) { + if (head_entry->lst_entries_head.prev != &entry->lst_entries) { + c_list_unlink ((CList *) &entry->lst_entries); + c_list_link_tail ((CList *) &head_entry->lst_entries_head, (CList *) &entry->lst_entries); + return TRUE; + } + } else { + if (head_entry->lst_entries_head.next != &entry->lst_entries) { + c_list_unlink ((CList *) &entry->lst_entries); + c_list_link_front ((CList *) &head_entry->lst_entries_head, (CList *) &entry->lst_entries); + return TRUE; + } + } + } else if (entry != entry_order) { + if (order_after) { + if (entry_order->lst_entries.next != &entry->lst_entries) { + c_list_unlink ((CList *) &entry->lst_entries); + c_list_link_after ((CList *) &entry_order->lst_entries, (CList *) &entry->lst_entries); + return TRUE; + } + } else { + if (entry_order->lst_entries.prev != &entry->lst_entries) { + c_list_unlink ((CList *) &entry->lst_entries); + c_list_link_before ((CList *) &entry_order->lst_entries, (CList *) &entry->lst_entries); + return TRUE; + } + } + } + + return FALSE; +} + /*****************************************************************************/ NMDedupMultiIndex * diff --git a/shared/nm-utils/nm-dedup-multi.h b/shared/nm-utils/nm-dedup-multi.h index 25a91d4aca..ee74da10cf 100644 --- a/shared/nm-utils/nm-dedup-multi.h +++ b/shared/nm-utils/nm-dedup-multi.h @@ -383,6 +383,10 @@ nm_dedup_multi_head_entry_sort (const NMDedupMultiHeadEntry *head_entry, } } +gboolean nm_dedup_multi_entry_reorder (const NMDedupMultiEntry *entry, + const NMDedupMultiEntry *entry_order, + gboolean order_after); + /*****************************************************************************/ #endif /* __NM_DEDUP_MULTI_H__ */ |