20#include <winpr/config.h>
22#include <winpr/collections.h>
23#include <winpr/assert.h>
25typedef struct s_wLinkedListItem wLinkedListNode;
27struct s_wLinkedListItem
30 wLinkedListNode* prev;
31 wLinkedListNode* next;
38 wLinkedListNode* head;
39 wLinkedListNode* tail;
40 wLinkedListNode* current;
59size_t LinkedList_Count(wLinkedList* list)
69void* LinkedList_First(wLinkedList* list)
73 return list->head->value;
82void* LinkedList_Last(wLinkedList* list)
86 return list->tail->value;
99BOOL LinkedList_Contains(wLinkedList* list,
const void* value)
101 wLinkedListNode* item =
nullptr;
102 OBJECT_EQUALS_FN keyEquals =
nullptr;
109 keyEquals = list->object.fnObjectEquals;
113 if (keyEquals(item->value, value))
119 return (item !=
nullptr);
122static wLinkedListNode* LinkedList_FreeNode(wLinkedList* list, wLinkedListNode* node)
124 wLinkedListNode* next =
nullptr;
125 wLinkedListNode* prev =
nullptr;
138 if (node == list->head)
139 list->head = node->next;
141 if (node == list->tail)
142 list->tail = node->prev;
144 if (node == list->current)
148 list->current = prev;
153 if (list->object.fnObjectUninit)
154 list->object.fnObjectUninit(node);
156 if (list->object.fnObjectFree)
157 list->object.fnObjectFree(node);
168void LinkedList_Clear(wLinkedList* list)
170 wLinkedListNode* node =
nullptr;
178 node = LinkedList_FreeNode(list, node);
180 list->head = list->tail =
nullptr;
184static wLinkedListNode* LinkedList_Create(wLinkedList* list,
const void* value)
186 wLinkedListNode* node =
nullptr;
189 node = (wLinkedListNode*)calloc(1,
sizeof(wLinkedListNode));
194 if (list->object.fnObjectNew)
195 node->value = list->object.fnObjectNew(value);
204 node->value = cnv.pv;
207 if (list->object.fnObjectInit)
208 list->object.fnObjectInit(node);
216BOOL LinkedList_AddFirst(wLinkedList* list,
const void* value)
218 wLinkedListNode* node = LinkedList_Create(list, value);
225 list->tail = list->head = node;
229 list->head->prev = node;
230 node->next = list->head;
242BOOL LinkedList_AddLast(wLinkedList* list,
const void* value)
244 wLinkedListNode* node = LinkedList_Create(list, value);
251 list->head = list->tail = node;
255 list->tail->next = node;
256 node->prev = list->tail;
268BOOL LinkedList_Remove(wLinkedList* list,
const void* value)
270 wLinkedListNode* node =
nullptr;
271 OBJECT_EQUALS_FN keyEquals =
nullptr;
274 keyEquals = list->object.fnObjectEquals;
279 if (keyEquals(node->value, value))
281 LinkedList_FreeNode(list, node);
295void LinkedList_RemoveFirst(wLinkedList* list)
299 LinkedList_FreeNode(list, list->head);
306void LinkedList_RemoveLast(wLinkedList* list)
310 LinkedList_FreeNode(list, list->tail);
317void LinkedList_Enumerator_Reset(wLinkedList* list)
321 list->current =
nullptr;
328void* LinkedList_Enumerator_Current(wLinkedList* list)
335 return list->current->value;
344BOOL LinkedList_Enumerator_MoveNext(wLinkedList* list)
350 list->current = list->head;
352 else if (list->current)
353 list->current = list->current->next;
361static BOOL default_equal_function(
const void* objA,
const void* objB)
370wLinkedList* LinkedList_New(
void)
372 wLinkedList* list =
nullptr;
373 list = (wLinkedList*)calloc(1,
sizeof(wLinkedList));
377 list->object.fnObjectEquals = default_equal_function;
383void LinkedList_Free(wLinkedList* list)
387 LinkedList_Clear(list);
392wObject* LinkedList_Object(wLinkedList* list)
396 return &list->object;
This struct contains function pointer to initialize/free objects.