#include "stdafx.h" #include "DoublyLinkedList.h" class DoublyLinkedList; DoublyLinkedListItem::DoublyLinkedListItem(DoublyLinkedList *list) { Id = -1; // Initialize the list pointers pNextItem = NULL; pPrevItem = NULL; pList = list; if (list) { list->Add(this); } } DoublyLinkedListItem::DoublyLinkedListItem(DoublyLinkedList *list, int newId) { Id = newId; // Initialize the list pointers pNextItem = NULL; pPrevItem = NULL; pList = list; if (list) { list->Add(this); } } DoublyLinkedListItem::~DoublyLinkedListItem(void) { Id = -1; // Initialize the list pointers pNextItem = NULL; pPrevItem = NULL; } DoublyLinkedList::DoublyLinkedList(ILockable* locker) { Locker = locker; //InitializeCriticalSectionAndSpinCount(&CriticalSection, 0x00000400); pFirstItem = NULL; pLastItem = NULL; disposed = 0; itemCount = 0; } DoublyLinkedList::~DoublyLinkedList(void) { if (disposed != 0) { return; } LOCK(Locker); disposed = 1; DoublyLinkedListItem* curObj = pFirstItem; while (curObj != NULL) { DoublyLinkedListItem* nextObj = curObj->pNextItem; delete curObj; curObj = nextObj; } pFirstItem = NULL; pLastItem = NULL; } void DoublyLinkedList::Add(DoublyLinkedListItem* object) { LOCK(Locker); int cmdId = -1; // Initialize the list pointers object->pNextItem = NULL; object->pPrevItem = NULL; object->pList = this; // Add to the list of objects registered to be exported if(!pFirstItem) { // first object, initialize the list with this as the only element pFirstItem = object; pLastItem = object; } else { // add to the end of the list pLastItem->pNextItem = object; object->pPrevItem = pLastItem; pLastItem = object; } itemCount++; } void DoublyLinkedList::Remove(DoublyLinkedListItem* pObject, int deleteObj) { LOCK(Locker); // Remove from the list if ((pFirstItem == pObject) && (pLastItem == pObject)) { // only object in the list, so NULL out the list head and tail pointers pFirstItem = NULL; pLastItem = NULL; } else if (pFirstItem == pObject) { // first object in list, set the head to the next object in the list pFirstItem = pObject->pNextItem; pFirstItem->pPrevItem = NULL; } else if (pLastItem == pObject) { // last object, set the tail to the pervious object in the list pLastItem = pObject->pPrevItem; pLastItem->pNextItem = NULL; } else { // in the middle of the list, so link the pointers for the previous // and next objects. pObject->pPrevItem->pNextItem = pObject->pNextItem; pObject->pNextItem->pPrevItem = pObject->pPrevItem; } pObject->pPrevItem = NULL; pObject->pNextItem = NULL; if (deleteObj) { delete pObject; } itemCount--; } void DoublyLinkedList::Remove(int id) { LOCK(Locker); DoublyLinkedListItem* item = DoublyLinkedList::Find(id); Remove(item); } DoublyLinkedListItem* DoublyLinkedList::Find(int id) { LOCK(Locker); DoublyLinkedListItem* value = NULL; DoublyLinkedListItem* curObj = pFirstItem; while (curObj != NULL) { if (curObj->Id == id) { value = curObj; curObj = NULL; break; } curObj = curObj->pNextItem; } return value; }
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#1 | 21852 | cswiedler | Branch //guest/cswiedler/p4connect | ||
//guest/perforce_software/p4connect/main/src/P4Bridge/p4bridge/DoublyLinkedList.cpp | |||||
#1 | 16209 | Norman Morse | Move entire source tree into "main" branch so workshop code will act correctly. | ||
//guest/perforce_software/p4connect/src/P4Bridge/p4bridge/DoublyLinkedList.cpp | |||||
#2 | 12135 | Norman Morse |
Integrate dev branch changes into main. This code is the basiis of the 2.7 BETA release which provides Unity 5 compatibility |
||
#1 | 10940 | Norman Morse |
Inital Workshop release of P4Connect. Released under BSD-2 license |