xref: /netbsd-src/external/gpl3/gcc.old/dist/include/splay-tree.h (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
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