PR23148, Heap buffer overflow in pe_print_edata
[deliverable/binutils-gdb.git] / include / splay-tree.h
CommitLineData
252b5132 1/* A splay-tree datatype.
219d1afa 2 Copyright (C) 1998-2018 Free Software Foundation, Inc.
252b5132
RH
3 Contributed by Mark Mitchell (mark@markmitchell.com).
4
d2df793a 5 This file is part of GCC.
252b5132 6
d2df793a
NC
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.
252b5132 11
d2df793a
NC
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.
252b5132 16
d2df793a
NC
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. */
252b5132
RH
21
22/* For an easily readable description of splay-trees, see:
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
007425f1 37#include "ansidecl.h"
252b5132 38
b3641a6e
DD
39#ifdef HAVE_STDINT_H
40#include <stdint.h>
96d86ee3 41#endif
b3641a6e
DD
42#ifdef HAVE_INTTYPES_H
43#include <inttypes.h>
d2df793a
NC
44#endif
45
252b5132
RH
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. */
b3641a6e
DD
50typedef uintptr_t splay_tree_key;
51typedef uintptr_t splay_tree_value;
252b5132
RH
52
53/* Forward declaration for a node in the tree. */
cc89ffe6 54typedef struct splay_tree_node_s *splay_tree_node;
252b5132
RH
55
56/* The type of a function which compares two splay-tree keys. The
57 function should return values as for qsort. */
1e45deed 58typedef int (*splay_tree_compare_fn) (splay_tree_key, splay_tree_key);
252b5132
RH
59
60/* The type of a function used to deallocate any resources associated
61 with the key. */
1e45deed 62typedef void (*splay_tree_delete_key_fn) (splay_tree_key);
252b5132
RH
63
64/* The type of a function used to deallocate any resources associated
65 with the value. */
1e45deed 66typedef void (*splay_tree_delete_value_fn) (splay_tree_value);
252b5132
RH
67
68/* The type of a function used to iterate over the tree. */
1e45deed 69typedef int (*splay_tree_foreach_fn) (splay_tree_node, void*);
252b5132 70
2bbcdae9
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. */
a288642d 75typedef void *(*splay_tree_allocate_fn) (int, void *);
2bbcdae9
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. */
1e45deed 81typedef void (*splay_tree_deallocate_fn) (void *, void *);
2bbcdae9 82
252b5132 83/* The nodes in the splay tree. */
d0270d8c 84struct splay_tree_node_s {
252b5132 85 /* The key. */
d0270d8c 86 splay_tree_key key;
252b5132
RH
87
88 /* The value. */
d0270d8c 89 splay_tree_value value;
252b5132
RH
90
91 /* The left and right children, respectively. */
d0270d8c
L
92 splay_tree_node left;
93 splay_tree_node right;
252b5132
RH
94};
95
96/* The splay tree itself. */
d0270d8c 97struct splay_tree_s {
252b5132 98 /* The root of the tree. */
d0270d8c 99 splay_tree_node root;
252b5132
RH
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;
2bbcdae9 109
219a461e 110 /* Node allocate function. Takes allocate_data as a parameter. */
2bbcdae9 111 splay_tree_allocate_fn allocate;
219a461e
DD
112
113 /* Free function for nodes and trees. Takes allocate_data as a parameter. */
2bbcdae9 114 splay_tree_deallocate_fn deallocate;
219a461e
DD
115
116 /* Parameter for allocate/free functions. */
d0270d8c 117 void *allocate_data;
32b5d301 118};
31a55cbe 119
32b5d301 120typedef struct splay_tree_s *splay_tree;
252b5132 121
31a55cbe
DD
122extern splay_tree splay_tree_new (splay_tree_compare_fn,
123 splay_tree_delete_key_fn,
124 splay_tree_delete_value_fn);
1e45deed 125extern splay_tree splay_tree_new_with_allocator (splay_tree_compare_fn,
31a55cbe
DD
126 splay_tree_delete_key_fn,
127 splay_tree_delete_value_fn,
128 splay_tree_allocate_fn,
129 splay_tree_deallocate_fn,
130 void *);
219a461e
DD
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 *);
31a55cbe 138extern void splay_tree_delete (splay_tree);
1e45deed 139extern splay_tree_node splay_tree_insert (splay_tree,
31a55cbe
DD
140 splay_tree_key,
141 splay_tree_value);
1e45deed
DD
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);
31a55cbe 151
252b5132
RH
152#ifdef __cplusplus
153}
154#endif /* __cplusplus */
155
156#endif /* _SPLAY_TREE_H */
This page took 0.802868 seconds and 4 git commands to generate.