[gnome-calendar/gbsneto/timeline: 8/25] range-tree: Support destroy function
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-calendar/gbsneto/timeline: 8/25] range-tree: Support destroy function
- Date: Fri, 27 Mar 2020 17:34:31 +0000 (UTC)
commit 784f183a95487728c7bdbdecd2194f7574b43d56
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date: Tue Mar 24 18:23:33 2020 -0300
range-tree: Support destroy function
src/views/gcal-range-tree.c | 49 ++++++++++++++++++++++++++++++++++-----------
src/views/gcal-range-tree.h | 2 ++
2 files changed, 39 insertions(+), 12 deletions(-)
---
diff --git a/src/views/gcal-range-tree.c b/src/views/gcal-range-tree.c
index 3dbbee05..ec75425c 100644
--- a/src/views/gcal-range-tree.c
+++ b/src/views/gcal-range-tree.c
@@ -58,6 +58,7 @@ struct _GcalRangeTree
{
guint ref_count;
+ GDestroyNotify destroy_func;
Node *root;
};
@@ -153,9 +154,10 @@ is_interval_higher (Node *n,
}
static Node*
-node_new (GDateTime *start,
- GDateTime *end,
- gpointer data)
+node_new (GDateTime *start,
+ GDateTime *end,
+ gpointer data,
+ GDestroyNotify destroy_func)
{
Node *n;
@@ -166,7 +168,7 @@ node_new (GDateTime *start,
n->height = 1;
n->hits = 1;
- n->data_array = g_ptr_array_new ();
+ n->data_array = g_ptr_array_new_with_free_func (destroy_func);
g_ptr_array_add (n->data_array, data);
return n;
@@ -243,22 +245,23 @@ rebalance (Node *n)
}
static Node*
-insert (Node *n,
- GDateTime *start,
- GDateTime *end,
- gpointer data)
+insert (Node *n,
+ GDateTime *start,
+ GDateTime *end,
+ gpointer data,
+ GDestroyNotify destroy_func)
{
gint result;
if (!n)
- return node_new (start, end, data);
+ return node_new (start, end, data, destroy_func);
result = compare_intervals (n->start, n->end, start, end);
if (result < 0)
- n->left = insert (n->left, start, end, data);
+ n->left = insert (n->left, start, end, data, destroy_func);
else if (result > 0)
- n->right = insert (n->right, start, end, data);
+ n->right = insert (n->right, start, end, data, destroy_func);
else
return hit_node (n, data);
@@ -500,6 +503,28 @@ gcal_range_tree_new (void)
return self;
}
+/**
+ * gcal_range_tree_new_with_free_func:
+ * @destroy_func: (nullable): a function to free elements with
+ *
+ * Creates a new range tree with @destroy_func as the function to
+ * destroy elements when removing them.
+ *
+ * Returns: (transfer full): a newly created #GcalRangeTree.
+ * Free with gcal_range_tree_unref() when done.
+ */
+GcalRangeTree*
+gcal_range_tree_new_with_free_func (GDestroyNotify destroy_func)
+{
+ GcalRangeTree *self;
+
+ self = g_slice_new0 (GcalRangeTree);
+ self->ref_count = 1;
+ self->destroy_func = destroy_func;
+
+ return self;
+}
+
/**
* gcal_range_tree_copy:
* @self: a #GcalRangeTree
@@ -580,7 +605,7 @@ gcal_range_tree_add_range (GcalRangeTree *self,
g_return_if_fail (end && start);
g_return_if_fail (g_date_time_compare (end, start) >= 0);
- self->root = insert (self->root, start, end, data);
+ self->root = insert (self->root, start, end, data, self->destroy_func);
}
/**
diff --git a/src/views/gcal-range-tree.h b/src/views/gcal-range-tree.h
index 4bd46af2..e1ff6077 100644
--- a/src/views/gcal-range-tree.h
+++ b/src/views/gcal-range-tree.h
@@ -50,6 +50,8 @@ GType gcal_range_tree_get_type (void) G_GNUC_C
GcalRangeTree* gcal_range_tree_new (void);
+GcalRangeTree* gcal_range_tree_new_with_free_func (GDestroyNotify destroy_func);
+
GcalRangeTree* gcal_range_tree_copy (GcalRangeTree *self);
GcalRangeTree* gcal_range_tree_ref (GcalRangeTree *self);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]