[Libreoffice-commits] core.git: sc/inc sc/source
Libreoffice Gerrit user
logerrit at kemper.freedesktop.org
Thu Aug 23 09:28:48 UTC 2018
sc/inc/formularesult.hxx | 2 ++
sc/source/core/tool/formularesult.cxx | 28 ++++++++++++++++++++++++----
2 files changed, 26 insertions(+), 4 deletions(-)
New commits:
commit 77f7b4768a79e5a8489b163670e0ce10fbd07c49
Author: Dennis Francis <dennis.francis at collabora.co.uk>
AuthorDate: Wed Jul 11 17:19:28 2018 +0530
Commit: Luboš Luňák <l.lunak at collabora.com>
CommitDate: Thu Aug 23 11:28:23 2018 +0200
Allow fast result return for formula-cells with...
"double" result which is a very frequent use-case.
This improves overall running times in most cases,
not just for the threaded path.
Change-Id: I18d10ee3cea613923e2057e746a6a8187bb18647
Reviewed-on: https://gerrit.libreoffice.org/59395
Tested-by: Jenkins
Reviewed-by: Luboš Luňák <l.lunak at collabora.com>
diff --git a/sc/inc/formularesult.hxx b/sc/inc/formularesult.hxx
index b5fd6228dc41..eac70db65831 100644
--- a/sc/inc/formularesult.hxx
+++ b/sc/inc/formularesult.hxx
@@ -82,6 +82,8 @@ class ScFormulaResult
bool mbEmpty :1; // empty cell result
bool mbEmptyDisplayedAsString :1; // only if mbEmpty
Multiline meMultiline :2; // result is multiline
+ // If set it implies that the result is a simple double (in mfValue) and no error
+ bool mbValueCached :1;
/** Reset mnError, mbEmpty and mbEmptyDisplayedAsString to their defaults
prior to assigning other types */
diff --git a/sc/source/core/tool/formularesult.cxx b/sc/source/core/tool/formularesult.cxx
index 30f8a736852d..4387af07511e 100644
--- a/sc/source/core/tool/formularesult.cxx
+++ b/sc/source/core/tool/formularesult.cxx
@@ -25,13 +25,15 @@ FormulaResultValue::FormulaResultValue( FormulaError nErr ) : meType(Error), mfV
ScFormulaResult::ScFormulaResult() :
mpToken(nullptr), mnError(FormulaError::NONE), mbToken(true),
mbEmpty(false), mbEmptyDisplayedAsString(false),
- meMultiline(MULTILINE_UNKNOWN) {}
+ meMultiline(MULTILINE_UNKNOWN),
+ mbValueCached(false) {}
ScFormulaResult::ScFormulaResult( const ScFormulaResult & r ) :
mnError( r.mnError), mbToken( r.mbToken),
mbEmpty( r.mbEmpty),
mbEmptyDisplayedAsString( r.mbEmptyDisplayedAsString),
- meMultiline( r.meMultiline)
+ meMultiline( r.meMultiline),
+ mbValueCached( r.mbValueCached)
{
if (mbToken)
{
@@ -59,7 +61,7 @@ ScFormulaResult::ScFormulaResult( const ScFormulaResult & r ) :
ScFormulaResult::ScFormulaResult( const formula::FormulaToken* p ) :
mnError(FormulaError::NONE), mbToken(false), mbEmpty(false), mbEmptyDisplayedAsString(false),
- meMultiline(MULTILINE_UNKNOWN)
+ meMultiline(MULTILINE_UNKNOWN), mbValueCached(false)
{
SetToken( p);
}
@@ -76,6 +78,7 @@ void ScFormulaResult::ResetToDefaults()
mbEmpty = false;
mbEmptyDisplayedAsString = false;
meMultiline = MULTILINE_UNKNOWN;
+ mbValueCached = false;
}
void ScFormulaResult::ResolveToken( const formula::FormulaToken * p )
@@ -110,6 +113,7 @@ void ScFormulaResult::ResolveToken( const formula::FormulaToken * p )
p->DecRef();
mbToken = false;
meMultiline = MULTILINE_FALSE;
+ mbValueCached = true;
break;
default:
mpToken = p;
@@ -151,7 +155,7 @@ void ScFormulaResult::Assign( const ScFormulaResult & r )
SetDouble( r.mfValue);
// If there was an error there will be an error, no matter what Set...()
// methods did.
- mnError = r.mnError;
+ SetResultError(r.mnError);
}
void ScFormulaResult::SetToken( const formula::FormulaToken* p )
@@ -216,6 +220,7 @@ void ScFormulaResult::SetDouble( double f )
mfValue = f;
mbToken = false;
meMultiline = MULTILINE_FALSE;
+ mbValueCached = true;
}
}
@@ -335,6 +340,12 @@ bool ScFormulaResult::IsMultiline() const
bool ScFormulaResult::GetErrorOrDouble( FormulaError& rErr, double& rVal ) const
{
+ if (mbValueCached)
+ {
+ rVal = mfValue;
+ return true;
+ }
+
if (mnError != FormulaError::NONE)
{
rErr = mnError;
@@ -368,6 +379,9 @@ bool ScFormulaResult::GetErrorOrDouble( FormulaError& rErr, double& rVal ) const
sc::FormulaResultValue ScFormulaResult::GetResult() const
{
+ if (mbValueCached)
+ return sc::FormulaResultValue(mfValue);
+
if (mnError != FormulaError::NONE)
return sc::FormulaResultValue(mnError);
@@ -424,6 +438,8 @@ FormulaError ScFormulaResult::GetResultError() const
void ScFormulaResult::SetResultError( FormulaError nErr )
{
mnError = nErr;
+ if (mnError != FormulaError::NONE)
+ mbValueCached = false;
}
formula::FormulaConstTokenRef ScFormulaResult::GetToken() const
@@ -443,6 +459,9 @@ formula::FormulaConstTokenRef ScFormulaResult::GetCellResultToken() const
double ScFormulaResult::GetDouble() const
{
+ if (mbValueCached)
+ return mfValue;
+
if (mbToken)
{
// Should really not be of type formula::svDouble here.
@@ -536,6 +555,7 @@ void ScFormulaResult::SetHybridDouble( double f )
mfValue = f;
mbToken = false;
meMultiline = MULTILINE_FALSE;
+ mbValueCached = true;
}
}
More information about the Libreoffice-commits
mailing list