range-tree: Add API to remove data

It'll be useful to remove entries without knowing their
range.
This commit is contained in:
Georges Basile Stavracas Neto
2020-04-01 21:06:50 -03:00
parent ec0c17f6fb
commit 92f331cd9f
3 changed files with 86 additions and 0 deletions
+42
View File
@@ -473,6 +473,27 @@ count_entries_at_range (GDateTime *start,
return GCAL_TRAVERSE_CONTINUE;
}
static inline gboolean
remove_data_func (GDateTime *start,
GDateTime *end,
gpointer data,
gpointer user_data)
{
struct {
GcalRangeTree *range_tree;
gpointer *data;
} *remove_data = user_data;
if (remove_data->data == data)
{
gcal_range_tree_remove_range (remove_data->range_tree, start, end, data);
return GCAL_TRAVERSE_STOP;
}
return GCAL_TRAVERSE_CONTINUE;
}
static void
gcal_range_tree_free (GcalRangeTree *self)
{
@@ -630,6 +651,27 @@ gcal_range_tree_remove_range (GcalRangeTree *self,
self->root = remove_node (self->root, start, end, data);
}
/**
* gcal_range_tree_remove_data:
* @self: a #GcalRangeTree
* @data: user data
*
* Removes the first instance of @data found in the range tree.
*/
void
gcal_range_tree_remove_data (GcalRangeTree *self,
gpointer data)
{
struct {
GcalRangeTree *range_tree;
gpointer *data;
} remove_data = { self, data };
g_return_if_fail (self);
gcal_range_tree_traverse (self, G_IN_ORDER, remove_data_func, &remove_data);
}
/**
* gcal_range_tree_traverse:
* @self: a #GcalRangeTree
+3
View File
@@ -68,6 +68,9 @@ void gcal_range_tree_remove_range (GcalRangeTree
GDateTime *end,
gpointer data);
void gcal_range_tree_remove_data (GcalRangeTree *self,
gpointer data);
void gcal_range_tree_traverse (GcalRangeTree *self,
GTraverseType type,
GcalRangeTraverseFunc func,