147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/* -*- Mode: C; tab-width: 4 -*-
247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt *
347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * Copyright (c) 2003 Apple Computer, Inc. All rights reserved.
447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt *
547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * Licensed under the Apache License, Version 2.0 (the "License");
647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * you may not use this file except in compliance with the License.
747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * You may obtain a copy of the License at
847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt *
947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt *     http://www.apache.org/licenses/LICENSE-2.0
1047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt *
1147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * Unless required by applicable law or agreed to in writing, software
1247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * distributed under the License is distributed on an "AS IS" BASIS,
1347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * See the License for the specific language governing permissions and
1547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * limitations under the License.
1647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt */
1747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
1847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#ifndef __GenLinkedList__
1947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define __GenLinkedList__
2047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
2147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
2247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#include <stddef.h>
2347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
2447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
2547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstruct	GenLinkedList
2647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
2747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	void		*Head,
2847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				*Tail;
2947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	size_t		LinkOffset;
3047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt};
3147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalttypedef struct GenLinkedList	GenLinkedList;
3247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
3347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
3447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltvoid		InitLinkedList( GenLinkedList *pList, size_t linkOffset);
3547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
3647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltvoid		AddToHead( GenLinkedList *pList, void *elem);
3747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltvoid		AddToTail( GenLinkedList *pList, void *elem);
3847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
3947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltint		RemoveFromList( GenLinkedList *pList, void *elem);
4047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
4147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltint		ReplaceElem( GenLinkedList *pList, void *elemInList, void *newElem);
4247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
4347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
4447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
4547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstruct	GenDoubleLinkedList
4647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
4747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	void		*Head,
4847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				*Tail;
4947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	size_t		FwdLinkOffset,
5047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				BackLinkOffset;
5147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt};
5247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalttypedef struct GenDoubleLinkedList	GenDoubleLinkedList;
5347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
5447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
5547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltvoid		InitDoubleLinkedList( GenDoubleLinkedList *pList, size_t fwdLinkOffset,
5647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt									  size_t backLinkOffset);
5747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
5847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltvoid		DLLAddToHead( GenDoubleLinkedList *pList, void *elem);
5947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
6047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltvoid		DLLRemoveFromList( GenDoubleLinkedList *pList, void *elem);
6147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
6247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
6347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
6447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/* A GenLinkedOffsetList is like a GenLinkedList that stores the *Next field as a signed */
6547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/* offset from the address of the beginning of the element, rather than as a pointer. */
6647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
6747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstruct	GenLinkedOffsetList
6847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
6947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	size_t		Head,
7047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				Tail;
7147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	size_t		LinkOffset;
7247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt};
7347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalttypedef struct GenLinkedOffsetList	GenLinkedOffsetList;
7447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
7547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
7647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltvoid		InitLinkedOffsetList( GenLinkedOffsetList *pList, size_t linkOffset);
7747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
7847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltvoid		*GetHeadPtr( GenLinkedOffsetList *pList);
7947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltvoid		*GetTailPtr( GenLinkedOffsetList *pList);
8047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltvoid		*GetOffsetLink( GenLinkedOffsetList *pList, void *elem);
8147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
8247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltvoid		OffsetAddToHead( GenLinkedOffsetList *pList, void *elem);
8347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltvoid		OffsetAddToTail( GenLinkedOffsetList *pList, void *elem);
8447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
8547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltint		OffsetRemoveFromList( GenLinkedOffsetList *pList, void *elem);
8647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
8747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltint		OffsetReplaceElem( GenLinkedOffsetList *pList, void *elemInList, void *newElem);
8847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
8947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
9047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif //	__GenLinkedList__
91