From 6aa19a26cf82981ec20bab1b48c6559d02bae44b Mon Sep 17 00:00:00 2001 From: Garrett Regier Date: Mon, 9 May 2016 12:31:57 +0300 Subject: [PATCH] gsequence: Add seq_is_end() This avoids calling is_end() when the GSequence is already determined, thus avoids having to walk the tree. https://bugzilla.gnome.org/show_bug.cgi?id=749583 --- glib/gsequence.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/glib/gsequence.c b/glib/gsequence.c index b42771c43..6ef3f149d 100644 --- a/glib/gsequence.c +++ b/glib/gsequence.c @@ -175,6 +175,13 @@ get_sequence (GSequenceNode *node) return (GSequence *)node_get_last (node)->data; } +static gboolean +seq_is_end (GSequence *seq, + GSequenceIter *iter) +{ + return seq->end_node == iter; +} + static gboolean is_end (GSequenceIter *iter) { @@ -533,9 +540,10 @@ g_sequence_remove (GSequenceIter *iter) GSequence *seq; g_return_if_fail (iter != NULL); - g_return_if_fail (!is_end (iter)); seq = get_sequence (iter); + g_return_if_fail (!seq_is_end (seq, iter)); + check_seq_access (seq); node_unlink (iter); @@ -748,10 +756,11 @@ g_sequence_sort_changed (GSequenceIter *iter, GSequence *seq; SortInfo info; - g_return_if_fail (!is_end (iter)); + g_return_if_fail (iter != NULL); seq = get_sequence (iter); /* check_seq_access() call is done by g_sequence_sort_changed_iter() */ + g_return_if_fail (!seq_is_end (seq, iter)); info.cmp_func = cmp_func; info.cmp_data = cmp_data; @@ -935,10 +944,11 @@ g_sequence_sort_changed_iter (GSequenceIter *iter, GSequenceIter *next, *prev; g_return_if_fail (iter != NULL); - g_return_if_fail (!is_end (iter)); g_return_if_fail (iter_cmp != NULL); seq = get_sequence (iter); + g_return_if_fail (!seq_is_end (seq, iter)); + check_seq_access (seq); /* If one of the neighbours is equal to iter, then @@ -1220,9 +1230,9 @@ g_sequence_set (GSequenceIter *iter, GSequence *seq; g_return_if_fail (iter != NULL); - g_return_if_fail (!is_end (iter)); seq = get_sequence (iter); + g_return_if_fail (!seq_is_end (seq, iter)); /* If @data is identical to iter->data, it is destroyed * here. This will work right in case of ref-counted objects. Also