summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2020-12-23 20:04:29 +0100
committerBenjamin Otte <otte@redhat.com>2020-12-24 06:38:45 +0100
commit96e1b85c2cfec83961b2a667833155cef3a4b073 (patch)
treeb9595648e638a6ac761b4f99fc5717c97e865be5
parent71e616d17e4d265bba66cbe7dd818195c6934117 (diff)
downloadgtk+-96e1b85c2cfec83961b2a667833155cef3a4b073.tar.gz
gdkarray: Add a "stolen" boolean to splice()
If set to TRUE, does not call the free func for the removed items. This can be used to move items between arrays without having to do the refcounting dance.
-rw-r--r--gdk/gdkarrayimpl.c11
-rw-r--r--gtk/gtkactionmuxer.c2
-rw-r--r--gtk/gtkcssselector.c2
-rw-r--r--gtk/gtkmultifilter.c2
-rw-r--r--gtk/gtkmultisorter.c2
-rw-r--r--gtk/gtksnapshot.c4
-rw-r--r--gtk/gtkstringlist.c2
-rw-r--r--testsuite/gdk/arrayimpl.c2
8 files changed, 15 insertions, 12 deletions
diff --git a/gdk/gdkarrayimpl.c b/gdk/gdkarrayimpl.c
index 003c67fd59..a18ab5e33d 100644
--- a/gdk/gdkarrayimpl.c
+++ b/gdk/gdkarrayimpl.c
@@ -182,6 +182,7 @@ G_GNUC_UNUSED static inline void
gdk_array(splice) (GdkArray *self,
gsize pos,
gsize removed,
+ gboolean stolen,
_T_ *additions,
gsize added)
{
@@ -192,8 +193,9 @@ gdk_array(splice) (GdkArray *self,
g_assert (pos + removed <= size);
remaining = size - pos - removed;
- gdk_array(free_elements) (gdk_array(index) (self, pos),
- gdk_array(index) (self, pos + removed));
+ if (!stolen)
+ gdk_array(free_elements) (gdk_array(index) (self, pos),
+ gdk_array(index) (self, pos + removed));
gdk_array(reserve) (self, size - removed + added);
@@ -225,9 +227,9 @@ gdk_array(set_size) (GdkArray *self,
{
gsize old_size = gdk_array(get_size) (self);
if (new_size > old_size)
- gdk_array(splice) (self, old_size, 0, NULL, new_size - old_size);
+ gdk_array(splice) (self, old_size, 0, FALSE, NULL, new_size - old_size);
else
- gdk_array(splice) (self, new_size, old_size - new_size, NULL, 0);
+ gdk_array(splice) (self, new_size, old_size - new_size, FALSE, NULL, 0);
}
G_GNUC_UNUSED static void
@@ -241,6 +243,7 @@ gdk_array(append) (GdkArray *self,
gdk_array(splice) (self,
gdk_array(get_size) (self),
0,
+ FALSE,
#ifdef GDK_ARRAY_BY_VALUE
value,
#else
diff --git a/gtk/gtkactionmuxer.c b/gtk/gtkactionmuxer.c
index fad926ceaf..fb3c4fb5a3 100644
--- a/gtk/gtkactionmuxer.c
+++ b/gtk/gtkactionmuxer.c
@@ -100,7 +100,7 @@ gtk_accels_remove (GtkAccels *accels,
position = gtk_accels_find (accels, action_and_target);
if (position < gtk_accels_get_size (accels))
- gtk_accels_splice (accels, position, 1, NULL, 0);
+ gtk_accels_splice (accels, position, 1, FALSE, NULL, 0);
}
/*< private >
diff --git a/gtk/gtkcssselector.c b/gtk/gtkcssselector.c
index b8ef92a9ae..f04a6fe7c5 100644
--- a/gtk/gtkcssselector.c
+++ b/gtk/gtkcssselector.c
@@ -167,7 +167,7 @@ gtk_css_selector_matches_insert_sorted (GtkCssSelectorMatches *matches,
break;
}
- gtk_css_selector_matches_splice (matches, i, 0, (gpointer[1]) { data }, 1);
+ gtk_css_selector_matches_splice (matches, i, 0, FALSE, (gpointer[1]) { data }, 1);
}
static inline gboolean
diff --git a/gtk/gtkmultifilter.c b/gtk/gtkmultifilter.c
index 8211295fb2..3550d90c58 100644
--- a/gtk/gtkmultifilter.c
+++ b/gtk/gtkmultifilter.c
@@ -206,7 +206,7 @@ gtk_multi_filter_remove (GtkMultiFilter *self,
filter = gtk_filters_get (&self->filters, position);
g_signal_handlers_disconnect_by_func (filter, gtk_multi_filter_changed_cb, self);
- gtk_filters_splice (&self->filters, position, 1, NULL, 0);
+ gtk_filters_splice (&self->filters, position, 1, FALSE, NULL, 0);
gtk_filter_changed (GTK_FILTER (self),
GTK_MULTI_FILTER_GET_CLASS (self)->removal_change);
diff --git a/gtk/gtkmultisorter.c b/gtk/gtkmultisorter.c
index 5690d6d1d0..a733f5a275 100644
--- a/gtk/gtkmultisorter.c
+++ b/gtk/gtkmultisorter.c
@@ -432,7 +432,7 @@ gtk_multi_sorter_remove (GtkMultiSorter *self,
sorter = gtk_sorters_get (&self->sorters, position);
g_signal_handlers_disconnect_by_func (sorter, gtk_multi_sorter_changed_cb, self);
- gtk_sorters_splice (&self->sorters, position, 1, NULL, 0);
+ gtk_sorters_splice (&self->sorters, position, 1, FALSE, NULL, 0);
gtk_sorter_changed_with_keys (GTK_SORTER (self),
GTK_SORTER_CHANGE_LESS_STRICT,
diff --git a/gtk/gtksnapshot.c b/gtk/gtksnapshot.c
index 7c5c744842..e01ce5ec68 100644
--- a/gtk/gtksnapshot.c
+++ b/gtk/gtksnapshot.c
@@ -1386,7 +1386,7 @@ gtk_snapshot_pop_one (GtkSnapshot *snapshot)
/* Remove all the state's nodes from the list of nodes */
g_assert (state->start_node_index + state->n_nodes == gtk_snapshot_nodes_get_size (&snapshot->nodes));
- gtk_snapshot_nodes_splice (&snapshot->nodes, state->start_node_index, state->n_nodes, NULL, 0);
+ gtk_snapshot_nodes_splice (&snapshot->nodes, state->start_node_index, state->n_nodes, FALSE, NULL, 0);
}
else
{
@@ -1400,7 +1400,7 @@ gtk_snapshot_pop_one (GtkSnapshot *snapshot)
g_assert (previous_state->start_node_index + previous_state->n_nodes == gtk_snapshot_nodes_get_size (&snapshot->nodes));
}
- gtk_snapshot_states_splice (&snapshot->state_stack, state_index, 1, NULL, 0);
+ gtk_snapshot_states_splice (&snapshot->state_stack, state_index, 1, FALSE, NULL, 0);
return node;
}
diff --git a/gtk/gtkstringlist.c b/gtk/gtkstringlist.c
index 64e2e56155..c271ed91c1 100644
--- a/gtk/gtkstringlist.c
+++ b/gtk/gtkstringlist.c
@@ -471,7 +471,7 @@ gtk_string_list_splice (GtkStringList *self,
else
n_additions = 0;
- objects_splice (&self->items, position, n_removals, NULL, n_additions);
+ objects_splice (&self->items, position, n_removals, FALSE, NULL, n_additions);
for (i = 0; i < n_additions; i++)
{
diff --git a/testsuite/gdk/arrayimpl.c b/testsuite/gdk/arrayimpl.c
index 286f64d678..77494fbf70 100644
--- a/testsuite/gdk/arrayimpl.c
+++ b/testsuite/gdk/arrayimpl.c
@@ -77,7 +77,7 @@ gdk_array(test_splice) (void)
for (j = 0; j < add; j++)
sum += ++additions[j];
- gdk_array(splice) (&v, pos, remove, additions, add);
+ gdk_array(splice) (&v, pos, remove, FALSE, additions, add);
{
gsize total = 0;
for (j = 0; j < gdk_array(get_size) (&v); j++)