1 |
/* A splay-tree datatype. |
/* A splay-tree datatype. |
2 |
Copyright (C) 1998 Free Software Foundation, Inc. |
Copyright 1998, 1999, 2000, 2002 Free Software Foundation, Inc. |
3 |
Contributed by Mark Mitchell (mark@markmitchell.com). |
Contributed by Mark Mitchell (mark@markmitchell.com). |
4 |
|
|
5 |
This file is part of GNU CC. |
This file is part of GCC. |
6 |
|
|
7 |
GNU CC is free software; you can redistribute it and/or modify it |
GCC is free software; you can redistribute it and/or modify it |
8 |
under the terms of the GNU General Public License as published by |
under the terms of the GNU General Public License as published by |
9 |
the Free Software Foundation; either version 2, or (at your option) |
the Free Software Foundation; either version 2, or (at your option) |
10 |
any later version. |
any later version. |
11 |
|
|
12 |
GNU CC is distributed in the hope that it will be useful, but |
GCC is distributed in the hope that it will be useful, but |
13 |
WITHOUT ANY WARRANTY; without even the implied warranty of |
WITHOUT ANY WARRANTY; without even the implied warranty of |
14 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
15 |
General Public License for more details. |
General Public License for more details. |
16 |
|
|
17 |
You should have received a copy of the GNU General Public License |
You should have received a copy of the GNU General Public License |
18 |
along with GNU CC; see the file COPYING. If not, write to |
along with GCC; see the file COPYING. If not, write to |
19 |
the Free Software Foundation, 59 Temple Place - Suite 330, |
the Free Software Foundation, 59 Temple Place - Suite 330, |
20 |
Boston, MA 02111-1307, USA. */ |
Boston, MA 02111-1307, USA. */ |
21 |
|
|
34 |
extern "C" { |
extern "C" { |
35 |
#endif /* __cplusplus */ |
#endif /* __cplusplus */ |
36 |
|
|
37 |
#include <ansidecl.h> |
#include "ansidecl.h" |
38 |
|
|
39 |
|
#ifndef GTY |
40 |
|
#define GTY(X) |
41 |
|
#endif |
42 |
|
|
43 |
/* Use typedefs for the key and data types to facilitate changing |
/* Use typedefs for the key and data types to facilitate changing |
44 |
these types, if necessary. These types should be sufficiently wide |
these types, if necessary. These types should be sufficiently wide |
48 |
typedef unsigned long int splay_tree_value; |
typedef unsigned long int splay_tree_value; |
49 |
|
|
50 |
/* Forward declaration for a node in the tree. */ |
/* Forward declaration for a node in the tree. */ |
51 |
typedef struct splay_tree_node *splay_tree_node; |
typedef struct splay_tree_node_s *splay_tree_node; |
52 |
|
|
53 |
/* The type of a function which compares two splay-tree keys. The |
/* The type of a function which compares two splay-tree keys. The |
54 |
function should return values as for qsort. */ |
function should return values as for qsort. */ |
65 |
/* The type of a function used to iterate over the tree. */ |
/* The type of a function used to iterate over the tree. */ |
66 |
typedef int (*splay_tree_foreach_fn) PARAMS((splay_tree_node, void*)); |
typedef int (*splay_tree_foreach_fn) PARAMS((splay_tree_node, void*)); |
67 |
|
|
68 |
|
/* The type of a function used to allocate memory for tree root and |
69 |
|
node structures. The first argument is the number of bytes needed; |
70 |
|
the second is a data pointer the splay tree functions pass through |
71 |
|
to the allocator. This function must never return zero. */ |
72 |
|
typedef PTR (*splay_tree_allocate_fn) PARAMS((int, void *)); |
73 |
|
|
74 |
|
/* The type of a function used to free memory allocated using the |
75 |
|
corresponding splay_tree_allocate_fn. The first argument is the |
76 |
|
memory to be freed; the latter is a data pointer the splay tree |
77 |
|
functions pass through to the freer. */ |
78 |
|
typedef void (*splay_tree_deallocate_fn) PARAMS((void *, void *)); |
79 |
|
|
80 |
/* The nodes in the splay tree. */ |
/* The nodes in the splay tree. */ |
81 |
struct splay_tree_node |
struct splay_tree_node_s GTY(()) |
82 |
{ |
{ |
83 |
/* The key. */ |
/* The key. */ |
84 |
splay_tree_key key; |
splay_tree_key GTY ((use_param1 (""))) key; |
85 |
|
|
86 |
/* The value. */ |
/* The value. */ |
87 |
splay_tree_value value; |
splay_tree_value GTY ((use_param2 (""))) value; |
88 |
|
|
89 |
/* The left and right children, respectively. */ |
/* The left and right children, respectively. */ |
90 |
splay_tree_node left; |
splay_tree_node GTY ((use_params (""))) left; |
91 |
splay_tree_node right; |
splay_tree_node GTY ((use_params (""))) right; |
92 |
}; |
}; |
93 |
|
|
94 |
/* The splay tree itself. */ |
/* The splay tree itself. */ |
95 |
typedef struct splay_tree |
struct splay_tree_s GTY(()) |
96 |
{ |
{ |
97 |
/* The root of the tree. */ |
/* The root of the tree. */ |
98 |
splay_tree_node root; |
splay_tree_node GTY ((use_params (""))) root; |
99 |
|
|
100 |
/* The comparision function. */ |
/* The comparision function. */ |
101 |
splay_tree_compare_fn comp; |
splay_tree_compare_fn comp; |
105 |
|
|
106 |
/* The deallocate-value function. NULL if no cleanup is necessary. */ |
/* The deallocate-value function. NULL if no cleanup is necessary. */ |
107 |
splay_tree_delete_value_fn delete_value; |
splay_tree_delete_value_fn delete_value; |
108 |
} *splay_tree; |
|
109 |
|
/* Allocate/free functions, and a data pointer to pass to them. */ |
110 |
|
splay_tree_allocate_fn allocate; |
111 |
|
splay_tree_deallocate_fn deallocate; |
112 |
|
PTR GTY((skip (""))) allocate_data; |
113 |
|
|
114 |
|
}; |
115 |
|
typedef struct splay_tree_s *splay_tree; |
116 |
|
|
117 |
extern splay_tree splay_tree_new PARAMS((splay_tree_compare_fn, |
extern splay_tree splay_tree_new PARAMS((splay_tree_compare_fn, |
118 |
splay_tree_delete_key_fn, |
splay_tree_delete_key_fn, |
119 |
splay_tree_delete_value_fn)); |
splay_tree_delete_value_fn)); |
120 |
|
extern splay_tree splay_tree_new_with_allocator |
121 |
|
PARAMS((splay_tree_compare_fn, |
122 |
|
splay_tree_delete_key_fn, |
123 |
|
splay_tree_delete_value_fn, |
124 |
|
splay_tree_allocate_fn, |
125 |
|
splay_tree_deallocate_fn, |
126 |
|
void *)); |
127 |
extern void splay_tree_delete PARAMS((splay_tree)); |
extern void splay_tree_delete PARAMS((splay_tree)); |
128 |
extern void splay_tree_insert PARAMS((splay_tree, |
extern splay_tree_node splay_tree_insert |
129 |
|
PARAMS((splay_tree, |
130 |
splay_tree_key, |
splay_tree_key, |
131 |
splay_tree_value)); |
splay_tree_value)); |
132 |
|
extern void splay_tree_remove PARAMS((splay_tree, |
133 |
|
splay_tree_key)); |
134 |
extern splay_tree_node splay_tree_lookup |
extern splay_tree_node splay_tree_lookup |
135 |
PARAMS((splay_tree, |
PARAMS((splay_tree, |
136 |
splay_tree_key)); |
splay_tree_key)); |
137 |
|
extern splay_tree_node splay_tree_predecessor |
138 |
|
PARAMS((splay_tree, |
139 |
|
splay_tree_key)); |
140 |
|
extern splay_tree_node splay_tree_successor |
141 |
|
PARAMS((splay_tree, |
142 |
|
splay_tree_key)); |
143 |
|
extern splay_tree_node splay_tree_max |
144 |
|
PARAMS((splay_tree)); |
145 |
|
extern splay_tree_node splay_tree_min |
146 |
|
PARAMS((splay_tree)); |
147 |
extern int splay_tree_foreach PARAMS((splay_tree, |
extern int splay_tree_foreach PARAMS((splay_tree, |
148 |
splay_tree_foreach_fn, |
splay_tree_foreach_fn, |
149 |
void*)); |
void*)); |