]> gcc.gnu.org Git - gcc.git/blame - include/splay-tree.h
re PR go/78628 (GO fails to build a translation unit decl)
[gcc.git] / include / splay-tree.h
CommitLineData
52e90c55 1/* A splay-tree datatype.
2afd3180 2 Copyright (C) 1998-2017 Free Software Foundation, Inc.
52e90c55
MM
3 Contributed by Mark Mitchell (mark@markmitchell.com).
4
eb8f7caf 5 This file is part of GCC.
52e90c55 6
eb8f7caf
KT
7 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
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
916a8c46 11
eb8f7caf
KT
12 GCC is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 General Public License for more details.
916a8c46 16
eb8f7caf
KT
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to
19 the Free Software Foundation, 51 Franklin Street - Fifth Floor,
20 Boston, MA 02110-1301, USA. */
916a8c46
JL
21
22/* For an easily readable description of splay-trees, see:
52e90c55
MM
23
24 Lewis, Harry R. and Denenberg, Larry. Data Structures and Their
25 Algorithms. Harper-Collins, Inc. 1991.
26
27 The major feature of splay trees is that all basic tree operations
28 are amortized O(log n) time for a tree with n nodes. */
29
30#ifndef _SPLAY_TREE_H
31#define _SPLAY_TREE_H
32
33#ifdef __cplusplus
34extern "C" {
35#endif /* __cplusplus */
36
8ff82b06 37#include "ansidecl.h"
52e90c55 38
5973ae1a
TG
39#ifdef HAVE_STDINT_H
40#include <stdint.h>
428b80d5 41#endif
5973ae1a
TG
42#ifdef HAVE_INTTYPES_H
43#include <inttypes.h>
eb8f7caf
KT
44#endif
45
52e90c55
MM
46/* Use typedefs for the key and data types to facilitate changing
47 these types, if necessary. These types should be sufficiently wide
48 that any pointer or scalar can be cast to these types, and then
49 cast back, without loss of precision. */
5973ae1a
TG
50typedef uintptr_t splay_tree_key;
51typedef uintptr_t splay_tree_value;
52e90c55
MM
52
53/* Forward declaration for a node in the tree. */
08230f26 54typedef struct splay_tree_node_s *splay_tree_node;
52e90c55
MM
55
56/* The type of a function which compares two splay-tree keys. The
57 function should return values as for qsort. */
885f2199 58typedef int (*splay_tree_compare_fn) (splay_tree_key, splay_tree_key);
52e90c55
MM
59
60/* The type of a function used to deallocate any resources associated
61 with the key. */
885f2199 62typedef void (*splay_tree_delete_key_fn) (splay_tree_key);
52e90c55
MM
63
64/* The type of a function used to deallocate any resources associated
65 with the value. */
885f2199 66typedef void (*splay_tree_delete_value_fn) (splay_tree_value);
52e90c55
MM
67
68/* The type of a function used to iterate over the tree. */
885f2199 69typedef int (*splay_tree_foreach_fn) (splay_tree_node, void*);
52e90c55 70
00c2f96f
JB
71/* The type of a function used to allocate memory for tree root and
72 node structures. The first argument is the number of bytes needed;
73 the second is a data pointer the splay tree functions pass through
74 to the allocator. This function must never return zero. */
8766be86 75typedef void *(*splay_tree_allocate_fn) (int, void *);
00c2f96f
JB
76
77/* The type of a function used to free memory allocated using the
78 corresponding splay_tree_allocate_fn. The first argument is the
79 memory to be freed; the latter is a data pointer the splay tree
80 functions pass through to the freer. */
885f2199 81typedef void (*splay_tree_deallocate_fn) (void *, void *);
00c2f96f 82
52e90c55 83/* The nodes in the splay tree. */
63f5d5b8 84struct splay_tree_node_s {
52e90c55 85 /* The key. */
63f5d5b8 86 splay_tree_key key;
52e90c55
MM
87
88 /* The value. */
63f5d5b8 89 splay_tree_value value;
52e90c55
MM
90
91 /* The left and right children, respectively. */
63f5d5b8
TS
92 splay_tree_node left;
93 splay_tree_node right;
52e90c55
MM
94};
95
96/* The splay tree itself. */
63f5d5b8 97struct splay_tree_s {
52e90c55 98 /* The root of the tree. */
63f5d5b8 99 splay_tree_node root;
52e90c55
MM
100
101 /* The comparision function. */
102 splay_tree_compare_fn comp;
103
104 /* The deallocate-key function. NULL if no cleanup is necessary. */
105 splay_tree_delete_key_fn delete_key;
106
107 /* The deallocate-value function. NULL if no cleanup is necessary. */
108 splay_tree_delete_value_fn delete_value;
00c2f96f 109
a9429e29 110 /* Node allocate function. Takes allocate_data as a parameter. */
00c2f96f 111 splay_tree_allocate_fn allocate;
a9429e29
LB
112
113 /* Free function for nodes and trees. Takes allocate_data as a parameter. */
00c2f96f 114 splay_tree_deallocate_fn deallocate;
a9429e29
LB
115
116 /* Parameter for allocate/free functions. */
63f5d5b8 117 void *allocate_data;
17211ab5 118};
2826df06 119
17211ab5 120typedef struct splay_tree_s *splay_tree;
52e90c55 121
2826df06
UB
122extern splay_tree splay_tree_new (splay_tree_compare_fn,
123 splay_tree_delete_key_fn,
124 splay_tree_delete_value_fn);
885f2199 125extern splay_tree splay_tree_new_with_allocator (splay_tree_compare_fn,
2826df06
UB
126 splay_tree_delete_key_fn,
127 splay_tree_delete_value_fn,
128 splay_tree_allocate_fn,
129 splay_tree_deallocate_fn,
130 void *);
a9429e29
LB
131extern splay_tree splay_tree_new_typed_alloc (splay_tree_compare_fn,
132 splay_tree_delete_key_fn,
133 splay_tree_delete_value_fn,
134 splay_tree_allocate_fn,
135 splay_tree_allocate_fn,
136 splay_tree_deallocate_fn,
137 void *);
2826df06 138extern void splay_tree_delete (splay_tree);
885f2199 139extern splay_tree_node splay_tree_insert (splay_tree,
2826df06
UB
140 splay_tree_key,
141 splay_tree_value);
885f2199
GDR
142extern void splay_tree_remove (splay_tree, splay_tree_key);
143extern splay_tree_node splay_tree_lookup (splay_tree, splay_tree_key);
144extern splay_tree_node splay_tree_predecessor (splay_tree, splay_tree_key);
145extern splay_tree_node splay_tree_successor (splay_tree, splay_tree_key);
146extern splay_tree_node splay_tree_max (splay_tree);
147extern splay_tree_node splay_tree_min (splay_tree);
148extern int splay_tree_foreach (splay_tree, splay_tree_foreach_fn, void*);
149extern int splay_tree_compare_ints (splay_tree_key, splay_tree_key);
150extern int splay_tree_compare_pointers (splay_tree_key, splay_tree_key);
2826df06 151
52e90c55
MM
152#ifdef __cplusplus
153}
154#endif /* __cplusplus */
155
156#endif /* _SPLAY_TREE_H */
This page took 1.8923 seconds and 5 git commands to generate.