New util function: BLI_listbases_swaplinks
This commit is contained in:
parent
a42a0b5ef3
commit
9b2877ad88
|
@ -76,6 +76,7 @@ int BLI_listbase_count(const struct ListBase *listbase) ATTR_WARN_UNUSED_RESULT
|
|||
void BLI_freelinkN(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1);
|
||||
|
||||
void BLI_listbase_swaplinks(struct ListBase *listbase, void *vlinka, void *vlinkb) ATTR_NONNULL(1, 2);
|
||||
void BLI_listbases_swaplinks(struct ListBase *listbasea, struct ListBase *listbaseb, void *vlinka, void *vlinkb) ATTR_NONNULL(2, 3);
|
||||
|
||||
void BLI_movelisttolist(struct ListBase *dst, struct ListBase *src) ATTR_NONNULL(1, 2);
|
||||
void BLI_duplicatelist(struct ListBase *dst, const struct ListBase *src) ATTR_NONNULL(1, 2);
|
||||
|
|
|
@ -169,6 +169,34 @@ void BLI_listbase_swaplinks(ListBase *listbase, void *vlinka, void *vlinkb)
|
|||
else if (listbase->first == linkb) listbase->first = linka;
|
||||
}
|
||||
|
||||
/**
|
||||
* Swaps \a vlinka and \a vlinkb from their respective lists. Assumes they are both already in their lista!
|
||||
*/
|
||||
void BLI_listbases_swaplinks(ListBase *listbasea, ListBase *listbaseb, void *vlinka, void *vlinkb)
|
||||
{
|
||||
Link *linka = vlinka;
|
||||
Link *linkb = vlinkb;
|
||||
Link linkc = {NULL};
|
||||
|
||||
if (!linka || !linkb) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Temporary link to use as placeholder of the links positions */
|
||||
BLI_insertlinkafter(listbasea, linka, &linkc);
|
||||
|
||||
/* Bring linka into linkb position */
|
||||
BLI_remlink(listbasea, linka);
|
||||
BLI_insertlinkafter(listbaseb, linkb, linka);
|
||||
|
||||
/* Bring linkb into linka position */
|
||||
BLI_remlink(listbaseb, linkb);
|
||||
BLI_insertlinkafter(listbasea, &linkc, linkb);
|
||||
|
||||
/* Remove temporary link */
|
||||
BLI_remlink(listbasea, &linkc);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the head from \a listbase and returns it.
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue