/******************************************************************************* * Copyright (c) 2009, 2020 IBM Corp. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v2.0 * and Eclipse Distribution License v1.0 which accompany this distribution. * * The Eclipse Public License is available at * https://www.eclipse.org/legal/epl-2.0/ * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * Ian Craggs - initial API and implementation and/or initial documentation * Ian Craggs - updates for the async client * Ian Craggs - change size types from int to size_t *******************************************************************************/ #if !defined(LINKEDLIST_H) #define LINKEDLIST_H #include /* for size_t definition */ /*BE defm defList(T) def T concat Item { at 4 n32 ptr T concat Item suppress "next" at 0 n32 ptr T concat Item suppress "prev" at 8 n32 ptr T id2str(T) } def T concat List { n32 ptr T concat Item suppress "first" n32 ptr T concat Item suppress "last" n32 ptr T concat Item suppress "current" n32 dec "count" n32 suppress "size" } endm defList(INT) defList(STRING) defList(TMP) BE*/ /** * Structure to hold all data for one list element */ typedef struct ListElementStruct { struct ListElementStruct *prev, /**< pointer to previous list element */ *next; /**< pointer to next list element */ void* content; /**< pointer to element content */ } ListElement; /** * Structure to hold all data for one list */ typedef struct { ListElement *first, /**< first element in the list */ *last, /**< last element in the list */ *current; /**< current element in the list, for iteration */ int count; /**< no of items */ size_t size; /**< heap storage used */ } List; void ListZero(List*); List* ListInitialize(void); ListElement* ListAppend(List* aList, void* content, size_t size); void ListAppendNoMalloc(List* aList, void* content, ListElement* newel, size_t size); ListElement* ListInsert(List* aList, void* content, size_t size, ListElement* index); int ListRemove(List* aList, void* content); int ListRemoveItem(List* aList, void* content, int(*callback)(void*, void*)); void* ListDetachHead(List* aList); int ListRemoveHead(List* aList); void* ListPopTail(List* aList); int ListDetach(List* aList, void* content); int ListDetachItem(List* aList, void* content, int(*callback)(void*, void*)); void ListFree(List* aList); void ListEmpty(List* aList); void ListFreeNoContent(List* aList); ListElement* ListNextElement(List* aList, ListElement** pos); ListElement* ListPrevElement(List* aList, ListElement** pos); ListElement* ListFind(List* aList, void* content); ListElement* ListFindItem(List* aList, void* content, int(*callback)(void*, void*)); int intcompare(void* a, void* b); int stringcompare(void* a, void* b); #endif