[glib] gsequence: Add seq_is_end()



commit 6aa19a26cf82981ec20bab1b48c6559d02bae44b
Author: Garrett Regier <garrettregier gmail com>
Date:   Mon May 9 12:31:57 2016 +0300

    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 files changed, 14 insertions(+), 4 deletions(-)
---
diff --git a/glib/gsequence.c b/glib/gsequence.c
index b42771c..6ef3f14 100644
--- a/glib/gsequence.c
+++ b/glib/gsequence.c
@@ -176,6 +176,13 @@ get_sequence (GSequenceNode *node)
 }
 
 static gboolean
+seq_is_end (GSequence     *seq,
+            GSequenceIter *iter)
+{
+  return seq->end_node == iter;
+}
+
+static gboolean
 is_end (GSequenceIter *iter)
 {
   GSequenceIter *parent = iter->parent;
@@ -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


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]