Fix crash when opening empty dataset
[pspp-builds.git] / src / libpspp / bt.h
1 /* PSPP - a program for statistical analysis.
2    Copyright (C) 2007 Free Software Foundation, Inc.
3
4    This program is free software: you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation, either version 3 of the License, or
7    (at your option) any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program.  If not, see <http://www.gnu.org/licenses/>. */
16
17 #ifndef LIBPSPP_BT_H
18 #define LIBPSPP_BT_H 1
19
20 /* Balanced tree (BT) data structure.
21
22    The client should not need to be aware of the form of
23    balancing applied to the balanced tree, as its operation is
24    fully encapsulated. */
25
26 #include <stddef.h>
27
28 /* Returns the data structure corresponding to the given NODE,
29    assuming that NODE is embedded as the given MEMBER name in
30    data type STRUCT. */
31 #define bt_data(NODE, STRUCT, MEMBER)                                  \
32         ((STRUCT *) ((char *) (NODE) - offsetof (STRUCT, MEMBER)))
33
34 /* Node in a balanced binary tree. */
35 struct bt_node
36   {
37     struct bt_node *up;        /* Parent (NULL for root). */
38     struct bt_node *down[2];   /* Left child, right child. */
39   };
40
41 /* Compares nodes A and B, with the tree's AUX.
42    Returns a strcmp-like result. */
43 typedef int bt_compare_func (const struct bt_node *a,
44                              const struct bt_node *b,
45                              const void *aux);
46
47 /* A balanced binary tree. */
48 struct bt
49   {
50     struct bt_node *root;       /* Tree's root, NULL if empty. */
51     bt_compare_func *compare;   /* To compare nodes. */
52     const void *aux;            /* Auxiliary data. */
53     size_t size;                /* Current node count. */
54     size_t max_size;            /* Max size since last complete rebalance. */
55   };
56
57 void bt_init (struct bt *, bt_compare_func *, const void *aux);
58
59 struct bt_node *bt_insert (struct bt *, struct bt_node *);
60 void bt_delete (struct bt *, struct bt_node *);
61
62 struct bt_node *bt_find (const struct bt *, const struct bt_node *);
63 struct bt_node *bt_find_ge (const struct bt *, const struct bt_node *);
64 struct bt_node *bt_find_le (const struct bt *, const struct bt_node *);
65
66 struct bt_node *bt_first (const struct bt *);
67 struct bt_node *bt_last (const struct bt *);
68 struct bt_node *bt_find (const struct bt *, const struct bt_node *);
69 struct bt_node *bt_next (const struct bt *, const struct bt_node *);
70 struct bt_node *bt_prev (const struct bt *, const struct bt_node *);
71
72 struct bt_node *bt_changed (struct bt *, struct bt_node *);
73 void bt_moved (struct bt *, struct bt_node *);
74
75 /* Returns the number of nodes currently in BT. */
76 static inline size_t bt_count (const struct bt *bt)
77 {
78   return bt->size;
79 }
80
81 #endif /* libpspp/bt.h */