/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
class ScInterpreter; struct ScInterpreterContext; class ScMatrixImpl; enumclass FormulaError : sal_uInt16; class ScJumpMatrix;
namespace sc {
struct Compare; struct CompareOptions;
}
/** * Try NOT to use this struct. This struct should go away in a hopefully * not so distant future.
*/ struct ScMatrixValue
{ double fVal;
svl::SharedString aStr;
ScMatValType nType;
/// Only valid if ScMatrix methods indicate so! const svl::SharedString& GetString() const { return aStr; }
/// Only valid if ScMatrix methods indicate that this is no string!
FormulaError GetError() const { return GetDoubleErrorValue(fVal); }
/// Only valid if ScMatrix methods indicate that this is a boolean bool GetBoolean() const { return fVal != 0.0; }
/** * Matrix data type that can store values of mixed types. Each element can * be one of the following types: numeric, string, boolean, empty, and empty * path.
*/ class ScMatrix final
{ friendclass ScMatrixImpl;
mutable size_t nRefCnt; // reference count mutablebool mbCloneIfConst; // Whether the matrix is cloned with a CloneIfConst() call.
std::unique_ptr<ScMatrixImpl> pImpl;
/** * When adding all numerical matrix elements for a scalar result such as * summation, the interpreter wants to separate the first non-zero value * with the rest of the summed values. This is necessary for better * numerical stability, unless we sort all by absolute values before * summing (not really an option) or use another algorithm, e.g. Kahan's * summation algorithm, * https://en.wikipedia.org/wiki/Kahan_summation_algorithm
*/ template<typename tRes> struct IterateResultMultiple
{
std::vector<tRes> maAccumulator;
size_t mnCount;
/** Checks nC or nR for zero and uses GetElementsMax() whether a matrix of the size of nC*nR could be allocated. A zero size (both nC and nR zero) matrix is allowed for later resize.
*/ boolstatic IsSizeAllocatable( SCSIZE nC, SCSIZE nR );
/// Value or boolean. staticbool IsValueType( ScMatValType nType )
{ return nType <= ScMatValType::Boolean;
}
/// String, empty or empty path, but not value nor boolean. staticbool IsNonValueType( ScMatValType nType )
{ returnbool(nType & ScMatValType::NonvalueMask);
}
/** String, but not empty or empty path or any other type. Not named IsStringType to prevent confusion because previously
IsNonValueType was named IsStringType. */ staticbool IsRealStringType( ScMatValType nType )
{ return (nType & ScMatValType::NonvalueMask) == ScMatValType::String;
}
/// Empty, but not empty path or any other type. staticbool IsEmptyType( ScMatValType nType )
{ return (nType & ScMatValType::NonvalueMask) == ScMatValType::Empty;
}
/// Empty path, but not empty or any other type. staticbool IsEmptyPathType( ScMatValType nType )
{ return (nType & ScMatValType::NonvalueMask) == ScMatValType::EmptyPath;
}
/** Clone the matrix. */
ScMatrix* Clone() const;
/** Clone the matrix if mbCloneIfConst (immutable) is set, otherwise
return _this_ matrix, to be assigned to a ScMatrixRef. */
ScMatrix* CloneIfConst();
/** Set the matrix to mutable for CloneIfConst(), only the interpreter
should do this and know the consequences. */ void SetMutable();
/** Set the matrix to immutable for CloneIfConst(), only the interpreter
should do this and know the consequences. */ void SetImmutable() const;
/** * Resize the matrix to specified new dimension.
*/
SC_DLLPUBLIC void Resize(SCSIZE nC, SCSIZE nR);
void Resize(SCSIZE nC, SCSIZE nR, double fVal);
/** Clone the matrix and extend it to the new size. nNewCols and nNewRows
MUST be at least of the size of the original matrix. */
ScMatrix* CloneAndExtend(SCSIZE nNewCols, SCSIZE nNewRows) const;
/** For a row vector or column vector, if the position does not point into the vector but is a valid column or row offset it is adapted such that it points to an element to be replicated, same column row 0 for a row vector, same row column 0 for a column vector. Else, for a 2D matrix, returns false.
*/ bool ValidColRowReplicated( SCSIZE & rC, SCSIZE & rR ) const;
/** Checks if the matrix position is within the matrix. If it is not, for a row vector or column vector the position is adapted such that it points to an element to be replicated, same column row 0 for a row vector, same row column 0 for a column vector. Else, for a 2D matrix and position not within matrix, returns false.
*/ bool ValidColRowOrReplicated( SCSIZE & rC, SCSIZE & rR ) const;
/** Put a column vector of doubles, starting at row nR, must fit into dimensions. */ void PutDoubleVector( const ::std::vector< double > & rVec, SCSIZE nC, SCSIZE nR ) ;
/** Put a column vector of strings, starting at row nR, must fit into dimensions. */ void PutStringVector( const ::std::vector< svl::SharedString > & rVec, SCSIZE nC, SCSIZE nR ) ;
/** Put a column vector of empties, starting at row nR, must fit into dimensions. */ void PutEmptyVector( SCSIZE nCount, SCSIZE nC, SCSIZE nR ) ;
/** Put a column vector of empty results, starting at row nR, must fit into dimensions. */ void PutEmptyResultVector( SCSIZE nCount, SCSIZE nC, SCSIZE nR ) ;
/** Put a column vector of empty paths, starting at row nR, must fit into dimensions. */ void PutEmptyPathVector( SCSIZE nCount, SCSIZE nC, SCSIZE nR ) ;
/** May be used before obtaining the double value of an element to avoid passing its NAN around. @ATTENTION: MUST NOT be used if the element is a string! Use GetErrorIfNotString() instead if not sure.
@returns 0 if no error, else one of err... constants */
FormulaError GetError( SCSIZE nC, SCSIZE nR) const ;
/** Use in ScInterpreter to obtain the error code, if any.
@returns 0 if no error or string element, else one of err... constants */
FormulaError GetErrorIfNotString( SCSIZE nC, SCSIZE nR) const
{ return IsValue( nC, nR) ? GetError( nC, nR) : FormulaError::NONE; }
/// @return 0.0 if empty or empty path, else value or DoubleError. double GetDouble( SCSIZE nC, SCSIZE nR) const ; /// @return 0.0 if empty or empty path, else value or DoubleError. double GetDouble( SCSIZE nIndex) const ; /// @return value or DoubleError or string converted to value. double GetDoubleWithStringConversion( SCSIZE nC, SCSIZE nR ) const ;
/// @return empty string if empty or empty path, else string content.
svl::SharedString GetString( SCSIZE nC, SCSIZE nR) const ; /// @return empty string if empty or empty path, else string content.
svl::SharedString GetString( SCSIZE nIndex) const ;
/** @returns the matrix element's string if one is present, otherwise the numerical value formatted as string, or in case of an error the error string is returned; an empty string for empty, a "FALSE" string for
empty path. */
svl::SharedString GetString( ScInterpreterContext& rContext, SCSIZE nC, SCSIZE nR) const ;
/// @ATTENTION: If bString the ScMatrixValue->pS may still be NULL to indicate /// an empty string!
SC_DLLPUBLIC ScMatrixValue Get( SCSIZE nC, SCSIZE nR) const ;
/** @return <TRUE/> if string or any empty, empty cell, empty result, empty
path, in fact non-value. */ bool IsStringOrEmpty( SCSIZE nIndex ) const ;
/** @return <TRUE/> if string or any empty, empty cell, empty result, empty
path, in fact non-value. */ bool IsStringOrEmpty( SCSIZE nC, SCSIZE nR ) const ;
/// @return <TRUE/> if empty or empty cell or empty result, not empty path. bool IsEmpty( SCSIZE nC, SCSIZE nR ) const ;
/// @return <TRUE/> if empty cell, not empty or empty result or empty path. bool IsEmptyCell( SCSIZE nC, SCSIZE nR ) const ;
/// @return <TRUE/> if empty result, not empty or empty cell or empty path. bool IsEmptyResult( SCSIZE nC, SCSIZE nR ) const ;
/// @return <TRUE/> if empty path, not empty or empty cell or empty result. bool IsEmptyPath( SCSIZE nC, SCSIZE nR ) const ;
/// @return <TRUE/> if value or boolean. bool IsValue( SCSIZE nIndex ) const ;
/// @return <TRUE/> if value or boolean. bool IsValue( SCSIZE nC, SCSIZE nR ) const ;
/// @return <TRUE/> if value or boolean or empty or empty path. bool IsValueOrEmpty( SCSIZE nC, SCSIZE nR ) const ;
/// @return <TRUE/> if boolean. bool IsBoolean( SCSIZE nC, SCSIZE nR ) const ;
/// @return <TRUE/> if entire matrix is numeric, including booleans, with no strings or empties bool IsNumeric() const ;
doubleAnd() const ; // logical AND of all matrix values, or NAN doubleOr() const ; // logical OR of all matrix values, or NAN doubleXor() const ; // logical XOR of all matrix values, or NAN
/** * Convert the content of matrix into a linear array of numeric values. * String elements are mapped to NaN's and empty elements are mapped to * either NaN or zero values. * * @param bEmptyAsZero if true empty elements are mapped to zero values, * otherwise they become NaN values.
*/ void GetDoubleArray( std::vector<double>& rArray, bool bEmptyAsZero = true ) const ; void MergeDoubleArrayMultiply( std::vector<double>& rArray ) const ;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.