1f220fa62Smrg/*
2f220fa62Smrg * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
3f220fa62Smrg * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
4f220fa62Smrg *
5f220fa62Smrg * Permission is hereby granted, free of charge, to any person obtaining a
6f220fa62Smrg * copy of this software and associated documentation files (the "Software"),
7f220fa62Smrg * to deal in the Software without restriction, including without limitation
8f220fa62Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9f220fa62Smrg * and/or sell copies of the Software, and to permit persons to whom the
10f220fa62Smrg * Software is furnished to do so, subject to the following conditions:
11f220fa62Smrg *
12f220fa62Smrg * The above copyright notice including the dates of first publication and
13f220fa62Smrg * either this permission notice or a reference to
14f220fa62Smrg * http://oss.sgi.com/projects/FreeB/
15f220fa62Smrg * shall be included in all copies or substantial portions of the Software.
16f220fa62Smrg *
17f220fa62Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18f220fa62Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19f220fa62Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20f220fa62Smrg * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
21f220fa62Smrg * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
22f220fa62Smrg * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23f220fa62Smrg * SOFTWARE.
24f220fa62Smrg *
25f220fa62Smrg * Except as contained in this notice, the name of Silicon Graphics, Inc.
26f220fa62Smrg * shall not be used in advertising or otherwise to promote the sale, use or
27f220fa62Smrg * other dealings in this Software without prior written authorization from
28f220fa62Smrg * Silicon Graphics, Inc.
29f220fa62Smrg */
30f220fa62Smrg/*
31f220fa62Smrg** Author: Eric Veach, July 1994.
32f220fa62Smrg**
33f220fa62Smrg*/
34f220fa62Smrg
35f220fa62Smrg#ifndef __dict_list_h_
36f220fa62Smrg#define __dict_list_h_
37f220fa62Smrg
38f220fa62Smrg/* Use #define's so that another heap implementation can use this one */
39f220fa62Smrg
40f220fa62Smrg#define DictKey		DictListKey
41f220fa62Smrg#define Dict		DictList
42f220fa62Smrg#define DictNode	DictListNode
43f220fa62Smrg
44f220fa62Smrg#define dictNewDict(frame,leq)		__gl_dictListNewDict(frame,leq)
45f220fa62Smrg#define dictDeleteDict(dict)		__gl_dictListDeleteDict(dict)
46f220fa62Smrg
47f220fa62Smrg#define dictSearch(dict,key)		__gl_dictListSearch(dict,key)
48f220fa62Smrg#define dictInsert(dict,key)		__gl_dictListInsert(dict,key)
49f220fa62Smrg#define dictInsertBefore(dict,node,key)	__gl_dictListInsertBefore(dict,node,key)
50f220fa62Smrg#define dictDelete(dict,node)		__gl_dictListDelete(dict,node)
51f220fa62Smrg
52f220fa62Smrg#define dictKey(n)			__gl_dictListKey(n)
53f220fa62Smrg#define dictSucc(n)			__gl_dictListSucc(n)
54f220fa62Smrg#define dictPred(n)			__gl_dictListPred(n)
55f220fa62Smrg#define dictMin(d)			__gl_dictListMin(d)
56f220fa62Smrg#define dictMax(d)			__gl_dictListMax(d)
57f220fa62Smrg
58f220fa62Smrg
59f220fa62Smrg
60f220fa62Smrgtypedef void *DictKey;
61f220fa62Smrgtypedef struct Dict Dict;
62f220fa62Smrgtypedef struct DictNode DictNode;
63f220fa62Smrg
64f220fa62SmrgDict		*dictNewDict(
65f220fa62Smrg			void *frame,
66f220fa62Smrg			int (*leq)(void *frame, DictKey key1, DictKey key2) );
67f220fa62Smrg
68f220fa62Smrgvoid		dictDeleteDict( Dict *dict );
69f220fa62Smrg
70f220fa62Smrg/* Search returns the node with the smallest key greater than or equal
71f220fa62Smrg * to the given key.  If there is no such key, returns a node whose
72f220fa62Smrg * key is NULL.  Similarly, Succ(Max(d)) has a NULL key, etc.
73f220fa62Smrg */
74f220fa62SmrgDictNode	*dictSearch( Dict *dict, DictKey key );
75f220fa62SmrgDictNode	*dictInsertBefore( Dict *dict, DictNode *node, DictKey key );
76f220fa62Smrgvoid		dictDelete( Dict *dict, DictNode *node );
77f220fa62Smrg
78f220fa62Smrg#define		__gl_dictListKey(n)	((n)->key)
79f220fa62Smrg#define		__gl_dictListSucc(n)	((n)->next)
80f220fa62Smrg#define		__gl_dictListPred(n)	((n)->prev)
81f220fa62Smrg#define		__gl_dictListMin(d)	((d)->head.next)
82f220fa62Smrg#define		__gl_dictListMax(d)	((d)->head.prev)
83f220fa62Smrg#define	       __gl_dictListInsert(d,k) (dictInsertBefore((d),&(d)->head,(k)))
84f220fa62Smrg
85f220fa62Smrg
86f220fa62Smrg/*** Private data structures ***/
87f220fa62Smrg
88f220fa62Smrgstruct DictNode {
89f220fa62Smrg  DictKey	key;
90f220fa62Smrg  DictNode	*next;
91f220fa62Smrg  DictNode	*prev;
92f220fa62Smrg};
93f220fa62Smrg
94f220fa62Smrgstruct Dict {
95f220fa62Smrg  DictNode	head;
96f220fa62Smrg  void		*frame;
97f220fa62Smrg  int		(*leq)(void *frame, DictKey key1, DictKey key2);
98f220fa62Smrg};
99f220fa62Smrg
100f220fa62Smrg#endif
101