diff options
author | Kohei Yoshida <kohei.yoshida@collabora.com> | 2014-02-26 14:32:57 -0500 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@collabora.com> | 2014-02-27 21:19:36 -0500 |
commit | 6ef6dd0122b8e44d8547ec31f40def42173e4e41 (patch) | |
tree | 56fbc756f7fdd0a1ef333d3b1231eb3e01c58fee | |
parent | do not crash if allocation failed (diff) | |
download | core-6ef6dd0122b8e44d8547ec31f40def42173e4e41.tar.gz core-6ef6dd0122b8e44d8547ec31f40def42173e4e41.zip |
Store the length of originally requested array size prior to trimming.
This change adds GetRequestedArrayLength() method to both single and double
vector ref tokens, which returns the length of the requested array size prior
to trimming of the trailing empty cell region.
Change-Id: Iaba96fa2ea4ff3c8bccb0bc86fa4f1525e2f45fb
-rw-r--r-- | formula/source/core/api/vectortoken.cxx | 29 | ||||
-rw-r--r-- | include/formula/vectortoken.hxx | 13 | ||||
-rw-r--r-- | sc/source/core/data/grouptokenconverter.cxx | 12 |
3 files changed, 36 insertions, 18 deletions
diff --git a/formula/source/core/api/vectortoken.cxx b/formula/source/core/api/vectortoken.cxx index 961eda6d60c9..57476f4fb512 100644 --- a/formula/source/core/api/vectortoken.cxx +++ b/formula/source/core/api/vectortoken.cxx @@ -22,15 +22,15 @@ bool VectorRefArray::isValid() const return mpNumericArray || mpStringArray; } -SingleVectorRefToken::SingleVectorRefToken( const double* pArray, size_t nLength ) : - FormulaToken(svSingleVectorRef, ocPush), maArray(pArray), mnArrayLength(nLength) {} +SingleVectorRefToken::SingleVectorRefToken( const double* pArray, size_t nReqLength, size_t nArrayLength ) : + FormulaToken(svSingleVectorRef, ocPush), maArray(pArray), mnRequestedLength(nReqLength), mnArrayLength(nArrayLength) {} -SingleVectorRefToken::SingleVectorRefToken( const VectorRefArray& rArray, size_t nLength ) : - FormulaToken(svSingleVectorRef, ocPush), maArray(rArray), mnArrayLength(nLength) {} +SingleVectorRefToken::SingleVectorRefToken( const VectorRefArray& rArray, size_t nReqLength, size_t nArrayLength ) : + FormulaToken(svSingleVectorRef, ocPush), maArray(rArray), mnRequestedLength(nReqLength), mnArrayLength(nArrayLength) {} FormulaToken* SingleVectorRefToken::Clone() const { - return new SingleVectorRefToken(maArray, mnArrayLength); + return new SingleVectorRefToken(maArray, mnRequestedLength, mnArrayLength); } const VectorRefArray& SingleVectorRefToken::GetArray() const @@ -38,19 +38,27 @@ const VectorRefArray& SingleVectorRefToken::GetArray() const return maArray; } +size_t SingleVectorRefToken::GetRequestedArrayLength() const +{ + return mnRequestedLength; +} + size_t SingleVectorRefToken::GetArrayLength() const { return mnArrayLength; } DoubleVectorRefToken::DoubleVectorRefToken( - const std::vector<VectorRefArray>& rArrays, size_t nArrayLength, size_t nRefRowSize, bool bStartFixed, bool bEndFixed ) : + const std::vector<VectorRefArray>& rArrays, size_t nReqLength, size_t nArrayLength, + size_t nRefRowSize, bool bStartFixed, bool bEndFixed ) : FormulaToken(svDoubleVectorRef, ocPush), - maArrays(rArrays), mnArrayLength(nArrayLength), mnRefRowSize(nRefRowSize), mbStartFixed(bStartFixed), mbEndFixed(bEndFixed) {} + maArrays(rArrays), mnRequestedLength(nReqLength), mnArrayLength(nArrayLength), + mnRefRowSize(nRefRowSize), mbStartFixed(bStartFixed), mbEndFixed(bEndFixed) {} FormulaToken* DoubleVectorRefToken::Clone() const { - return new DoubleVectorRefToken(maArrays, mnArrayLength, mnRefRowSize, mbStartFixed, mbEndFixed); + return new DoubleVectorRefToken( + maArrays, mnRequestedLength, mnArrayLength, mnRefRowSize, mbStartFixed, mbEndFixed); } const std::vector<VectorRefArray>& DoubleVectorRefToken::GetArrays() const @@ -58,6 +66,11 @@ const std::vector<VectorRefArray>& DoubleVectorRefToken::GetArrays() const return maArrays; } +size_t DoubleVectorRefToken::GetRequestedArrayLength() const +{ + return mnRequestedLength; +} + size_t DoubleVectorRefToken::GetArrayLength() const { return mnArrayLength; diff --git a/include/formula/vectortoken.hxx b/include/formula/vectortoken.hxx index f04fef4e1b72..5fa596b57c00 100644 --- a/include/formula/vectortoken.hxx +++ b/include/formula/vectortoken.hxx @@ -52,15 +52,17 @@ struct FORMULA_DLLPUBLIC VectorRefArray class FORMULA_DLLPUBLIC SingleVectorRefToken : public FormulaToken { VectorRefArray maArray; + size_t mnRequestedLength; size_t mnArrayLength; public: - SingleVectorRefToken( const double* pArray, size_t nLength ); - SingleVectorRefToken( const VectorRefArray& rArray, size_t nLength ); + SingleVectorRefToken( const double* pArray, size_t nReqLength, size_t nArrayLength ); + SingleVectorRefToken( const VectorRefArray& rArray, size_t nReqLength, size_t nArrayLength ); virtual FormulaToken* Clone() const; const VectorRefArray& GetArray() const; + size_t GetRequestedArrayLength() const; size_t GetArrayLength() const; }; @@ -72,7 +74,8 @@ class FORMULA_DLLPUBLIC DoubleVectorRefToken : public FormulaToken { std::vector<VectorRefArray> maArrays; - size_t mnArrayLength; /// length of all arrays. + size_t mnRequestedLength; /// requested length of all arrays which include trailing empty region. + size_t mnArrayLength; /// length of all arrays which does not include trailing empty region. size_t mnRefRowSize; /// original reference row size. The row size may /// change as it goes down the array if either the /// stard or end position is fixed. @@ -82,11 +85,13 @@ class FORMULA_DLLPUBLIC DoubleVectorRefToken : public FormulaToken public: DoubleVectorRefToken( - const std::vector<VectorRefArray>& rArrays, size_t nArrayLength, size_t nRefRowSize, bool bStartFixed, bool bEndFixed ); + const std::vector<VectorRefArray>& rArrays, size_t nReqLength, size_t nArrayLength, + size_t nRefRowSize, bool bStartFixed, bool bEndFixed ); virtual FormulaToken* Clone() const; const std::vector<VectorRefArray>& GetArrays() const; + size_t GetRequestedArrayLength() const; size_t GetArrayLength() const; size_t GetRefRowSize() const; bool IsStartFixed() const; diff --git a/sc/source/core/data/grouptokenconverter.cxx b/sc/source/core/data/grouptokenconverter.cxx index b295fee100de..47585fd67619 100644 --- a/sc/source/core/data/grouptokenconverter.cxx +++ b/sc/source/core/data/grouptokenconverter.cxx @@ -110,17 +110,16 @@ bool ScGroupTokenConverter::convert(ScTokenArray& rCode) return false; // Trim data array length to actual data range. - nLen = trimLength(aRefPos.Tab(), aRefPos.Col(), aRefPos.Col(), aRefPos.Row(), nLen); - + SCROW nTrimLen = trimLength(aRefPos.Tab(), aRefPos.Col(), aRefPos.Col(), aRefPos.Row(), nLen); // Fetch double array guarantees that the length of the // returned array equals or greater than the requested // length. formula::VectorRefArray aArray; - if (nLen) - aArray = mrDoc.FetchVectorRefArray(aRefPos, nLen); + if (nTrimLen) + aArray = mrDoc.FetchVectorRefArray(aRefPos, nTrimLen); - formula::SingleVectorRefToken aTok(aArray, nLen); + formula::SingleVectorRefToken aTok(aArray, nLen, nTrimLen); mrGroupTokens.AddToken(aTok); } else @@ -179,6 +178,7 @@ bool ScGroupTokenConverter::convert(ScTokenArray& rCode) } // Trim trailing empty rows. + SCROW nRequestedLength = nArrayLength; // keep the original length. nArrayLength = trimLength(aRefPos.Tab(), aAbs.aStart.Col(), aAbs.aEnd.Col(), aRefPos.Row(), nArrayLength); for (SCCOL i = aAbs.aStart.Col(); i <= aAbs.aEnd.Col(); ++i) @@ -191,7 +191,7 @@ bool ScGroupTokenConverter::convert(ScTokenArray& rCode) aArrays.push_back(aArray); } - formula::DoubleVectorRefToken aTok(aArrays, nArrayLength, nRefRowSize, bAbsFirst, bAbsLast); + formula::DoubleVectorRefToken aTok(aArrays, nRequestedLength, nArrayLength, nRefRowSize, bAbsFirst, bAbsLast); mrGroupTokens.AddToken(aTok); } break; |