From b6d80040509cced0dd9fc6d004814ab18b57fee9 Mon Sep 17 00:00:00 2001 From: Richard Frith-MacDonald Date: Wed, 29 Sep 2010 17:32:34 +0000 Subject: [PATCH] add functions to move to start/end of list git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/performance/trunk@31442 72102866-910b-0410-8b05-ffd578937521 --- GSLinkedList.h | 10 +++ GSLinkedList.m | 206 +++++++++++++++++++++++++++++-------------------- 2 files changed, 134 insertions(+), 82 deletions(-) diff --git a/GSLinkedList.h b/GSLinkedList.h index b786737..9ee57bf 100644 --- a/GSLinkedList.h +++ b/GSLinkedList.h @@ -260,6 +260,16 @@ GSLinkedListInsertAfter(GSListLink *link, GSLinkedList *list, GSListLink *at); extern void GSLinkedListInsertBefore(GSListLink *link, GSLinkedList *list, GSListLink *at); +/** Moves the link to the head of the list if it is not already there. + */ +extern void +GSLinkedListMoveToHead(GSListLink *link, GSLinkedList *list); + +/** Moves the link to the tail of the list if it is not already there. + */ +extern void +GSLinkedListMoveToTail(GSListLink *link, GSLinkedList *list); + /** Removes link from the list.
* Updates the head, tail and count variables of list.
* Does not release link. diff --git a/GSLinkedList.m b/GSLinkedList.m index 48178cc..cc5087b 100644 --- a/GSLinkedList.m +++ b/GSLinkedList.m @@ -282,88 +282,6 @@ @end -void -GSLinkedListInsertBefore(GSListLink *link, GSLinkedList *list, GSListLink *at) -{ - if (nil == list->head) - { - list->head = list->tail = link; - } - else - { - link->previous = at->previous; - if (nil == link->previous) - { - list->head = link; - } - else - { - link->previous->next = link; - } - at->previous = link; - link->next = at; - } - link->owner = list; - list->count++; -} - -void -GSLinkedListInsertAfter(GSListLink *link, GSLinkedList *list, GSListLink *at) -{ - if (nil == list->head) - { - list->head = list->tail = link; - } - else - { - link->next = at->next; - if (nil == link->next) - { - list->tail = link; - } - else - { - link->next->previous = link; - } - at->next = link; - link->previous = at; - } - link->owner = list; - list->count++; -} - -void -GSLinkedListRemove(GSListLink *link, GSLinkedList *list) -{ - if (list->head == link) - { - list->head = link->next; - if (nil != list->head) - { - list->head->previous = nil; - } - } - else - { - link->previous->next = link->next; - } - if (list->tail == link) - { - list->tail = link->previous; - if (nil != list->tail) - { - list->tail->next = nil; - } - } - else - { - link->next->previous = link->previous; - } - link->next = link->previous = nil; - link->owner = nil; - list->count--; -} - GSListLink* GSLinkedListFindEqual(NSObject *object, GSLinkedList *list, GSListLink *from, BOOL back) @@ -451,3 +369,127 @@ GSLinkedListFindIdentical(NSObject *object, GSLinkedList *list, return nil; } +void +GSLinkedListInsertBefore(GSListLink *link, GSLinkedList *list, GSListLink *at) +{ + if (nil == list->head) + { + list->head = list->tail = link; + } + else + { + link->previous = at->previous; + if (nil == link->previous) + { + list->head = link; + } + else + { + link->previous->next = link; + } + at->previous = link; + link->next = at; + } + link->owner = list; + list->count++; +} + +void +GSLinkedListInsertAfter(GSListLink *link, GSLinkedList *list, GSListLink *at) +{ + if (nil == list->head) + { + list->head = list->tail = link; + } + else + { + link->next = at->next; + if (nil == link->next) + { + list->tail = link; + } + else + { + link->next->previous = link; + } + at->next = link; + link->previous = at; + } + link->owner = list; + list->count++; +} + +void +GSLinkedListRemove(GSListLink *link, GSLinkedList *list) +{ + if (list->head == link) + { + list->head = link->next; + if (nil != list->head) + { + list->head->previous = nil; + } + } + else + { + link->previous->next = link->next; + } + if (list->tail == link) + { + list->tail = link->previous; + if (nil != list->tail) + { + list->tail->next = nil; + } + } + else + { + link->next->previous = link->previous; + } + link->next = link->previous = nil; + link->owner = nil; + list->count--; +} + +extern void +GSLinkedListMoveToHead(GSListLink *link, GSLinkedList *list) +{ + if (link != list->head) + { + if (link == list->tail) + { + list->tail = link->previous; + list->tail->next = nil; + } + else + { + link->next->previous = link->previous; + link->previous->next = link->next; + } + link->next = list->head; + link->previous = nil; + list->head = link; + } +} + +extern void +GSLinkedListMoveToTail(GSListLink *link, GSLinkedList *list) +{ + if (link != list->tail) + { + if (link == list->head) + { + list->head = link->next; + list->head->previous = nil; + } + else + { + link->next->previous = link->previous; + link->previous->next = link->next; + } + link->next = nil; + link->previous = list->tail; + list->tail = link; + } +} +