1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
25 #include <address.hxx>
28 namespace formula
{ class FormulaToken
; }
30 typedef ::std::vector
< const formula::FormulaToken
*> ScTokenVec
;
32 struct ScJumpMatrixEntry
34 double fBool
; // 0:= false 1:= true also if no-path
35 // other values may contain error conditions like NAN and INF
36 short nStart
; // start of path (actually start-1, see formula::FormulaTokenIterator)
37 short nNext
; // next after path
38 // jump path exists if nStart != nNext, else no path
39 short nStop
; // optional stop of path (nPC < nStop)
41 void SetJump( double fBoolP
, short nStartP
, short nNextP
, short nStopP
)
48 void GetJump( double& rBool
, short& rStart
, short& rNext
, short& rStop
) const
59 std::vector
<ScJumpMatrixEntry
> mvJump
; // the jumps
60 ScMatrixRef pMat
; // the results
61 ScRefList mvRefList
; // array of references result, if any
62 ScTokenVec mvParams
; // parameter stack
72 // Buffer result ranges to be able to set a range of identically typed
73 // values at the result matrix in order to avoid multiple shrinks and
74 // growths of multi_type_vector segments, which is a major performance
75 // bottleneck, see fdo#72929
76 ::std::vector
< svl::SharedString
> mvBufferStrings
;
77 ::std::vector
< double > mvBufferDoubles
;
79 SCSIZE mnBufferRowStart
;
80 SCSIZE mnBufferEmptyCount
;
81 SCSIZE mnBufferEmptyPathCount
;
92 /** Flush different types or non-consecutive buffers. */
93 void FlushBufferOtherThan( BufferType eType
, SCSIZE nC
, SCSIZE nR
);
95 ScJumpMatrix( const ScJumpMatrix
& ) = delete;
96 ScJumpMatrix
& operator=( const ScJumpMatrix
& ) = delete;
99 ScJumpMatrix( OpCode eOp
, SCSIZE nColsP
, SCSIZE nRowsP
);
101 void GetDimensions( SCSIZE
& rCols
, SCSIZE
& rRows
) const;
102 void SetJump( SCSIZE nCol
, SCSIZE nRow
, double fBool
, short nStart
, short nNext
);
103 void GetJump( SCSIZE nCol
, SCSIZE nRow
, double& rBool
, short& rStart
, short& rNext
, short& rStop
) const;
104 void SetAllJumps( double fBool
, short nStart
, short nNext
, short nStop
= SHRT_MAX
);
105 void SetJumpParameters( ScTokenVec
&& p
);
106 const ScTokenVec
& GetJumpParameters() const { return mvParams
;}
107 bool HasResultMatrix() const;
108 ScMatrix
* GetResultMatrix(); ///< also applies pending buffered values
109 void GetPos( SCSIZE
& rCol
, SCSIZE
& rRow
) const;
110 bool Next( SCSIZE
& rCol
, SCSIZE
& rRow
);
111 void GetResMatDimensions( SCSIZE
& rCols
, SCSIZE
& rRows
);
112 void SetNewResMat( SCSIZE nNewCols
, SCSIZE nNewRows
);
113 ScRefList
& GetRefList();
114 OpCode
GetOpCode() const { return meOp
; }
116 void PutResultDouble( double fVal
, SCSIZE nC
, SCSIZE nR
);
117 void PutResultString( const svl::SharedString
& rStr
, SCSIZE nC
, SCSIZE nR
);
118 void PutResultEmpty( SCSIZE nC
, SCSIZE nR
);
119 void PutResultEmptyPath( SCSIZE nC
, SCSIZE nR
);
122 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */