mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-01-05 12:40:16 +01:00
glib-aux: add nm_dedup_multi_iter_init_reverse() to iterate in reverse order
(cherry picked from commit 57a519cc03)
This commit is contained in:
parent
b1a7c71da7
commit
1803370cb2
1 changed files with 38 additions and 2 deletions
|
|
@ -309,8 +309,11 @@ guint nm_dedup_multi_index_dirty_remove_idx(NMDedupMultiIndex * self,
|
|||
/*****************************************************************************/
|
||||
|
||||
typedef struct _NMDedupMultiIter {
|
||||
const CList * _head;
|
||||
const CList * _next;
|
||||
const CList *_head;
|
||||
union {
|
||||
const CList *_next;
|
||||
const CList *_prev;
|
||||
};
|
||||
const NMDedupMultiEntry *current;
|
||||
} NMDedupMultiIter;
|
||||
|
||||
|
|
@ -329,6 +332,21 @@ nm_dedup_multi_iter_init(NMDedupMultiIter *iter, const NMDedupMultiHeadEntry *he
|
|||
iter->current = NULL;
|
||||
}
|
||||
|
||||
static inline void
|
||||
nm_dedup_multi_iter_init_reverse(NMDedupMultiIter *iter, const NMDedupMultiHeadEntry *head)
|
||||
{
|
||||
g_return_if_fail(iter);
|
||||
|
||||
if (head && !c_list_is_empty(&head->lst_entries_head)) {
|
||||
iter->_head = &head->lst_entries_head;
|
||||
iter->_prev = head->lst_entries_head.prev;
|
||||
} else {
|
||||
iter->_head = NULL;
|
||||
iter->_prev = NULL;
|
||||
}
|
||||
iter->current = NULL;
|
||||
}
|
||||
|
||||
static inline gboolean
|
||||
nm_dedup_multi_iter_next(NMDedupMultiIter *iter)
|
||||
{
|
||||
|
|
@ -347,6 +365,24 @@ nm_dedup_multi_iter_next(NMDedupMultiIter *iter)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
static inline gboolean
|
||||
nm_dedup_multi_iter_prev(NMDedupMultiIter *iter)
|
||||
{
|
||||
g_return_val_if_fail(iter, FALSE);
|
||||
|
||||
if (!iter->_prev)
|
||||
return FALSE;
|
||||
|
||||
/* we always look ahead for the prev. This way, the user
|
||||
* may delete the current entry (but no other entries). */
|
||||
iter->current = c_list_entry(iter->_prev, NMDedupMultiEntry, lst_entries);
|
||||
if (iter->_prev->prev == iter->_head)
|
||||
iter->_prev = NULL;
|
||||
else
|
||||
iter->_prev = iter->_prev->prev;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#define nm_dedup_multi_iter_for_each(iter, head_entry) \
|
||||
for (nm_dedup_multi_iter_init((iter), (head_entry)); nm_dedup_multi_iter_next((iter));)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue