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

Eike Rathke erack at redhat.com
Tue May 23 12:51:37 UTC 2017


 sc/source/core/inc/interpre.hxx  |    2 
 sc/source/core/tool/interpr1.cxx |  111 ++++++++++++++++++++++++---------------
 2 files changed, 70 insertions(+), 43 deletions(-)

New commits:
commit d24a9a7513805f1baee3ff7c9b8a25eb467a0f6b
Author: Eike Rathke <erack at redhat.com>
Date:   Tue May 23 14:50:41 2017 +0200

    Move pushing the result token into IterateParametersIfs, tdf#58874
    
    Change-Id: I7c44afad1610fd04b0b2acc51c654a583ed991e6

diff --git a/sc/source/core/inc/interpre.hxx b/sc/source/core/inc/interpre.hxx
index 8e6d89206c3a..53190038bd9b 100644
--- a/sc/source/core/inc/interpre.hxx
+++ b/sc/source/core/inc/interpre.hxx
@@ -600,7 +600,7 @@ void IterateParametersIf( ScIterFuncIf );
 void ScCountIf();
 void ScSumIf();
 void ScAverageIf();
-void IterateParametersIfs( sc::ParamIfsResult& rRes );
+void IterateParametersIfs( double(*ResultFunc)( const sc::ParamIfsResult& rRes ) );
 void ScSumIfs();
 void ScAverageIfs();
 void ScCountIfs();
diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx
index ba1a5d916d4d..4eb3e3bbe518 100644
--- a/sc/source/core/tool/interpr1.cxx
+++ b/sc/source/core/tool/interpr1.cxx
@@ -5624,11 +5624,12 @@ void ScInterpreter::ScCountIf()
     }
 }
 
-void ScInterpreter::IterateParametersIfs( sc::ParamIfsResult& rRes )
+void ScInterpreter::IterateParametersIfs( double(*ResultFunc)( const sc::ParamIfsResult& rRes ) )
 {
     sal_uInt8 nParamCount = GetByte();
     sal_uInt8 nQueryCount = nParamCount / 2;
 
+    sc::ParamIfsResult aRes;
     std::vector<sal_uInt8> aResArray;
     size_t nRowSize = 0;
     size_t nColSize = 0;
@@ -5651,7 +5652,10 @@ void ScInterpreter::IterateParametersIfs( sc::ParamIfsResult& rRes )
                 {
                     ScAddress aAdr;
                     if ( !PopDoubleRefOrSingleRef( aAdr ) )
+                    {
+                        PushError( nGlobalError);
                         return;
+                    }
 
                     ScRefCellValue aCell(*pDok, aAdr);
                     switch (aCell.meType)
@@ -5713,7 +5717,10 @@ void ScInterpreter::IterateParametersIfs( sc::ParamIfsResult& rRes )
         }
 
         if (nGlobalError != FormulaError::NONE)
+        {
+            PushError( nGlobalError);
             return;   // and bail out, no need to evaluate other arguments
+        }
 
         // take range
         nParam = 1;
@@ -5750,7 +5757,7 @@ void ScInterpreter::IterateParametersIfs( sc::ParamIfsResult& rRes )
                     pQueryMatrix = PopMatrix();
                     if (!pQueryMatrix)
                     {
-                        SetError( FormulaError::IllegalParameter);
+                        PushError( FormulaError::IllegalParameter);
                         return;
                     }
                     nCol1 = 0;
@@ -5764,12 +5771,12 @@ void ScInterpreter::IterateParametersIfs( sc::ParamIfsResult& rRes )
                 }
                 break;
             default:
-                SetError( FormulaError::IllegalParameter);
+                PushError( FormulaError::IllegalParameter);
                 return;
         }
         if ( nTab1 != nTab2 )
         {
-            SetError( FormulaError::IllegalArgument);
+            PushError( FormulaError::IllegalArgument);
             return;
         }
 
@@ -5780,13 +5787,16 @@ void ScInterpreter::IterateParametersIfs( sc::ParamIfsResult& rRes )
             nDimensionRows = nRow2 - nRow1 + 1;
         if ((nDimensionCols != (nCol2 - nCol1 + 1)) || (nDimensionRows != (nRow2 - nRow1 + 1)))
         {
-            SetError ( FormulaError::IllegalArgument);
+            PushError ( FormulaError::IllegalArgument);
             return;
         }
 
         // recalculate matrix values
         if (nGlobalError != FormulaError::NONE)
