diff options
Diffstat (limited to 'src/itree.h')
| -rw-r--r-- | src/itree.h | 16 |
1 files changed, 3 insertions, 13 deletions
diff --git a/src/itree.h b/src/itree.h index 37cd423d34a..291fa53fd30 100644 --- a/src/itree.h +++ b/src/itree.h | |||
| @@ -132,24 +132,21 @@ extern struct itree_iterator *itree_iterator_start (struct itree_iterator *, | |||
| 132 | enum itree_order); | 132 | enum itree_order); |
| 133 | extern void itree_iterator_narrow (struct itree_iterator *, ptrdiff_t, | 133 | extern void itree_iterator_narrow (struct itree_iterator *, ptrdiff_t, |
| 134 | ptrdiff_t); | 134 | ptrdiff_t); |
| 135 | extern void itree_iterator_finish (struct itree_iterator *); | ||
| 136 | extern struct itree_node *itree_iterator_next (struct itree_iterator *); | 135 | extern struct itree_node *itree_iterator_next (struct itree_iterator *); |
| 137 | 136 | ||
| 138 | /* State used when iterating interval. */ | 137 | /* State used when iterating interval. */ |
| 139 | struct itree_iterator | 138 | struct itree_iterator |
| 140 | { | 139 | { |
| 141 | struct itree_node *node; /* FIXME: It should be either `node` or `stack`. */ | 140 | struct itree_node *node; |
| 142 | struct itree_stack *stack; | ||
| 143 | ptrdiff_t begin; | 141 | ptrdiff_t begin; |
| 144 | ptrdiff_t end; | 142 | ptrdiff_t end; |
| 145 | uintmax_t otick; /* A copy of the tree's `otick`. */ | 143 | uintmax_t otick; /* A copy of the tree's `otick`. */ |
| 146 | enum itree_order order; | 144 | enum itree_order order; |
| 147 | bool running; | ||
| 148 | }; | 145 | }; |
| 149 | 146 | ||
| 150 | /* Iterate over the intervals between BEG and END in the tree T. | 147 | /* Iterate over the intervals between BEG and END in the tree T. |
| 151 | N will hold successive nodes. ORDER can be one of : `ASCENDING`, | 148 | N will hold successive nodes. ORDER can be one of : `ASCENDING`, |
| 152 | `DESCENDING`, or `PRE_ORDER`. | 149 | `DESCENDING`, `POST_ORDER`, or `PRE_ORDER`. |
| 153 | It should be used as: | 150 | It should be used as: |
| 154 | 151 | ||
| 155 | ITREE_FOREACH (n, t, beg, end, order) | 152 | ITREE_FOREACH (n, t, beg, end, order) |
| @@ -160,9 +157,6 @@ struct itree_iterator | |||
| 160 | BEWARE: | 157 | BEWARE: |
| 161 | - The expression T may be evaluated more than once, so make sure | 158 | - The expression T may be evaluated more than once, so make sure |
| 162 | it is cheap and pure. | 159 | it is cheap and pure. |
| 163 | - If you need to exit the loop early, you *have* to call `ITREE_ABORT` | ||
| 164 | just before exiting (e.g. with `break` or `return`). | ||
| 165 | - Non-local exits are not supported within the body of the loop. | ||
| 166 | - Don't modify the tree during the iteration. | 160 | - Don't modify the tree during the iteration. |
| 167 | */ | 161 | */ |
| 168 | #define ITREE_FOREACH(n, t, beg, end, order) \ | 162 | #define ITREE_FOREACH(n, t, beg, end, order) \ |
| @@ -179,11 +173,7 @@ struct itree_iterator | |||
| 179 | *itree_iter_ \ | 173 | *itree_iter_ \ |
| 180 | = itree_iterator_start (&itree_local_iter_, \ | 174 | = itree_iterator_start (&itree_local_iter_, \ |
| 181 | t, beg, end, ITREE_##order); \ | 175 | t, beg, end, ITREE_##order); \ |
| 182 | ((n = itree_iterator_next (itree_iter_)) \ | 176 | ((n = itree_iterator_next (itree_iter_)));) |
| 183 | || (itree_iterator_finish (itree_iter_), false));) | ||
| 184 | |||
| 185 | #define ITREE_FOREACH_ABORT() \ | ||
| 186 | itree_iterator_finish (itree_iter_) | ||
| 187 | 177 | ||
| 188 | #define ITREE_FOREACH_NARROW(beg, end) \ | 178 | #define ITREE_FOREACH_NARROW(beg, end) \ |
| 189 | itree_iterator_narrow (itree_iter_, beg, end) | 179 | itree_iterator_narrow (itree_iter_, beg, end) |