summaryrefslogtreecommitdiff
path: root/sc/source/core/inc/jumpmatrix.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/source/core/inc/jumpmatrix.hxx')
-rw-r--r--sc/source/core/inc/jumpmatrix.hxx222
1 files changed, 222 insertions, 0 deletions
diff --git a/sc/source/core/inc/jumpmatrix.hxx b/sc/source/core/inc/jumpmatrix.hxx
new file mode 100644
index 000000000000..8089d6653730
--- /dev/null
+++ b/sc/source/core/inc/jumpmatrix.hxx
@@ -0,0 +1,222 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef SC_JUMPMATRIX_HXX
+#define SC_JUMPMATRIX_HXX
+
+#include "formula/token.hxx"
+#include "formula/errorcodes.hxx"
+#include <tools/solar.h>
+#include <vector>
+#include "scmatrix.hxx"
+
+typedef ::std::vector< formula::FormulaToken*> ScTokenVec;
+
+struct ScJumpMatrixEntry
+{
+ double fBool; // 0:= false 1:= true also if no-path
+ // other values may contain error conditions like NAN and INF
+ short nStart; // start of path (actually start-1, see formula::FormulaTokenIterator)
+ short nNext; // next after path
+ // jump path exists if nStart != nNext, else no path
+ short nStop; // optional stop of path (nPC < nStop)
+
+ void SetJump( double fBoolP, short nStartP, short nNextP, short nStopP )
+ {
+ fBool = fBoolP;
+ nStart = nStartP;
+ nNext = nNextP;
+ nStop = nStopP;
+ }
+ void GetJump( double& rBool, short& rStart, short& rNext, short& rStop )
+ {
+ rBool = fBool;
+ rStart = nStart;
+ rNext = nNext;
+ rStop = nStop;
+ }
+};
+
+class ScJumpMatrix
+{
+ ScJumpMatrixEntry* pJump; // the jumps
+ ScMatrixRef pMat; // the results
+ ScTokenVec* pParams; // parameter stack
+ SCSIZE nCols;
+ SCSIZE nRows;
+ SCSIZE nCurCol;
+ SCSIZE nCurRow;
+ SCSIZE nResMatCols;
+ SCSIZE nResMatRows;
+ bool bStarted;
+
+ // not implemented, prevent usage
+ ScJumpMatrix( const ScJumpMatrix& );
+ ScJumpMatrix& operator=( const ScJumpMatrix& );
+
+public:
+ ScJumpMatrix( SCSIZE nColsP, SCSIZE nRowsP )
+ : pJump( new ScJumpMatrixEntry[ nColsP * nRowsP ] )
+ , pMat( new ScMatrix( nColsP, nRowsP) )
+ , pParams( NULL )
+ , nCols( nColsP )
+ , nRows( nRowsP )
+ , nCurCol( 0 )
+ , nCurRow( 0 )
+ , nResMatCols( nColsP )
+ , nResMatRows( nRowsP )
+ , bStarted( false )
+ {
+ // Initialize result matrix in case of
+ // a premature end of the interpreter
+ // due to errors.
+ pMat->FillDouble( CreateDoubleError(
+ NOTAVAILABLE), 0, 0, nCols-1,
+ nRows-1);
+ /*! pJump not initialized */
+ }
+ ~ScJumpMatrix()
+ {
+ if ( pParams )
+ {
+ for ( ScTokenVec::iterator i =
+ pParams->begin(); i !=
+ pParams->end(); ++i )
+ {
+ (*i)->DecRef();
+ }
+ delete pParams;
+ }
+ delete [] pJump;
+ }
+ void GetDimensions( SCSIZE& rCols, SCSIZE& rRows ) const
+ {
+ rCols = nCols;
+ rRows = nRows;
+ }
+ void SetJump( SCSIZE nCol, SCSIZE nRow, double fBool,
+ short nStart, short nNext,
+ short nStop = SHRT_MAX )
+ {
+ pJump[ (ULONG)nCol * nRows + nRow ].
+ SetJump( fBool, nStart, nNext, nStop);
+ }
+ void GetJump( SCSIZE nCol, SCSIZE nRow, double& rBool,
+ short& rStart, short& rNext,
+ short& rStop ) const
+ {
+ if (nCols == 1 && nRows == 1)
+ {
+ nCol = 0;
+ nRow = 0;
+ }
+ else if (nCols == 1 && nRow < nRows)
+ nCol = 0;
+ else if (nRows == 1 && nCol < nCols)
+ nRow = 0;
+ else if (nCols <= nCol || nRows <= nRow)
+ {
+ DBG_ERROR("ScJumpMatrix::GetJump: dimension error");
+ nCol = 0;
+ nRow = 0;
+ }
+ pJump[ (ULONG)nCol * nRows + nRow ].
+ GetJump( rBool, rStart, rNext, rStop);
+ }
+ void SetAllJumps( double fBool,
+ short nStart, short nNext,
+ short nStop = SHRT_MAX )
+ {
+ ULONG n = (ULONG)nCols * nRows;
+ for ( ULONG j=0; j<n; ++j )
+ {
+ pJump[ j ].SetJump( fBool, nStart,
+ nNext, nStop);
+ }
+ }
+ void SetJumpParameters( ScTokenVec* p )
+ { pParams = p; }
+ const ScTokenVec* GetJumpParameters() const { return pParams; }
+ ScMatrix* GetResultMatrix() const { return pMat; }
+ void GetPos( SCSIZE& rCol, SCSIZE& rRow ) const
+ {
+ rCol = nCurCol;
+ rRow = nCurRow;
+ }
+ bool Next( SCSIZE& rCol, SCSIZE& rRow )
+ {
+ if ( !bStarted )
+ {
+ bStarted = true;
+ nCurCol = nCurRow = 0;
+ }
+ else
+ {
+ if ( ++nCurRow >= nResMatRows )
+ {
+ nCurRow = 0;
+ ++nCurCol;
+ }
+ }
+ GetPos( rCol, rRow );
+ return nCurCol < nResMatCols;
+ }
+ void GetResMatDimensions( SCSIZE& rCols, SCSIZE& rRows )
+ {
+ rCols = nResMatCols;
+ rRows = nResMatRows;
+ }
+ void SetNewResMat( SCSIZE nNewCols, SCSIZE nNewRows )
+ {
+ if ( nNewCols > nResMatCols || nNewRows > nResMatRows )
+ {
+ pMat = pMat->CloneAndExtend( nNewCols, nNewRows );
+ if ( nResMatCols < nNewCols )
+ {
+ pMat->FillDouble( CreateDoubleError(
+ NOTAVAILABLE), nResMatCols, 0, nNewCols-1,
+ nResMatRows-1);
+ }
+ if ( nResMatRows < nNewRows )
+ {
+ pMat->FillDouble( CreateDoubleError(
+ NOTAVAILABLE), 0, nResMatRows, nNewCols-1,
+ nNewRows-1);
+ }
+ if ( nRows == 1 && nCurCol != 0 )
+ {
+ nCurCol = 0;
+ nCurRow = nResMatRows - 1;
+ }
+ nResMatCols = nNewCols;
+ nResMatRows = nNewRows;
+ }
+ }
+};
+
+#endif // SC_JUMPMATRIX_HXX
+