11debfc3dSmrg /* A splay-tree datatype. 2*8feb0f0bSmrg Copyright (C) 1998-2020 Free Software Foundation, Inc. 31debfc3dSmrg Contributed by Mark Mitchell (mark@markmitchell.com). 41debfc3dSmrg 51debfc3dSmrg This file is part of GCC. 61debfc3dSmrg 71debfc3dSmrg GCC is free software; you can redistribute it and/or modify it 81debfc3dSmrg under the terms of the GNU General Public License as published by 91debfc3dSmrg the Free Software Foundation; either version 2, or (at your option) 101debfc3dSmrg any later version. 111debfc3dSmrg 121debfc3dSmrg GCC is distributed in the hope that it will be useful, but 131debfc3dSmrg WITHOUT ANY WARRANTY; without even the implied warranty of 141debfc3dSmrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 151debfc3dSmrg General Public License for more details. 161debfc3dSmrg 171debfc3dSmrg You should have received a copy of the GNU General Public License 181debfc3dSmrg along with GCC; see the file COPYING. If not, write to 191debfc3dSmrg the Free Software Foundation, 51 Franklin Street - Fifth Floor, 201debfc3dSmrg Boston, MA 02110-1301, USA. */ 211debfc3dSmrg 221debfc3dSmrg /* For an easily readable description of splay-trees, see: 231debfc3dSmrg 241debfc3dSmrg Lewis, Harry R. and Denenberg, Larry. Data Structures and Their 251debfc3dSmrg Algorithms. Harper-Collins, Inc. 1991. 261debfc3dSmrg 271debfc3dSmrg The major feature of splay trees is that all basic tree operations 281debfc3dSmrg are amortized O(log n) time for a tree with n nodes. */ 291debfc3dSmrg 301debfc3dSmrg #ifndef _SPLAY_TREE_H 311debfc3dSmrg #define _SPLAY_TREE_H 321debfc3dSmrg 331debfc3dSmrg #ifdef __cplusplus 341debfc3dSmrg extern "C" { 351debfc3dSmrg #endif /* __cplusplus */ 361debfc3dSmrg 371debfc3dSmrg #include "ansidecl.h" 381debfc3dSmrg 391debfc3dSmrg #ifdef HAVE_STDINT_H 401debfc3dSmrg #include <stdint.h> 411debfc3dSmrg #endif 421debfc3dSmrg #ifdef HAVE_INTTYPES_H 431debfc3dSmrg #include <inttypes.h> 441debfc3dSmrg #endif 451debfc3dSmrg 461debfc3dSmrg /* Use typedefs for the key and data types to facilitate changing 471debfc3dSmrg these types, if necessary. These types should be sufficiently wide 481debfc3dSmrg that any pointer or scalar can be cast to these types, and then 491debfc3dSmrg cast back, without loss of precision. */ 501debfc3dSmrg typedef uintptr_t splay_tree_key; 511debfc3dSmrg typedef uintptr_t splay_tree_value; 521debfc3dSmrg 531debfc3dSmrg /* Forward declaration for a node in the tree. */ 541debfc3dSmrg typedef struct splay_tree_node_s *splay_tree_node; 551debfc3dSmrg 561debfc3dSmrg /* The type of a function which compares two splay-tree keys. The 571debfc3dSmrg function should return values as for qsort. */ 581debfc3dSmrg typedef int (*splay_tree_compare_fn) (splay_tree_key, splay_tree_key); 591debfc3dSmrg 601debfc3dSmrg /* The type of a function used to deallocate any resources associated 61c0a68be4Smrg with the key. If you provide this function, the splay tree 62c0a68be4Smrg will take the ownership of the memory of the splay_tree_key arg 63c0a68be4Smrg of splay_tree_insert. This function is called to release the keys 64c0a68be4Smrg present in the tree when calling splay_tree_delete or splay_tree_remove. 65c0a68be4Smrg If splay_tree_insert is called with a key equal to a key already 66c0a68be4Smrg present in the tree, the old key and old value will be released. */ 671debfc3dSmrg typedef void (*splay_tree_delete_key_fn) (splay_tree_key); 681debfc3dSmrg 691debfc3dSmrg /* The type of a function used to deallocate any resources associated 70c0a68be4Smrg with the value. If you provide this function, the memory of the 71c0a68be4Smrg splay_tree_value arg of splay_tree_insert is managed similarly to 72c0a68be4Smrg the splay_tree_key memory: see splay_tree_delete_key_fn. */ 731debfc3dSmrg typedef void (*splay_tree_delete_value_fn) (splay_tree_value); 741debfc3dSmrg 751debfc3dSmrg /* The type of a function used to iterate over the tree. */ 761debfc3dSmrg typedef int (*splay_tree_foreach_fn) (splay_tree_node, void*); 771debfc3dSmrg 781debfc3dSmrg /* The type of a function used to allocate memory for tree root and 791debfc3dSmrg node structures. The first argument is the number of bytes needed; 801debfc3dSmrg the second is a data pointer the splay tree functions pass through 811debfc3dSmrg to the allocator. This function must never return zero. */ 821debfc3dSmrg typedef void *(*splay_tree_allocate_fn) (int, void *); 831debfc3dSmrg 841debfc3dSmrg /* The type of a function used to free memory allocated using the 851debfc3dSmrg corresponding splay_tree_allocate_fn. The first argument is the 861debfc3dSmrg memory to be freed; the latter is a data pointer the splay tree 871debfc3dSmrg functions pass through to the freer. */ 881debfc3dSmrg typedef void (*splay_tree_deallocate_fn) (void *, void *); 891debfc3dSmrg 901debfc3dSmrg /* The nodes in the splay tree. */ 911debfc3dSmrg struct splay_tree_node_s { 921debfc3dSmrg /* The key. */ 931debfc3dSmrg splay_tree_key key; 941debfc3dSmrg 951debfc3dSmrg /* The value. */ 961debfc3dSmrg splay_tree_value value; 971debfc3dSmrg 981debfc3dSmrg /* The left and right children, respectively. */ 991debfc3dSmrg splay_tree_node left; 1001debfc3dSmrg splay_tree_node right; 1011debfc3dSmrg }; 1021debfc3dSmrg 1031debfc3dSmrg /* The splay tree itself. */ 1041debfc3dSmrg struct splay_tree_s { 1051debfc3dSmrg /* The root of the tree. */ 1061debfc3dSmrg splay_tree_node root; 1071debfc3dSmrg 1081debfc3dSmrg /* The comparision function. */ 1091debfc3dSmrg splay_tree_compare_fn comp; 1101debfc3dSmrg 1111debfc3dSmrg /* The deallocate-key function. NULL if no cleanup is necessary. */ 1121debfc3dSmrg splay_tree_delete_key_fn delete_key; 1131debfc3dSmrg 1141debfc3dSmrg /* The deallocate-value function. NULL if no cleanup is necessary. */ 1151debfc3dSmrg splay_tree_delete_value_fn delete_value; 1161debfc3dSmrg 1171debfc3dSmrg /* Node allocate function. Takes allocate_data as a parameter. */ 1181debfc3dSmrg splay_tree_allocate_fn allocate; 1191debfc3dSmrg 1201debfc3dSmrg /* Free function for nodes and trees. Takes allocate_data as a parameter. */ 1211debfc3dSmrg splay_tree_deallocate_fn deallocate; 1221debfc3dSmrg 1231debfc3dSmrg /* Parameter for allocate/free functions. */ 1241debfc3dSmrg void *allocate_data; 1251debfc3dSmrg }; 1261debfc3dSmrg 1271debfc3dSmrg typedef struct splay_tree_s *splay_tree; 1281debfc3dSmrg 1291debfc3dSmrg extern splay_tree splay_tree_new (splay_tree_compare_fn, 1301debfc3dSmrg splay_tree_delete_key_fn, 1311debfc3dSmrg splay_tree_delete_value_fn); 1321debfc3dSmrg extern splay_tree splay_tree_new_with_allocator (splay_tree_compare_fn, 1331debfc3dSmrg splay_tree_delete_key_fn, 1341debfc3dSmrg splay_tree_delete_value_fn, 1351debfc3dSmrg splay_tree_allocate_fn, 1361debfc3dSmrg splay_tree_deallocate_fn, 1371debfc3dSmrg void *); 1381debfc3dSmrg extern splay_tree splay_tree_new_typed_alloc (splay_tree_compare_fn, 1391debfc3dSmrg splay_tree_delete_key_fn, 1401debfc3dSmrg splay_tree_delete_value_fn, 1411debfc3dSmrg splay_tree_allocate_fn, 1421debfc3dSmrg splay_tree_allocate_fn, 1431debfc3dSmrg splay_tree_deallocate_fn, 1441debfc3dSmrg void *); 1451debfc3dSmrg extern void splay_tree_delete (splay_tree); 1461debfc3dSmrg extern splay_tree_node splay_tree_insert (splay_tree, 1471debfc3dSmrg splay_tree_key, 1481debfc3dSmrg splay_tree_value); 1491debfc3dSmrg extern void splay_tree_remove (splay_tree, splay_tree_key); 1501debfc3dSmrg extern splay_tree_node splay_tree_lookup (splay_tree, splay_tree_key); 1511debfc3dSmrg extern splay_tree_node splay_tree_predecessor (splay_tree, splay_tree_key); 1521debfc3dSmrg extern splay_tree_node splay_tree_successor (splay_tree, splay_tree_key); 1531debfc3dSmrg extern splay_tree_node splay_tree_max (splay_tree); 1541debfc3dSmrg extern splay_tree_node splay_tree_min (splay_tree); 1551debfc3dSmrg extern int splay_tree_foreach (splay_tree, splay_tree_foreach_fn, void*); 1561debfc3dSmrg extern int splay_tree_compare_ints (splay_tree_key, splay_tree_key); 1571debfc3dSmrg extern int splay_tree_compare_pointers (splay_tree_key, splay_tree_key); 158c0a68be4Smrg extern int splay_tree_compare_strings (splay_tree_key, splay_tree_key); 159c0a68be4Smrg extern void splay_tree_delete_pointers (splay_tree_value); 1601debfc3dSmrg 1611debfc3dSmrg #ifdef __cplusplus 1621debfc3dSmrg } 1631debfc3dSmrg #endif /* __cplusplus */ 1641debfc3dSmrg 1651debfc3dSmrg #endif /* _SPLAY_TREE_H */ 166