[gtk+] textiter: remove recursivity of find_by_log_attrs()



commit 7f6ae622d374f2a6c5fccaa14e981c1d26cf7b35
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Thu Apr 10 23:53:41 2014 +0200

    textiter: remove recursivity of find_by_log_attrs()
    
    find_by_log_attrs() was a recursive function. It is replaced by an
    iteration.
    
    The already_moved_initially parameter was TRUE only for the recursive
    call, so the paramater is removed.
    
    There is also a small cleanup of the find_visible_by_log_attrs()
    (remove trailing spaces, fix indentation).
    
    There is still a part to optimize for a later commit.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=629129

 gtk/gtktextiter.c |   97 ++++++++++++++++++++++++++---------------------------
 1 files changed, 48 insertions(+), 49 deletions(-)
---
diff --git a/gtk/gtktextiter.c b/gtk/gtktextiter.c
index 55e33c0..a97dea4 100644
--- a/gtk/gtktextiter.c
+++ b/gtk/gtktextiter.c
@@ -3096,82 +3096,81 @@ find_line_log_attrs (const GtkTextIter *iter,
   return result;
 }
 
-/* FIXME this function is very, very gratuitously slow */
 static gboolean
-find_by_log_attrs (GtkTextIter    *iter,
-                   FindLogAttrFunc func,
-                   gboolean        forward,
-                   gboolean        already_moved_initially)
+find_by_log_attrs (GtkTextIter     *iter,
+                   FindLogAttrFunc  func,
+                   gboolean         forward)
 {
   GtkTextIter orig;
-  gint offset = 0;
-  gboolean found = FALSE;
+  gboolean already_moved_initially = FALSE;
 
   g_return_val_if_fail (iter != NULL, FALSE);
 
   orig = *iter;
-  
-  found = find_line_log_attrs (iter, func, &offset, already_moved_initially);
-  
-  if (!found)
+
+  while (TRUE)
     {
+      gint offset = 0;
+      gboolean found;
+
+      found = find_line_log_attrs (iter, func, &offset, already_moved_initially);
+
+      if (found)
+        {
+          gtk_text_iter_set_line_offset (iter, offset);
+
+          return !gtk_text_iter_equal (iter, &orig) && !gtk_text_iter_is_end (iter);
+        }
+
       if (forward)
         {
-          if (gtk_text_iter_forward_line (iter))
-            return find_by_log_attrs (iter, func, forward,
-                                      TRUE);
-          else
+          if (!gtk_text_iter_forward_line (iter))
             return FALSE;
+
+          already_moved_initially = TRUE;
         }
       else
-        {                    
+        {
+          /* TODO optimize this part */
           /* go to end of previous line. need to check that
            * line is > 0 because backward_line snaps to start of
            * line 0 if it's on line 0
            */
-          if (gtk_text_iter_get_line (iter) > 0 && 
+          if (gtk_text_iter_get_line (iter) > 0 &&
               gtk_text_iter_backward_line (iter))
             {
               if (!gtk_text_iter_ends_line (iter))
                 gtk_text_iter_forward_to_line_end (iter);
-              
-              return find_by_log_attrs (iter, func, forward,
-                                        TRUE);
+
+              already_moved_initially = TRUE;
             }
           else
-            return FALSE;
+            {
+              return FALSE;
+            }
         }
     }
-  else
-    {      
-      gtk_text_iter_set_line_offset (iter, offset);
-
-      return
-        (already_moved_initially || !gtk_text_iter_equal (iter, &orig)) &&
-        !gtk_text_iter_is_end (iter);
-    }
 }
 
-static gboolean 
-find_visible_by_log_attrs (GtkTextIter    *iter,
-                          FindLogAttrFunc func,
-                          gboolean        forward,
-                          gboolean        already_moved_initially)
+static gboolean
+find_visible_by_log_attrs (GtkTextIter     *iter,
+                           FindLogAttrFunc  func,
+                           gboolean         forward)
 {
   GtkTextIter pos;
 
   g_return_val_if_fail (iter != NULL, FALSE);
-  
+
   pos = *iter;
-  
-  while (find_by_log_attrs (&pos, func, forward, already_moved_initially)) 
+
+  while (find_by_log_attrs (&pos, func, forward))
     {
-      if (!_gtk_text_btree_char_is_invisible (&pos)) 
+      if (!_gtk_text_btree_char_is_invisible (&pos))
        {
          *iter = pos;
          return TRUE;
        }
-  }
+    }
 
   return FALSE;
 }
@@ -3225,7 +3224,7 @@ move_multiple_steps (GtkTextIter *iter,
 gboolean
 gtk_text_iter_forward_word_end (GtkTextIter *iter)
 {
-  return find_by_log_attrs (iter, find_word_end_func, TRUE, FALSE);
+  return find_by_log_attrs (iter, find_word_end_func, TRUE);
 }
 
 /**
@@ -3243,7 +3242,7 @@ gtk_text_iter_forward_word_end (GtkTextIter *iter)
 gboolean
 gtk_text_iter_backward_word_start (GtkTextIter      *iter)
 {
-  return find_by_log_attrs (iter, find_word_start_func, FALSE, FALSE);
+  return find_by_log_attrs (iter, find_word_start_func, FALSE);
 }
 
 /* FIXME a loop around a truly slow function means
@@ -3303,7 +3302,7 @@ gtk_text_iter_backward_word_starts (GtkTextIter      *iter,
 gboolean
 gtk_text_iter_forward_visible_word_end (GtkTextIter *iter)
 {
-  return find_visible_by_log_attrs (iter, find_word_end_func, TRUE, FALSE);
+  return find_visible_by_log_attrs (iter, find_word_end_func, TRUE);
 }
 
 /**
@@ -3323,7 +3322,7 @@ gtk_text_iter_forward_visible_word_end (GtkTextIter *iter)
 gboolean
 gtk_text_iter_backward_visible_word_start (GtkTextIter      *iter)
 {
-  return find_visible_by_log_attrs (iter, find_word_start_func, FALSE, FALSE);
+  return find_visible_by_log_attrs (iter, find_word_start_func, FALSE);
 }
 
 /**
@@ -3487,7 +3486,7 @@ gtk_text_iter_inside_sentence (const GtkTextIter *iter)
 gboolean
 gtk_text_iter_forward_sentence_end (GtkTextIter *iter)
 {
-  return find_by_log_attrs (iter, find_sentence_end_func, TRUE, FALSE);
+  return find_by_log_attrs (iter, find_sentence_end_func, TRUE);
 }
 
 /**
@@ -3505,7 +3504,7 @@ gtk_text_iter_forward_sentence_end (GtkTextIter *iter)
 gboolean
 gtk_text_iter_backward_sentence_start (GtkTextIter      *iter)
 {
-  return find_by_log_attrs (iter, find_sentence_start_func, FALSE, FALSE);
+  return find_by_log_attrs (iter, find_sentence_start_func, FALSE);
 }
 
 /* FIXME a loop around a truly slow function means
@@ -3620,7 +3619,7 @@ is_cursor_pos_func (const PangoLogAttr *attrs,
 gboolean
 gtk_text_iter_forward_cursor_position (GtkTextIter *iter)
 {
-  return find_by_log_attrs (iter, find_forward_cursor_pos_func, TRUE, FALSE);
+  return find_by_log_attrs (iter, find_forward_cursor_pos_func, TRUE);
 }
 
 /**
@@ -3634,7 +3633,7 @@ gtk_text_iter_forward_cursor_position (GtkTextIter *iter)
 gboolean
 gtk_text_iter_backward_cursor_position (GtkTextIter *iter)
 {
-  return find_by_log_attrs (iter, find_backward_cursor_pos_func, FALSE, FALSE);
+  return find_by_log_attrs (iter, find_backward_cursor_pos_func, FALSE);
 }
 
 /**
@@ -3689,7 +3688,7 @@ gtk_text_iter_backward_cursor_positions (GtkTextIter *iter,
 gboolean
 gtk_text_iter_forward_visible_cursor_position (GtkTextIter *iter)
 {
-  return find_visible_by_log_attrs (iter, find_forward_cursor_pos_func, TRUE, FALSE);
+  return find_visible_by_log_attrs (iter, find_forward_cursor_pos_func, TRUE);
 }
 
 /**
@@ -3706,7 +3705,7 @@ gtk_text_iter_forward_visible_cursor_position (GtkTextIter *iter)
 gboolean
 gtk_text_iter_backward_visible_cursor_position (GtkTextIter *iter)
 {
-  return find_visible_by_log_attrs (iter, find_backward_cursor_pos_func, FALSE, FALSE);
+  return find_visible_by_log_attrs (iter, find_backward_cursor_pos_func, FALSE);
 }
 
 /**


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