-#define rb_tree_foreach_rev(type, node, T, field) \
- for (type *node = rb_node_data(type, rb_tree_last(T), field); \
- &node->field != NULL; \
- node = rb_node_data(type, rb_node_prev(&node->field), field))
+#define rb_tree_foreach_rev(type, iter, T, field) \
+ for (type *iter, *__node = (type *)rb_tree_last(T); \
+ __node != NULL && \
+ (iter = rb_node_data(type, (struct rb_node *)__node, field), true); \
+ __node = (type *)rb_node_prev((struct rb_node *)__node))
+
+/** Iterate over the nodes in the tree in reverse, allowing the current node to be freed
+ *
+ * \param type The type of the containing data structure
+ *
+ * \param node The variable name for current node in the iteration;
+ * this will be declared as a pointer to \p type
+ *
+ * \param T The red-black tree
+ *
+ * \param field The rb_node field in containing data structure
+ */
+#define rb_tree_foreach_rev_safe(type, iter, T, field) \
+ for (type *iter, \
+ *__node = (type *)rb_tree_last(T), \
+ *__prev = (type *)rb_node_prev_or_null((struct rb_node *)__node); \
+ __node != NULL && \
+ (iter = rb_node_data(type, (struct rb_node *)__node, field), true); \
+ __node = __prev, \
+ __prev = (type *)rb_node_prev_or_null((struct rb_node *)__node))