+        {
+            PushError( nGlobalError);
             return;
+        }
 
         // initialize temporary result matrix
         if (aResArray.empty())
@@ -5829,7 +5839,7 @@ void ScInterpreter::IterateParametersIfs( sc::ParamIfsResult& rRes )
             ScMatrixRef pResultMatrix = QueryMat( pQueryMatrix, aOptions);
             if (nGlobalError != FormulaError::NONE || !pResultMatrix)
             {
-                SetError( FormulaError::IllegalParameter);
+                PushError( FormulaError::IllegalParameter);
                 return;
             }
 
@@ -5838,7 +5848,7 @@ void ScInterpreter::IterateParametersIfs( sc::ParamIfsResult& rRes )
             pResultMatrix->GetDoubleArray(aResValues);
             if (aResArray.size() != aResValues.size())
             {
-                SetError( FormulaError::IllegalParameter);
+                PushError( FormulaError::IllegalParameter);
                 return;
             }
 
@@ -5866,7 +5876,10 @@ void ScInterpreter::IterateParametersIfs( sc::ParamIfsResult& rRes )
     }
 
     if (nGlobalError != FormulaError::NONE)
+    {
+        PushError( nGlobalError);
         return;   // bail out
+    }
 
     // main range - only for AVERAGEIFS, SUMIFS, MINIFS and MAXIFS
     if (nParamCount == 1)
@@ -5906,7 +5919,7 @@ void ScInterpreter::IterateParametersIfs( sc::ParamIfsResult& rRes )
                     pMainMatrix = PopMatrix();
                     if (!pMainMatrix)
                     {
-                        SetError( FormulaError::IllegalParameter);
+                        PushError( FormulaError::IllegalParameter);
                         return;
                     }
                     nMainCol1 = 0;
@@ -5920,24 +5933,27 @@ void ScInterpreter::IterateParametersIfs( sc::ParamIfsResult& rRes )
                 }
                 break;
             default:
-                SetError( FormulaError::IllegalParameter);
+                PushError( FormulaError::IllegalParameter);
                 return;
         }
         if ( nMainTab1 != nMainTab2 )
         {
-            SetError( FormulaError::IllegalArgument);
+            PushError( FormulaError::IllegalArgument);
             return;
         }
 
         // All reference ranges must be of same dimension and size.
         if ((nDimensionCols != (nMainCol2 - nMainCol1 + 1)) || (nDimensionRows != (nMainRow2 - nMainRow1 + 1)))
         {
-            SetError ( FormulaError::IllegalArgument);
+            PushError ( FormulaError::IllegalArgument);
             return;
         }
 
         if (nGlobalError != FormulaError::NONE)
+        {
+            PushError( nGlobalError);
             return;   // bail out
+        }
 
         // end-result calculation
         ScAddress aAdr;
@@ -5948,7 +5964,7 @@ void ScInterpreter::IterateParametersIfs( sc::ParamIfsResult& rRes )
             pMainMatrix->GetDoubleArray(aMainValues, false); // Map empty values to NaN's.
             if (aResArray.size() != aMainValues.size())
             {
-                SetError( FormulaError::IllegalArgument);
+                PushError( FormulaError::IllegalArgument);
                 return;
             }
 
@@ -5963,18 +5979,18 @@ void ScInterpreter::IterateParametersIfs( sc::ParamIfsResult& rRes )
                 if (GetDoubleErrorValue(fVal) == FormulaError::ElementNaN)
                     continue;
 
-                ++rRes.mfCount;
+                ++aRes.mfCount;
                 if (bNull && fVal != 0.0)
                 {
                     bNull = false;
-                    rRes.mfMem = fVal;
+                    aRes.mfMem = fVal;
                 }
                 else
-                    rRes.mfSum += fVal;
-                if ( rRes.mfMin > fVal )
-                    rRes.mfMin = fVal;
-                if ( rRes.mfMax < fVal )
-                    rRes.mfMax = fVal;
+                    aRes.mfSum += fVal;
+                if ( aRes.mfMin > fVal )
+                    aRes.mfMin = fVal;
+                if ( aRes.mfMax < fVal )
+                    aRes.mfMax = fVal;
             }
         }
         else
