GenLinkedList.h revision 4904:cd464a980538
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 	File:		GenLinkedList.c
18
19 	Contains:	interface to generic linked lists.
20
21 	Version:	1.0
22 	Tabs:		4 spaces
23
24    Change History (most recent first):
25
26$Log: GenLinkedList.h,v $
27Revision 1.3  2006/08/14 23:24:56  cheshire
28Re-licensed mDNSResponder daemon source code under Apache License, Version 2.0
29
30Revision 1.2  2004/02/05 07:41:08  cheshire
31Add Log header
32
33*/
34
35#pragma ident	"%Z%%M%	%I%	%E% SMI"
36
37#ifndef __GenLinkedList__
38#define __GenLinkedList__
39
40
41#include <stddef.h>
42
43
44struct	GenLinkedList
45{
46	void		*Head,
47				*Tail;
48	size_t		LinkOffset;
49};
50typedef struct GenLinkedList	GenLinkedList;
51
52
53void		InitLinkedList( GenLinkedList *pList, size_t linkOffset);
54
55void		AddToHead( GenLinkedList *pList, void *elem);
56void		AddToTail( GenLinkedList *pList, void *elem);
57
58int		RemoveFromList( GenLinkedList *pList, void *elem);
59
60int		ReplaceElem( GenLinkedList *pList, void *elemInList, void *newElem);
61
62
63
64struct	GenDoubleLinkedList
65{
66	void		*Head,
67				*Tail;
68	size_t		FwdLinkOffset,
69				BackLinkOffset;
70};
71typedef struct GenDoubleLinkedList	GenDoubleLinkedList;
72
73
74void		InitDoubleLinkedList( GenDoubleLinkedList *pList, size_t fwdLinkOffset,
75									  size_t backLinkOffset);
76
77void		DLLAddToHead( GenDoubleLinkedList *pList, void *elem);
78
79void		DLLRemoveFromList( GenDoubleLinkedList *pList, void *elem);
80
81
82
83/* A GenLinkedOffsetList is like a GenLinkedList that stores the *Next field as a signed */
84/* offset from the address of the beginning of the element, rather than as a pointer. */
85
86struct	GenLinkedOffsetList
87{
88	size_t		Head,
89				Tail;
90	size_t		LinkOffset;
91};
92typedef struct GenLinkedOffsetList	GenLinkedOffsetList;
93
94
95void		InitLinkedOffsetList( GenLinkedOffsetList *pList, size_t linkOffset);
96
97void		*GetHeadPtr( GenLinkedOffsetList *pList);
98void		*GetTailPtr( GenLinkedOffsetList *pList);
99void		*GetOffsetLink( GenLinkedOffsetList *pList, void *elem);
100
101void		OffsetAddToHead( GenLinkedOffsetList *pList, void *elem);
102void		OffsetAddToTail( GenLinkedOffsetList *pList, void *elem);
103
104int		OffsetRemoveFromList( GenLinkedOffsetList *pList, void *elem);
105
106int		OffsetReplaceElem( GenLinkedOffsetList *pList, void *elemInList, void *newElem);
107
108
109#endif //	__GenLinkedList__
110