1 /* -*- Mode: C; tab-width: 4 -*- 2 * 3 * Copyright (c) 2003 Apple Computer, Inc. All rights reserved. 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 #ifndef __GenLinkedList__ 19 #define __GenLinkedList__ 20 21 22 #include <stddef.h> 23 24 25 struct GenLinkedList 26 { 27 void *Head, 28 *Tail; 29 size_t LinkOffset; 30 }; 31 typedef struct GenLinkedList GenLinkedList; 32 33 34 void InitLinkedList( GenLinkedList *pList, size_t linkOffset); 35 36 void AddToHead( GenLinkedList *pList, void *elem); 37 void AddToTail( GenLinkedList *pList, void *elem); 38 39 int RemoveFromList( GenLinkedList *pList, void *elem); 40 41 int ReplaceElem( GenLinkedList *pList, void *elemInList, void *newElem); 42 43 44 45 struct GenDoubleLinkedList 46 { 47 void *Head, 48 *Tail; 49 size_t FwdLinkOffset, 50 BackLinkOffset; 51 }; 52 typedef struct GenDoubleLinkedList GenDoubleLinkedList; 53 54 55 void InitDoubleLinkedList( GenDoubleLinkedList *pList, size_t fwdLinkOffset, 56 size_t backLinkOffset); 57 58 void DLLAddToHead( GenDoubleLinkedList *pList, void *elem); 59 60 void DLLRemoveFromList( GenDoubleLinkedList *pList, void *elem); 61 62 63 64 /* A GenLinkedOffsetList is like a GenLinkedList that stores the *Next field as a signed */ 65 /* offset from the address of the beginning of the element, rather than as a pointer. */ 66 67 struct GenLinkedOffsetList 68 { 69 size_t Head, 70 Tail; 71 size_t LinkOffset; 72 }; 73 typedef struct GenLinkedOffsetList GenLinkedOffsetList; 74 75 76 void InitLinkedOffsetList( GenLinkedOffsetList *pList, size_t linkOffset); 77 78 void *GetHeadPtr( GenLinkedOffsetList *pList); 79 void *GetTailPtr( GenLinkedOffsetList *pList); 80 void *GetOffsetLink( GenLinkedOffsetList *pList, void *elem); 81 82 void OffsetAddToHead( GenLinkedOffsetList *pList, void *elem); 83 void OffsetAddToTail( GenLinkedOffsetList *pList, void *elem); 84 85 int OffsetRemoveFromList( GenLinkedOffsetList *pList, void *elem); 86 87 int OffsetReplaceElem( GenLinkedOffsetList *pList, void *elemInList, void *newElem); 88 89 90 #endif // __GenLinkedList__ 91