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