Kaydet (Commit) fab297c7 authored tarafından Tor Lillqvist's avatar Tor Lillqvist

Check number of cells referenced by group instead of group size

Put using it in #if 0 for now, though.

This reverts commit 2021275f.

Change-Id: Ia6541df12ee97747badbbedd758873688190b00c
üst 4b269ecb
...@@ -411,6 +411,10 @@ public: ...@@ -411,6 +411,10 @@ public:
bool IsSharedTop() const; bool IsSharedTop() const;
SCROW GetSharedTopRow() const; SCROW GetSharedTopRow() const;
SCROW GetSharedLength() const; SCROW GetSharedLength() const;
// An estimate of the number of cells referenced by the formula
sal_Int32 GetWeight() const;
ScTokenArray* GetSharedCode(); ScTokenArray* GetSharedCode();
const ScTokenArray* GetSharedCode() const; const ScTokenArray* GetSharedCode() const;
......
...@@ -60,6 +60,9 @@ public: ...@@ -60,6 +60,9 @@ public:
virtual ~ScTokenArray(); virtual ~ScTokenArray();
ScTokenArray* Clone() const; /// True copy! ScTokenArray* Clone() const; /// True copy!
// An estimate of the number of cells referenced by the token array
sal_Int32 GetWeight() const;
void GenHash(); void GenHash();
size_t GetHash() const { return mnHashValue;} size_t GetHash() const { return mnHashValue;}
......
...@@ -3766,7 +3766,7 @@ bool ScFormulaCell::InterpretFormulaGroup() ...@@ -3766,7 +3766,7 @@ bool ScFormulaCell::InterpretFormulaGroup()
if (mxGroup->meCalcState == sc::GroupCalcDisabled) if (mxGroup->meCalcState == sc::GroupCalcDisabled)
return false; return false;
if (GetSharedLength() < ScInterpreter::GetGlobalConfig().mnOpenCLMinimumFormulaGroupSize) if (GetWeight() < ScInterpreter::GetGlobalConfig().mnOpenCLMinimumFormulaGroupSize)
{ {
mxGroup->meCalcState = sc::GroupCalcDisabled; mxGroup->meCalcState = sc::GroupCalcDisabled;
return false; return false;
...@@ -4144,6 +4144,17 @@ SCROW ScFormulaCell::GetSharedLength() const ...@@ -4144,6 +4144,17 @@ SCROW ScFormulaCell::GetSharedLength() const
return mxGroup ? mxGroup->mnLength : 0; return mxGroup ? mxGroup->mnLength : 0;
} }
sal_Int32 ScFormulaCell::GetWeight() const
{
#if 0
if (!mxGroup)
return pCode->GetWeight();
return GetSharedLength() * GetSharedCode()->GetWeight();
#else
return GetSharedLength();
#endif
}
ScTokenArray* ScFormulaCell::GetSharedCode() ScTokenArray* ScFormulaCell::GetSharedCode()
{ {
return mxGroup ? mxGroup->mpCode : NULL; return mxGroup ? mxGroup->mpCode : NULL;
......
...@@ -1417,6 +1417,33 @@ bool ScTokenArray::ImplGetReference( ScRange& rRange, const ScAddress& rPos, boo ...@@ -1417,6 +1417,33 @@ bool ScTokenArray::ImplGetReference( ScRange& rRange, const ScAddress& rPos, boo
return bIs; return bIs;
} }
sal_Int32 ScTokenArray::GetWeight() const
{
sal_Int32 result(1);
FormulaToken** p = pCode;
FormulaToken** pEnd = p + static_cast<size_t>(nLen);
for (; p != pEnd; ++p)
{
switch ((*p)->GetType())
{
case svDoubleRef :
case svExternalDoubleRef:
{
const ScComplexRefData& rRef = *(*p)->GetDoubleRef();
result += ( (rRef.Ref2.Row() - rRef.Ref1.Row() + 1) * (rRef.Ref2.Col() - rRef.Ref1.Col() + 1) );
}
break;
default:
break;
}
}
// Just print out the this pointer. It turns out to be quite complicated to get
// a symbolic printout of the ScTokenArray here.
SAL_INFO("sc.token", "GetWeight(" << this << "): " << result);
return result;
}
namespace { namespace {
// we want to compare for similar not identical formulae // we want to compare for similar not identical formulae
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment