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:
bool IsSharedTop() const;
SCROW GetSharedTopRow() const;
SCROW GetSharedLength() const;
// An estimate of the number of cells referenced by the formula
sal_Int32 GetWeight() const;
ScTokenArray* GetSharedCode();
const ScTokenArray* GetSharedCode() const;
......
......@@ -60,6 +60,9 @@ public:
virtual ~ScTokenArray();
ScTokenArray* Clone() const; /// True copy!
// An estimate of the number of cells referenced by the token array
sal_Int32 GetWeight() const;
void GenHash();
size_t GetHash() const { return mnHashValue;}
......
......@@ -3766,7 +3766,7 @@ bool ScFormulaCell::InterpretFormulaGroup()
if (mxGroup->meCalcState == sc::GroupCalcDisabled)
return false;
if (GetSharedLength() < ScInterpreter::GetGlobalConfig().mnOpenCLMinimumFormulaGroupSize)
if (GetWeight() < ScInterpreter::GetGlobalConfig().mnOpenCLMinimumFormulaGroupSize)
{
mxGroup->meCalcState = sc::GroupCalcDisabled;
return false;
......@@ -4144,6 +4144,17 @@ SCROW ScFormulaCell::GetSharedLength() const
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()
{
return mxGroup ? mxGroup->mpCode : NULL;
......
......@@ -1417,6 +1417,33 @@ bool ScTokenArray::ImplGetReference( ScRange& rRange, const ScAddress& rPos, boo
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 {
// 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