@@ -5992,18 +6008,18 @@ void ScInterpreter::IterateParametersIfs( sc::ParamIfsResult& rRes )
                         if (aCell.hasNumeric())
                         {
                             fVal = GetCellValue(aAdr, aCell);
-                            ++rRes.mfCount;
+                            ++aRes.mfCount;
                             if ( bNull && fVal != 0.0 )
                             {
                                 bNull = false;
-                                rRes.mfMem = fVal;
+                                aRes.mfMem = fVal;
                             }
                             else
-                                rRes.mfSum += fVal;
-                            if ( rRes.mfMin > fVal )
-                                rRes.mfMin = fVal;
-                            if ( rRes.mfMax < fVal )
-                                rRes.mfMax = fVal;
+                                aRes.mfSum += fVal;
+                            if ( aRes.mfMin > fVal )
+                                aRes.mfMin = fVal;
+                            if ( aRes.mfMax < fVal )
+                                aRes.mfMax = fVal;
                         }
                     }
                 }
@@ -6015,8 +6031,9 @@ void ScInterpreter::IterateParametersIfs( sc::ParamIfsResult& rRes )
         std::vector<sal_uInt8>::const_iterator itRes = aResArray.begin(), itResEnd = aResArray.end();
         for (; itRes != itResEnd; ++itRes)
             if (*itRes == nQueryCount)
-                ++rRes.mfCount;
+                ++aRes.mfCount;
     }
+    PushDouble( ResultFunc( aRes));
 }
 
 void ScInterpreter::ScSumIfs()
@@ -6029,9 +6046,11 @@ void ScInterpreter::ScSumIfs()
         return;
     }
 
-    sc::ParamIfsResult aRes;
-    IterateParametersIfs(aRes);
-    PushDouble(rtl::math::approxAdd(aRes.mfSum, aRes.mfMem));
+    auto ResultFunc = []( const sc::ParamIfsResult& rRes )
+    {
+        return rtl::math::approxAdd(rRes.mfSum, rRes.mfMem);
+    };
+    IterateParametersIfs(ResultFunc);
 }
 
 void ScInterpreter::ScAverageIfs()
@@ -6044,9 +6063,11 @@ void ScInterpreter::ScAverageIfs()
         return;
     }
 
-    sc::ParamIfsResult aRes;
-    IterateParametersIfs(aRes);
-    PushDouble(div(rtl::math::approxAdd(aRes.mfSum, aRes.mfMem), aRes.mfCount));
+    auto ResultFunc = []( const sc::ParamIfsResult& rRes )
+    {
+        return sc::div( rtl::math::approxAdd( rRes.mfSum, rRes.mfMem), rRes.mfCount);
+    };
+    IterateParametersIfs(ResultFunc);
 }
 
 void ScInterpreter::ScCountIfs()
@@ -6059,9 +6080,11 @@ void ScInterpreter::ScCountIfs()
         return;
     }
 
-    sc::ParamIfsResult aRes;
-    IterateParametersIfs(aRes);
-    PushDouble(aRes.mfCount);
+    auto ResultFunc = []( const sc::ParamIfsResult& rRes )
+    {
+        return rRes.mfCount;
+    };
+    IterateParametersIfs(ResultFunc);
 }
 
 void ScInterpreter::ScMinIfs_MS()
@@ -6074,9 +6097,11 @@ void ScInterpreter::ScMinIfs_MS()
         return;
     }
 
-    sc::ParamIfsResult aRes;
-    IterateParametersIfs(aRes);
-    PushDouble((aRes.mfMin < std::numeric_limits<double>::max()) ? aRes.mfMin : 0.0);
+    auto ResultFunc = []( const sc::ParamIfsResult& rRes )
+    {
+        return (rRes.mfMin < std::numeric_limits<double>::max()) ? rRes.mfMin : 0.0;
+    };
+    IterateParametersIfs(ResultFunc);
 }
 
 
@@ -6090,9 +6115,11 @@ void ScInterpreter::ScMaxIfs_MS()
         return;
     }
 
-    sc::ParamIfsResult aRes;
-    IterateParametersIfs(aRes);
-    PushDouble((aRes.mfMax > std::numeric_limits<double>::lowest()) ? aRes.mfMax : 0.0);
+    auto ResultFunc = []( const sc::ParamIfsResult& rRes )
+    {
+        return (rRes.mfMax > std::numeric_limits<double>::lowest()) ? rRes.mfMax : 0.0;
+    };
+    IterateParametersIfs(ResultFunc);
 }
 
 void ScInterpreter::ScLookup()


More information about the Libreoffice-commits mailing list