yakov pushed a commit to branch master.

http://git.enlightenment.org/tools/erigo.git/commit/?id=5e647bf120677acf290af6893d1b3fc82739abdc

commit 5e647bf120677acf290af6893d1b3fc82739abdc
Author: Yakov Goldberg <yako...@samsung.com>
Date:   Sun Nov 8 18:15:29 2015 +0200

    Refactoring squash mechanism in memento_finalize()
---
 src/lib/undoredo.c | 41 ++++++++++++++++++++++-------------------
 1 file changed, 22 insertions(+), 19 deletions(-)

diff --git a/src/lib/undoredo.c b/src/lib/undoredo.c
index 8563693..c3f36b6 100644
--- a/src/lib/undoredo.c
+++ b/src/lib/undoredo.c
@@ -6,7 +6,6 @@ struct _Memento_Command
 {
    Eid *eid; // wdg, action...
    Memento_Type type;
-   Eina_Bool delete_me : 1;
    union
      {
         struct
@@ -278,17 +277,15 @@ memento_is_finalized(const Memento *memento)
 Eina_Bool
 memento_finalize(Memento *memento)
 {
-   Eina_List *itr, *itr2;
+   Eina_List *itr;
    Memento_Command *cmd, *cmd_next;
    memento->finalized = EINA_TRUE;
-   Eina_Bool change = EINA_TRUE;
 
-   while (change)
+   while (1)
      {
-        change = EINA_FALSE;
+        Eina_Bool cmd_del = EINA_FALSE;
         EINA_LIST_FOREACH(memento->cmds, itr, cmd)
           {
-             if (cmd->delete_me) continue;
              Eina_List *next = eina_list_next(itr);
              if (next)
                {
@@ -301,13 +298,17 @@ memento_finalize(Memento *memento)
                        void *tmp = cmd->new_ptr;
                        cmd->new_ptr = cmd_next->new_ptr;
                        cmd_next->new_ptr = tmp;
-                       cmd_next->delete_me = EINA_TRUE;
-                       change = EINA_TRUE;
+
+                       cmd_del = EINA_TRUE;
+                       itr = next;
+                       cmd = cmd_next;
+                       break;
                     }
                }
              if (cmd->old_ptr == cmd->new_ptr)
                {
-                  cmd->delete_me = EINA_TRUE;
+                  cmd_del = EINA_TRUE;
+                  break;
                }
              if (cmd->type == MEMENTO_OBJ_CONTAINER_ITEM)
                {
@@ -317,26 +318,25 @@ memento_finalize(Memento *memento)
                   from_list = obj_container_contents_list_get(cmd->old_ptr);
                   to_list = obj_container_contents_list_get(cmd->new_ptr);
                   if (eina_list_count(from_list) != eina_list_count(to_list)) 
continue;
-                  cmd->delete_me = EINA_TRUE;
+                  cmd_del = EINA_TRUE;
                   while (from_list)
                     {
                        if 
(obj_container_item_eid_get(eina_list_data_get(from_list)) !=
                            
obj_container_item_eid_get(eina_list_data_get(to_list)))
                          {
-                            cmd->delete_me = EINA_FALSE;
+                            cmd_del = EINA_FALSE;
                             break;
                          }
 
                        from_list = eina_list_next(from_list);
                        to_list = eina_list_next(to_list);
                     }
-
+                  if (cmd_del) break;
                }
              if (cmd->type == MEMENTO_PROPERTY)
                {
                   if (!prop_cmp(cmd->old_ptr, cmd->new_ptr))
                     {
-                       cmd->delete_me = EINA_TRUE;
                        /* To the moment of gui_context_finalize(), new 
property already is set in wdg.
                         * Undo/redo works by adding/removing property pointer 
in wdg.
                         * So if memento will be deleted, we will not be able 
to remove property from widgetŠ±
@@ -346,16 +346,19 @@ memento_finalize(Memento *memento)
                        Gui_Widget *wdg = wdg_get(cmd->eid);
                        wdg_prop_remove(wdg, cmd->new_ptr);
                        wdg_prop_add(wdg, cmd->old_ptr);
+                       cmd_del = EINA_TRUE;
+                       break;
                     }
                }
           }
-        EINA_LIST_FOREACH_SAFE(memento->cmds, itr, itr2, cmd)
+        if (cmd_del)
           {
-             if (cmd->delete_me)
-               {
-                  memento->cmds = eina_list_remove_list(memento->cmds, itr);
-                  _cmd_del(cmd);
-               }
+             memento->cmds = eina_list_remove_list(memento->cmds, itr);
+             _cmd_del(cmd);
+          }
+        else
+          {
+             break;
           }
      }
    return !!memento->cmds;

-- 


Reply via email to