re-import the lua bindings c file; build ctangle in non-crosscompilers; build a lua...
[mplib] / src / texk / web2c / mpdir / avl.h
1 /* Produced by texiweb from libavl.w on 2003/01/06 at 18:07. */
2
3 /* libavl - library for manipulation of binary trees.
4    Copyright (C) 1998-2002 Free Software Foundation, Inc.
5
6    This program is free software; you can redistribute it and/or
7    modify it under the terms of the GNU General Public License as
8    published by the Free Software Foundation; either version 2 of the
9    License, or (at your option) any later version.
10
11    This program is distributed in the hope that it will be useful, but
12    WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14    See the GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
19    02111-1307, USA.
20
21    The author may be contacted at <blp@gnu.org> on the Internet, or
22    write to Ben Pfaff, Stanford University, Computer Science Dept., 353
23    Serra Mall, Stanford CA 94305, USA.
24 */
25
26 #ifndef AVL_H
27 #  define AVL_H 1
28
29 #  include <stddef.h>
30 #  if defined(__cplusplus)
31 extern "C" {
32 #  endif
33
34
35 /* Function types. */
36     typedef int avl_comparison_func (const void *avl_a, const void *avl_b,
37                                      void *avl_param);
38     typedef void avl_item_func (void *avl_item, void *avl_param);
39     typedef void *avl_copy_func (void *avl_item, void *avl_param);
40
41 #  ifndef LIBAVL_ALLOCATOR
42 #    define LIBAVL_ALLOCATOR
43 /* Memory allocator. */
44     struct libavl_allocator {
45         void *(*libavl_malloc) (struct libavl_allocator *, size_t libavl_size);
46         void (*libavl_free) (struct libavl_allocator *, void *libavl_block);
47     };
48 #  endif
49
50 /* Default memory allocator. */
51     extern struct libavl_allocator avl_allocator_default;
52     void *avl_malloc (struct libavl_allocator *, size_t);
53     void avl_free (struct libavl_allocator *, void *);
54
55 /* Maximum AVL height. */
56 #  ifndef AVL_MAX_HEIGHT
57 #    define AVL_MAX_HEIGHT 32
58 #  endif
59
60 /* Tree data structure. */
61     struct avl_table {
62         struct avl_node *avl_root;      /* Tree's root. */
63         avl_comparison_func *avl_compare;       /* Comparison function. */
64         void *avl_param;        /* Extra argument to |avl_compare|. */
65         struct libavl_allocator *avl_alloc;     /* Memory allocator. */
66         size_t avl_count;       /* Number of items in tree. */
67         unsigned long avl_generation;   /* Generation number. */
68     };
69
70 /* An AVL tree node. */
71     struct avl_node {
72         struct avl_node *avl_link[2];   /* Subtrees. */
73         void *avl_data;         /* Pointer to data. */
74         signed char avl_balance;        /* Balance factor. */
75     };
76
77 /* AVL traverser structure. */
78     struct avl_traverser {
79         struct avl_table *avl_table;    /* Tree being traversed. */
80         struct avl_node *avl_node;      /* Current node in tree. */
81         struct avl_node *avl_stack[AVL_MAX_HEIGHT];
82         /* All the nodes above |avl_node|. */
83         size_t avl_height;      /* Number of nodes in |avl_parent|. */
84         unsigned long avl_generation;   /* Generation number. */
85     };
86
87 /* Table functions. */
88     struct avl_table *avl_create (avl_comparison_func *, void *,
89                                   struct libavl_allocator *);
90     struct avl_table *avl_copy (const struct avl_table *, avl_copy_func *,
91                                 avl_item_func *, struct libavl_allocator *);
92     void avl_destroy (struct avl_table *, avl_item_func *);
93     void **avl_probe (struct avl_table *, void *);
94     void *avl_insert (struct avl_table *, void *);
95     void *avl_replace (struct avl_table *, void *);
96     void *avl_delete (struct avl_table *, const void *);
97     void *avl_find (const struct avl_table *, const void *);
98     void avl_assert_insert (struct avl_table *, void *);
99     void *avl_assert_delete (struct avl_table *, void *);
100
101 #  define avl_count(table) ((size_t) (table)->avl_count)
102
103 /* Table traverser functions. */
104     void avl_t_init (struct avl_traverser *, struct avl_table *);
105     void *avl_t_first (struct avl_traverser *, struct avl_table *);
106     void *avl_t_last (struct avl_traverser *, struct avl_table *);
107     void *avl_t_find (struct avl_traverser *, struct avl_table *, void *);
108     void *avl_t_insert (struct avl_traverser *, struct avl_table *, void *);
109     void *avl_t_copy (struct avl_traverser *, const struct avl_traverser *);
110     void *avl_t_next (struct avl_traverser *);
111     void *avl_t_prev (struct avl_traverser *);
112     void *avl_t_cur (struct avl_traverser *);
113     void *avl_t_replace (struct avl_traverser *, void *);
114
115 #  if defined(__cplusplus)
116 }
117 #  endif
118 #endif                          /* avl.h */