range-tree: Add API to remove data
It'll be useful to remove entries without knowing their range.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user