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