xref: /minix3/minix/lib/libmagicrt/include/magic_splay_tree.h (revision b2ed49a5d83e311ee0fa9e5ff613639b1bf77aaf)
1*b2ed49a5SDavid van Moolenbroek /* A splay-tree datatype.
2*b2ed49a5SDavid van Moolenbroek    Copyright 1998, 1999, 2000, 2002 Free Software Foundation, Inc.
3*b2ed49a5SDavid van Moolenbroek    Contributed by Mark Mitchell (mark@markmitchell.com).
4*b2ed49a5SDavid van Moolenbroek 
5*b2ed49a5SDavid van Moolenbroek This file is part of GCC.
6*b2ed49a5SDavid van Moolenbroek 
7*b2ed49a5SDavid van Moolenbroek GCC is free software; you can redistribute it and/or modify it
8*b2ed49a5SDavid van Moolenbroek under the terms of the GNU General Public License as published by
9*b2ed49a5SDavid van Moolenbroek the Free Software Foundation; either version 2, or (at your option)
10*b2ed49a5SDavid van Moolenbroek any later version.
11*b2ed49a5SDavid van Moolenbroek 
12*b2ed49a5SDavid van Moolenbroek GCC is distributed in the hope that it will be useful, but
13*b2ed49a5SDavid van Moolenbroek WITHOUT ANY WARRANTY; without even the implied warranty of
14*b2ed49a5SDavid van Moolenbroek MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15*b2ed49a5SDavid van Moolenbroek General Public License for more details.
16*b2ed49a5SDavid van Moolenbroek 
17*b2ed49a5SDavid van Moolenbroek You should have received a copy of the GNU General Public License
18*b2ed49a5SDavid van Moolenbroek along with GCC; see the file COPYING.  If not, write to
19*b2ed49a5SDavid van Moolenbroek the Free Software Foundation, 51 Franklin Street - Fifth Floor,
20*b2ed49a5SDavid van Moolenbroek Boston, MA 02110-1301, USA.  */
21*b2ed49a5SDavid van Moolenbroek 
22*b2ed49a5SDavid van Moolenbroek /* For an easily readable description of splay-trees, see:
23*b2ed49a5SDavid van Moolenbroek 
24*b2ed49a5SDavid van Moolenbroek      Lewis, Harry R. and Denenberg, Larry.  Data Structures and Their
25*b2ed49a5SDavid van Moolenbroek      Algorithms.  Harper-Collins, Inc.  1991.
26*b2ed49a5SDavid van Moolenbroek 
27*b2ed49a5SDavid van Moolenbroek    The major feature of splay trees is that all basic tree operations
28*b2ed49a5SDavid van Moolenbroek    are amortized O(log n) time for a tree with n nodes.  */
29*b2ed49a5SDavid van Moolenbroek 
30*b2ed49a5SDavid van Moolenbroek #ifndef _SPLAY_TREE_H
31*b2ed49a5SDavid van Moolenbroek #define _SPLAY_TREE_H
32*b2ed49a5SDavid van Moolenbroek 
33*b2ed49a5SDavid van Moolenbroek #ifdef __cplusplus
34*b2ed49a5SDavid van Moolenbroek extern "C" {
35*b2ed49a5SDavid van Moolenbroek #endif /* __cplusplus */
36*b2ed49a5SDavid van Moolenbroek 
37*b2ed49a5SDavid van Moolenbroek #ifndef GTY
38*b2ed49a5SDavid van Moolenbroek #define GTY(X)
39*b2ed49a5SDavid van Moolenbroek #endif
40*b2ed49a5SDavid van Moolenbroek 
41*b2ed49a5SDavid van Moolenbroek #ifndef ATTRIBUTE_UNUSED
42*b2ed49a5SDavid van Moolenbroek #define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
43*b2ed49a5SDavid van Moolenbroek #endif /* ATTRIBUTE_UNUSED */
44*b2ed49a5SDavid van Moolenbroek 
45*b2ed49a5SDavid van Moolenbroek /* Use typedefs for the key and data types to facilitate changing
46*b2ed49a5SDavid van Moolenbroek    these types, if necessary.  These types should be sufficiently wide
47*b2ed49a5SDavid van Moolenbroek    that any pointer or scalar can be cast to these types, and then
48*b2ed49a5SDavid van Moolenbroek    cast back, without loss of precision.  */
49*b2ed49a5SDavid van Moolenbroek typedef unsigned long int splay_tree_key;
50*b2ed49a5SDavid van Moolenbroek typedef unsigned long int splay_tree_value;
51*b2ed49a5SDavid van Moolenbroek 
52*b2ed49a5SDavid van Moolenbroek /* Forward declaration for a node in the tree.  */
53*b2ed49a5SDavid van Moolenbroek typedef struct splay_tree_node_s *splay_tree_node;
54*b2ed49a5SDavid van Moolenbroek 
55*b2ed49a5SDavid van Moolenbroek /* The type of a function which compares two splay-tree keys.  The
56*b2ed49a5SDavid van Moolenbroek    function should return values as for qsort.  */
57*b2ed49a5SDavid van Moolenbroek typedef int (*splay_tree_compare_fn) (splay_tree_key, splay_tree_key);
58*b2ed49a5SDavid van Moolenbroek 
59*b2ed49a5SDavid van Moolenbroek /* The type of a function used to deallocate any resources associated
60*b2ed49a5SDavid van Moolenbroek    with the key.  */
61*b2ed49a5SDavid van Moolenbroek typedef void (*splay_tree_delete_key_fn) (splay_tree_key);
62*b2ed49a5SDavid van Moolenbroek 
63*b2ed49a5SDavid van Moolenbroek /* The type of a function used to deallocate any resources associated
64*b2ed49a5SDavid van Moolenbroek    with the value.  */
65*b2ed49a5SDavid van Moolenbroek typedef void (*splay_tree_delete_value_fn) (splay_tree_value);
66*b2ed49a5SDavid van Moolenbroek 
67*b2ed49a5SDavid van Moolenbroek /* The type of a function used to iterate over the tree.  */
68*b2ed49a5SDavid van Moolenbroek typedef int (*splay_tree_foreach_fn) (splay_tree_node, void*);
69*b2ed49a5SDavid van Moolenbroek 
70*b2ed49a5SDavid van Moolenbroek /* The type of a function used to allocate memory for tree root and
71*b2ed49a5SDavid van Moolenbroek    node structures.  The first argument is the number of bytes needed;
72*b2ed49a5SDavid van Moolenbroek    the second is a data pointer the splay tree functions pass through
73*b2ed49a5SDavid van Moolenbroek    to the allocator.  This function must never return zero.  */
74*b2ed49a5SDavid van Moolenbroek typedef void *(*splay_tree_allocate_fn) (int, void *);
75*b2ed49a5SDavid van Moolenbroek 
76*b2ed49a5SDavid van Moolenbroek /* The type of a function used to free memory allocated using the
77*b2ed49a5SDavid van Moolenbroek    corresponding splay_tree_allocate_fn.  The first argument is the
78*b2ed49a5SDavid van Moolenbroek    memory to be freed; the latter is a data pointer the splay tree
79*b2ed49a5SDavid van Moolenbroek    functions pass through to the freer.  */
80*b2ed49a5SDavid van Moolenbroek typedef void (*splay_tree_deallocate_fn) (void *, void *);
81*b2ed49a5SDavid van Moolenbroek 
82*b2ed49a5SDavid van Moolenbroek /* The nodes in the splay tree.  */
83*b2ed49a5SDavid van Moolenbroek struct splay_tree_node_s GTY(())
84*b2ed49a5SDavid van Moolenbroek {
85*b2ed49a5SDavid van Moolenbroek   /* The key.  */
86*b2ed49a5SDavid van Moolenbroek   splay_tree_key GTY ((use_param1)) key;
87*b2ed49a5SDavid van Moolenbroek 
88*b2ed49a5SDavid van Moolenbroek   /* The value.  */
89*b2ed49a5SDavid van Moolenbroek   splay_tree_value GTY ((use_param2)) value;
90*b2ed49a5SDavid van Moolenbroek 
91*b2ed49a5SDavid van Moolenbroek   /* The left and right children, respectively.  */
92*b2ed49a5SDavid van Moolenbroek   splay_tree_node GTY ((use_params)) left;
93*b2ed49a5SDavid van Moolenbroek   splay_tree_node GTY ((use_params)) right;
94*b2ed49a5SDavid van Moolenbroek };
95*b2ed49a5SDavid van Moolenbroek 
96*b2ed49a5SDavid van Moolenbroek /* The splay tree itself.  */
97*b2ed49a5SDavid van Moolenbroek struct splay_tree_s GTY(())
98*b2ed49a5SDavid van Moolenbroek {
99*b2ed49a5SDavid van Moolenbroek   /* The root of the tree.  */
100*b2ed49a5SDavid van Moolenbroek   splay_tree_node GTY ((use_params)) root;
101*b2ed49a5SDavid van Moolenbroek 
102*b2ed49a5SDavid van Moolenbroek   /* The comparision function.  */
103*b2ed49a5SDavid van Moolenbroek   splay_tree_compare_fn comp;
104*b2ed49a5SDavid van Moolenbroek 
105*b2ed49a5SDavid van Moolenbroek   /* The deallocate-key function.  NULL if no cleanup is necessary.  */
106*b2ed49a5SDavid van Moolenbroek   splay_tree_delete_key_fn delete_key;
107*b2ed49a5SDavid van Moolenbroek 
108*b2ed49a5SDavid van Moolenbroek   /* The deallocate-value function.  NULL if no cleanup is necessary.  */
109*b2ed49a5SDavid van Moolenbroek   splay_tree_delete_value_fn delete_value;
110*b2ed49a5SDavid van Moolenbroek 
111*b2ed49a5SDavid van Moolenbroek   /* Allocate/free functions, and a data pointer to pass to them.  */
112*b2ed49a5SDavid van Moolenbroek   splay_tree_allocate_fn allocate;
113*b2ed49a5SDavid van Moolenbroek   splay_tree_deallocate_fn deallocate;
114*b2ed49a5SDavid van Moolenbroek   void * GTY((skip)) allocate_data;
115*b2ed49a5SDavid van Moolenbroek 
116*b2ed49a5SDavid van Moolenbroek };
117*b2ed49a5SDavid van Moolenbroek typedef struct splay_tree_s *splay_tree;
118*b2ed49a5SDavid van Moolenbroek 
119*b2ed49a5SDavid van Moolenbroek extern splay_tree splay_tree_new (splay_tree_compare_fn,
120*b2ed49a5SDavid van Moolenbroek                                   splay_tree_delete_key_fn,
121*b2ed49a5SDavid van Moolenbroek                                   splay_tree_delete_value_fn);
122*b2ed49a5SDavid van Moolenbroek extern splay_tree splay_tree_new_with_allocator (splay_tree_compare_fn,
123*b2ed49a5SDavid van Moolenbroek                                                  splay_tree_delete_key_fn,
124*b2ed49a5SDavid van Moolenbroek                                                  splay_tree_delete_value_fn,
125*b2ed49a5SDavid van Moolenbroek                                                  splay_tree_allocate_fn,
126*b2ed49a5SDavid van Moolenbroek                                                  splay_tree_deallocate_fn,
127*b2ed49a5SDavid van Moolenbroek                                                  void *);
128*b2ed49a5SDavid van Moolenbroek extern void splay_tree_delete (splay_tree);
129*b2ed49a5SDavid van Moolenbroek extern splay_tree_node splay_tree_insert (splay_tree,
130*b2ed49a5SDavid van Moolenbroek                                           splay_tree_key,
131*b2ed49a5SDavid van Moolenbroek                                           splay_tree_value);
132*b2ed49a5SDavid van Moolenbroek extern void splay_tree_remove (splay_tree, splay_tree_key);
133*b2ed49a5SDavid van Moolenbroek extern splay_tree_node splay_tree_lookup (splay_tree, splay_tree_key);
134*b2ed49a5SDavid van Moolenbroek extern splay_tree_node splay_tree_predecessor (splay_tree, splay_tree_key);
135*b2ed49a5SDavid van Moolenbroek extern splay_tree_node splay_tree_successor (splay_tree, splay_tree_key);
136*b2ed49a5SDavid van Moolenbroek extern splay_tree_node splay_tree_max (splay_tree);
137*b2ed49a5SDavid van Moolenbroek extern splay_tree_node splay_tree_min (splay_tree);
138*b2ed49a5SDavid van Moolenbroek extern int splay_tree_foreach (splay_tree, splay_tree_foreach_fn, void*);
139*b2ed49a5SDavid van Moolenbroek extern int splay_tree_compare_ints (splay_tree_key, splay_tree_key);
140*b2ed49a5SDavid van Moolenbroek extern int splay_tree_compare_pointers (splay_tree_key, splay_tree_key);
141*b2ed49a5SDavid van Moolenbroek 
142*b2ed49a5SDavid van Moolenbroek #ifdef __cplusplus
143*b2ed49a5SDavid van Moolenbroek }
144*b2ed49a5SDavid van Moolenbroek #endif /* __cplusplus */
145*b2ed49a5SDavid van Moolenbroek 
146*b2ed49a5SDavid van Moolenbroek #endif /* _SPLAY_TREE_H */
147*b2ed49a5SDavid van Moolenbroek 
148