glib-aux: add nm_dedup_multi_iter_init_reverse() to iterate in reverse order

(cherry picked from commit 57a519cc03)
This commit is contained in:
Thomas Haller 2021-08-17 11:16:51 +02:00
parent b1a7c71da7
commit 1803370cb2
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728

View file

@ -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));)