diff --git a/src/core/gcal-range-tree.c b/src/core/gcal-range-tree.c index 496c84ef..5fc996fe 100644 --- a/src/core/gcal-range-tree.c +++ b/src/core/gcal-range-tree.c @@ -431,6 +431,34 @@ count_entries_at_range (GcalRange *range, return GCAL_TRAVERSE_CONTINUE; } +static inline gboolean +has_entries_at_range (GcalRange *range, + gpointer data, + gpointer user_data) +{ + GcalRangePosition position; + GcalRangeOverlap overlap; + + struct { + GcalRange *range; + gboolean has_entries; + } *gather_data = user_data; + + overlap = gcal_range_calculate_overlap (range, gather_data->range, &position); + + if (overlap == GCAL_RANGE_NO_OVERLAP) + { + if (position == GCAL_RANGE_BEFORE) + return GCAL_TRAVERSE_CONTINUE; + if (position == GCAL_RANGE_AFTER) + return GCAL_TRAVERSE_STOP; + } + + gather_data->has_entries = TRUE; + + return GCAL_TRAVERSE_STOP; +} + static inline gboolean remove_data_func (GcalRange *range, gpointer data, @@ -719,6 +747,23 @@ gcal_range_tree_get_data_at_range (GcalRangeTree *self, return data; } +gboolean +gcal_range_tree_has_entries_at_range (GcalRangeTree *self, + GcalRange *range) +{ + struct { + GcalRange *range; + gboolean has_entry; + } gather_data = { range, FALSE }; + + g_return_val_if_fail (self, FALSE); + g_return_val_if_fail (range, FALSE); + + gcal_range_tree_traverse (self, G_IN_ORDER, has_entries_at_range, &gather_data); + + return gather_data.has_entry; +} + /** * gcal_range_tree_count_entries_at_range: * @self: a #GcalRangeTree diff --git a/src/core/gcal-range-tree.h b/src/core/gcal-range-tree.h index 13ec4d33..0f31cd0d 100644 --- a/src/core/gcal-range-tree.h +++ b/src/core/gcal-range-tree.h @@ -79,6 +79,9 @@ GPtrArray* gcal_range_tree_get_all_data (GcalRangeTree GPtrArray* gcal_range_tree_get_data_at_range (GcalRangeTree *self, GcalRange *range); +gboolean gcal_range_tree_has_entries_at_range (GcalRangeTree *self, + GcalRange *range); + guint64 gcal_range_tree_count_entries_at_range (GcalRangeTree *self, GcalRange *range);