[Libreoffice-commits] core.git: sc/source

Eike Rathke erack at redhat.com
Tue Jan 23 10:36:42 UTC 2018


 sc/source/core/tool/rangelst.cxx |   76 +++++++++++++++++++++------------------
 1 file changed, 41 insertions(+), 35 deletions(-)

New commits:
commit 73049e5dbf9430df077dd26bed9d01435f745544
Author: Eike Rathke <erack at redhat.com>
Date:   Mon Jan 22 21:41:51 2018 +0100

    Flatten ScRangePairList::Join() recursion
    
    Similar to ScRangeList::Join() done before.
    
    Change-Id: Ie513b4c72bc211c196e13761b63446174321a389
    Reviewed-on: https://gerrit.libreoffice.org/48361
    Reviewed-by: Eike Rathke <erack at redhat.com>
    Tested-by: Jenkins <ci at libreoffice.org>

diff --git a/sc/source/core/tool/rangelst.cxx b/sc/source/core/tool/rangelst.cxx
index e04a45f06e45..3f56e5337e73 100644
--- a/sc/source/core/tool/rangelst.cxx
+++ b/sc/source/core/tool/rangelst.cxx
@@ -1440,53 +1440,49 @@ void ScRangePairList::Join( const ScRangePair& r, bool bIsInList )
         Append( r );
         return ;
     }
-    const ScRange& r1 = r.GetRange(0);
-    const ScRange& r2 = r.GetRange(1);
-    SCCOL nCol1 = r1.aStart.Col();
-    SCROW nRow1 = r1.aStart.Row();
-    SCTAB nTab1 = r1.aStart.Tab();
-    SCCOL nCol2 = r1.aEnd.Col();
-    SCROW nRow2 = r1.aEnd.Row();
-    SCTAB nTab2 = r1.aEnd.Tab();
-    ScRangePair* pOver = const_cast<ScRangePair*>(&r);     // nasty but true when bInList
-    size_t nOldPos = 0;
-    if ( bIsInList )
-    {
-        // Find the current position of this range.
-        for ( size_t i = 0, nPairs = maPairs.size(); i < nPairs; ++i )
-        {
-            if ( maPairs[i] == pOver )
-            {
-                nOldPos = i;
-                break;
-            }
-        }
-    }
+
     bool bJoinedInput = false;
+    const ScRangePair* pOver = &r;
 
-    for ( size_t i = 0; i < maPairs.size() && pOver; ++i )
+Label_RangePair_Join:
+
+    assert(pOver);
+    const ScRange& r1 = pOver->GetRange(0);
+    const ScRange& r2 = pOver->GetRange(1);
+    const SCCOL nCol1 = r1.aStart.Col();
+    const SCROW nRow1 = r1.aStart.Row();
+    const SCTAB nTab1 = r1.aStart.Tab();
+    const SCCOL nCol2 = r1.aEnd.Col();
+    const SCROW nRow2 = r1.aEnd.Row();
+    const SCTAB nTab2 = r1.aEnd.Tab();
+
+    size_t nOverPos = std::numeric_limits<size_t>::max();
+    for (size_t i = 0; i < maPairs.size(); ++i)
     {
         ScRangePair* p = maPairs[ i ];
         if ( p == pOver )
+        {
+            nOverPos = i;
             continue;           // the same one, continue with the next
+        }
         bool bJoined = false;
         ScRange& rp1 = p->GetRange(0);
         ScRange& rp2 = p->GetRange(1);
         if ( rp2 == r2 )
         {   // only if Range2 is equal
             if ( rp1.In( r1 ) )
-            {   // RangePair r included in or identical to RangePair p
+            {   // RangePair pOver included in or identical to RangePair p
                 if ( bIsInList )
-                    bJoined = true;     // do away with RangePair r
+                    bJoined = true;     // do away with RangePair pOver
                 else
                 {   // that was all then
-                    bJoinedInput = true;    // don't attach
+                    bJoinedInput = true;    // don't append
                     break;  // for
                 }
             }
             else if ( r1.In( rp1 ) )
-            {   // RangePair p included in RangePair r, make r the new RangePair
-                *p = r;
+            {   // RangePair p included in RangePair pOver, make pOver the new RangePair
+                *p = *pOver;
                 bJoined = true;
             }
         }
@@ -1536,15 +1532,25 @@ void ScRangePairList::Join( const ScRangePair& r, bool bIsInList )
         if ( bJoined )
         {
             if ( bIsInList )
-            {   // delete RangePair within the list
-                Remove( nOldPos );
-                i--;
-                pOver = nullptr;
-                if ( nOldPos )
-                    nOldPos--;          // configure seek correctly
+            {   // delete RangePair pOver within the list
+                if (nOverPos != std::numeric_limits<size_t>::max())
+                    Remove(nOverPos);
+                else
+                {
+                    for (size_t nOver = 0, nPairs = maPairs.size(); nOver < nPairs; ++nOver)
+                    {
+                        if (maPairs[nOver] == pOver)
+                        {
+                            Remove(nOver);
+                            break;
+                        }
+                    }
+                }
             }
             bJoinedInput = true;
-            Join( *p, true );           // recursive!
+            pOver = p;
+            bIsInList = true;
+            goto Label_RangePair_Join;
         }
     }
     if ( !bIsInList && !bJoinedInput )


More information about the Libreoffice-commits mailing list