Kaydet (Commit) 1cf44947 authored tarafından Eike Rathke's avatar Eike Rathke

Hold ParamClass at FormulaByteToken instead of bool, tdf#107724 prep

* change IsInForceArray() to GetInForceArray()
* add IsInForceArray() to keep previous functionality

Change-Id: I64c891486e548a66539646846a4691a213c783ac
üst 47023116
...@@ -2552,18 +2552,18 @@ void FormulaCompiler::ForceArrayOperator( FormulaTokenRef& rCurr ) ...@@ -2552,18 +2552,18 @@ void FormulaCompiler::ForceArrayOperator( FormulaTokenRef& rCurr )
if (!(rCurr->GetOpCode() != ocPush && (rCurr->GetType() == svByte || rCurr->GetType() == svJump))) if (!(rCurr->GetOpCode() != ocPush && (rCurr->GetType() == svByte || rCurr->GetType() == svJump)))
return; return;
if (pCurrentFactorToken->IsInForceArray()) formula::ParamClass eType = pCurrentFactorToken->GetInForceArray();
if (eType == formula::ParamClass::ForceArray || eType == formula::ParamClass::ReferenceOrForceArray)
{ {
rCurr->SetInForceArray( true); rCurr->SetInForceArray( eType);
return; return;
} }
if (nCurrentFactorParam > 0) if (nCurrentFactorParam > 0)
{ {
formula::ParamClass eType = GetForceArrayParameter( pCurrentFactorToken.get(), eType = GetForceArrayParameter( pCurrentFactorToken.get(), static_cast<sal_uInt8>(nCurrentFactorParam - 1));
static_cast<sal_uInt8>(nCurrentFactorParam - 1));
if (eType == ParamClass::ForceArray || eType == ParamClass::ReferenceOrForceArray) if (eType == ParamClass::ForceArray || eType == ParamClass::ReferenceOrForceArray)
rCurr->SetInForceArray( true); rCurr->SetInForceArray( eType);
} }
} }
......
...@@ -158,6 +158,12 @@ bool FormulaToken::IsRef() const ...@@ -158,6 +158,12 @@ bool FormulaToken::IsRef() const
return false; return false;
} }
bool FormulaToken::IsInForceArray() const
{
ParamClass eParam = GetInForceArray();
return eParam == ParamClass::ForceArray || eParam == ParamClass::ReferenceOrForceArray;
}
bool FormulaToken::operator==( const FormulaToken& rToken ) const bool FormulaToken::operator==( const FormulaToken& rToken ) const
{ {
// don't compare reference count! // don't compare reference count!
...@@ -178,13 +184,13 @@ void FormulaToken::SetByte( sal_uInt8 ) ...@@ -178,13 +184,13 @@ void FormulaToken::SetByte( sal_uInt8 )
SAL_WARN( "formula.core", "FormulaToken::SetByte: virtual dummy called" ); SAL_WARN( "formula.core", "FormulaToken::SetByte: virtual dummy called" );
} }
bool FormulaToken::IsInForceArray() const ParamClass FormulaToken::GetInForceArray() const
{ {
// ok to be called for any derived class // ok to be called for any derived class
return false; return ParamClass::Unknown;
} }
void FormulaToken::SetInForceArray( bool ) void FormulaToken::SetInForceArray( ParamClass )
{ {
SAL_WARN( "formula.core", "FormulaToken::SetInForceArray: virtual dummy called" ); SAL_WARN( "formula.core", "FormulaToken::SetInForceArray: virtual dummy called" );
} }
...@@ -348,12 +354,12 @@ bool FormulaToken::TextEqual( const FormulaToken& rToken ) const ...@@ -348,12 +354,12 @@ bool FormulaToken::TextEqual( const FormulaToken& rToken ) const
sal_uInt8 FormulaByteToken::GetByte() const { return nByte; } sal_uInt8 FormulaByteToken::GetByte() const { return nByte; }
void FormulaByteToken::SetByte( sal_uInt8 n ) { nByte = n; } void FormulaByteToken::SetByte( sal_uInt8 n ) { nByte = n; }
bool FormulaByteToken::IsInForceArray() const { return bIsInForceArray; } ParamClass FormulaByteToken::GetInForceArray() const { return eInForceArray; }
void FormulaByteToken::SetInForceArray( bool b ) { bIsInForceArray = b; } void FormulaByteToken::SetInForceArray( ParamClass c ) { eInForceArray = c; }
bool FormulaByteToken::operator==( const FormulaToken& r ) const bool FormulaByteToken::operator==( const FormulaToken& r ) const
{ {
return FormulaToken::operator==( r ) && nByte == r.GetByte() && return FormulaToken::operator==( r ) && nByte == r.GetByte() &&
bIsInForceArray == r.IsInForceArray(); eInForceArray == r.GetInForceArray();
} }
...@@ -364,14 +370,14 @@ bool FormulaFAPToken::operator==( const FormulaToken& r ) const ...@@ -364,14 +370,14 @@ bool FormulaFAPToken::operator==( const FormulaToken& r ) const
} }
short* FormulaJumpToken::GetJump() const { return pJump.get(); } short* FormulaJumpToken::GetJump() const { return pJump.get(); }
bool FormulaJumpToken::IsInForceArray() const { return bIsInForceArray; } ParamClass FormulaJumpToken::GetInForceArray() const { return eInForceArray; }
void FormulaJumpToken::SetInForceArray( bool b ) { bIsInForceArray = b; } void FormulaJumpToken::SetInForceArray( ParamClass c ) { eInForceArray = c; }
bool FormulaJumpToken::operator==( const FormulaToken& r ) const bool FormulaJumpToken::operator==( const FormulaToken& r ) const
{ {
return FormulaToken::operator==( r ) && pJump[0] == r.GetJump()[0] && return FormulaToken::operator==( r ) && pJump[0] == r.GetJump()[0] &&
memcmp( pJump.get()+1, r.GetJump()+1, pJump[0] * sizeof(short) ) == 0 && memcmp( pJump.get()+1, r.GetJump()+1, pJump[0] * sizeof(short) ) == 0 &&
bIsInForceArray == r.IsInForceArray(); eInForceArray == r.GetInForceArray();
} }
FormulaJumpToken::~FormulaJumpToken() FormulaJumpToken::~FormulaJumpToken()
{ {
...@@ -1620,7 +1626,7 @@ FormulaToken* FormulaTokenArray::AddOpCode( OpCode eOp ) ...@@ -1620,7 +1626,7 @@ FormulaToken* FormulaTokenArray::AddOpCode( OpCode eOp )
} }
break; break;
default: default:
pRet = new FormulaByteToken( eOp, 0, false ); pRet = new FormulaByteToken( eOp, 0, ParamClass::Unknown );
break; break;
} }
return Add( pRet ); return Add( pRet );
...@@ -1797,7 +1803,7 @@ bool FormulaStringToken::operator==( const FormulaToken& r ) const ...@@ -1797,7 +1803,7 @@ bool FormulaStringToken::operator==( const FormulaToken& r ) const
} }
FormulaStringOpToken::FormulaStringOpToken( OpCode e, const svl::SharedString& r ) : FormulaStringOpToken::FormulaStringOpToken( OpCode e, const svl::SharedString& r ) :
FormulaByteToken( e, 0, svString, false ), maString( r ) {} FormulaByteToken( e, 0, svString, ParamClass::Unknown ), maString( r ) {}
FormulaStringOpToken::FormulaStringOpToken( const FormulaStringOpToken& r ) : FormulaStringOpToken::FormulaStringOpToken( const FormulaStringOpToken& r ) :
FormulaByteToken( r ), maString( r.maString ) {} FormulaByteToken( r ), maString( r.maString ) {}
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include <formula/IFunctionDescription.hxx> #include <formula/IFunctionDescription.hxx>
#include <formula/opcode.hxx> #include <formula/opcode.hxx>
#include <formula/types.hxx> #include <formula/types.hxx>
#include <formula/paramclass.hxx>
#include <osl/interlck.h> #include <osl/interlck.h>
#include <rtl/ustring.hxx> #include <rtl/ustring.hxx>
#include <sal/types.h> #include <sal/types.h>
...@@ -156,6 +157,8 @@ public: ...@@ -156,6 +157,8 @@ public:
oslInterlockedCount GetRef() const { return mnRefCnt; } oslInterlockedCount GetRef() const { return mnRefCnt; }
OpCode GetOpCode() const { return eOp; } OpCode GetOpCode() const { return eOp; }
bool IsInForceArray() const;
/** /**
Dummy methods to avoid switches and casts where possible, Dummy methods to avoid switches and casts where possible,
the real token classes have to override the appropriate method[s]. the real token classes have to override the appropriate method[s].
...@@ -165,16 +168,16 @@ public: ...@@ -165,16 +168,16 @@ public:
which of course is 0 on non-functions. FormulaByteToken and ScExternal do which of course is 0 on non-functions. FormulaByteToken and ScExternal do
override it. override it.
- IsInForceArray() since also this is only used for operators and - GetInForceArray() since also this is only used for operators and
functions and is false for other tokens. functions and is ParamClass::Unknown for other tokens.
Any other non-overridden method pops up an assertion. Any other non-overridden method pops up an assertion.
*/ */
virtual sal_uInt8 GetByte() const; virtual sal_uInt8 GetByte() const;
virtual void SetByte( sal_uInt8 n ); virtual void SetByte( sal_uInt8 n );
virtual bool IsInForceArray() const; virtual ParamClass GetInForceArray() const;
virtual void SetInForceArray( bool b ); virtual void SetInForceArray( ParamClass c );
virtual double GetDouble() const; virtual double GetDouble() const;
virtual double& GetDoubleAsReference(); virtual double& GetDoubleAsReference();
virtual short GetDoubleType() const; virtual short GetDoubleType() const;
...@@ -236,30 +239,30 @@ class FORMULA_DLLPUBLIC FormulaByteToken : public FormulaToken ...@@ -236,30 +239,30 @@ class FORMULA_DLLPUBLIC FormulaByteToken : public FormulaToken
{ {
private: private:
sal_uInt8 nByte; sal_uInt8 nByte;
bool bIsInForceArray; ParamClass eInForceArray;
protected: protected:
FormulaByteToken( OpCode e, sal_uInt8 n, StackVar v, bool b ) : FormulaByteToken( OpCode e, sal_uInt8 n, StackVar v, ParamClass c ) :
FormulaToken( v,e ), nByte( n ), FormulaToken( v,e ), nByte( n ),
bIsInForceArray( b ) {} eInForceArray( c ) {}
public: public:
FormulaByteToken( OpCode e, sal_uInt8 n, bool b ) : FormulaByteToken( OpCode e, sal_uInt8 n, ParamClass c ) :
FormulaToken( svByte,e ), nByte( n ), FormulaToken( svByte,e ), nByte( n ),
bIsInForceArray( b ) {} eInForceArray( c ) {}
FormulaByteToken( OpCode e, sal_uInt8 n ) : FormulaByteToken( OpCode e, sal_uInt8 n ) :
FormulaToken( svByte,e ), nByte( n ), FormulaToken( svByte,e ), nByte( n ),
bIsInForceArray( false ) {} eInForceArray( ParamClass::Unknown ) {}
FormulaByteToken( OpCode e ) : FormulaByteToken( OpCode e ) :
FormulaToken( svByte,e ), nByte( 0 ), FormulaToken( svByte,e ), nByte( 0 ),
bIsInForceArray( false ) {} eInForceArray( ParamClass::Unknown ) {}
FormulaByteToken( const FormulaByteToken& r ) : FormulaByteToken( const FormulaByteToken& r ) :
FormulaToken( r ), nByte( r.nByte ), FormulaToken( r ), nByte( r.nByte ),
bIsInForceArray( r.bIsInForceArray ) {} eInForceArray( r.eInForceArray ) {}
virtual FormulaToken* Clone() const override { return new FormulaByteToken(*this); } virtual FormulaToken* Clone() const override { return new FormulaByteToken(*this); }
virtual sal_uInt8 GetByte() const override; virtual sal_uInt8 GetByte() const override;
virtual void SetByte( sal_uInt8 n ) override; virtual void SetByte( sal_uInt8 n ) override;
virtual bool IsInForceArray() const override; virtual ParamClass GetInForceArray() const override;
virtual void SetInForceArray( bool b ) override; virtual void SetInForceArray( ParamClass c ) override;
virtual bool operator==( const FormulaToken& rToken ) const override; virtual bool operator==( const FormulaToken& rToken ) const override;
DECL_FIXEDMEMPOOL_NEWDEL_DLL( FormulaByteToken ) DECL_FIXEDMEMPOOL_NEWDEL_DLL( FormulaByteToken )
...@@ -274,7 +277,7 @@ private: ...@@ -274,7 +277,7 @@ private:
FormulaTokenRef pOrigToken; FormulaTokenRef pOrigToken;
public: public:
FormulaFAPToken( OpCode e, sal_uInt8 n, FormulaToken* p ) : FormulaFAPToken( OpCode e, sal_uInt8 n, FormulaToken* p ) :
FormulaByteToken( e, n, svFAP, false ), FormulaByteToken( e, n, svFAP, ParamClass::Unknown ),
pOrigToken( p ) {} pOrigToken( p ) {}
FormulaFAPToken( const FormulaFAPToken& r ) : FormulaFAPToken( const FormulaFAPToken& r ) :
FormulaByteToken( r ), pOrigToken( r.pOrigToken ) {} FormulaByteToken( r ), pOrigToken( r.pOrigToken ) {}
...@@ -418,18 +421,18 @@ class FORMULA_DLLPUBLIC FormulaJumpToken : public FormulaToken ...@@ -418,18 +421,18 @@ class FORMULA_DLLPUBLIC FormulaJumpToken : public FormulaToken
private: private:
std::unique_ptr<short[]> std::unique_ptr<short[]>
pJump; pJump;
bool bIsInForceArray; ParamClass eInForceArray;
public: public:
FormulaJumpToken( OpCode e, short* p ) : FormulaJumpToken( OpCode e, short* p ) :
FormulaToken( formula::svJump , e), FormulaToken( formula::svJump , e),
bIsInForceArray( false) eInForceArray( ParamClass::Unknown)
{ {
pJump.reset( new short[ p[0] + 1 ] ); pJump.reset( new short[ p[0] + 1 ] );
memcpy( pJump.get(), p, (p[0] + 1) * sizeof(short) ); memcpy( pJump.get(), p, (p[0] + 1) * sizeof(short) );
} }
FormulaJumpToken( const FormulaJumpToken& r ) : FormulaJumpToken( const FormulaJumpToken& r ) :
FormulaToken( r ), FormulaToken( r ),
bIsInForceArray( r.bIsInForceArray) eInForceArray( r.eInForceArray)
{ {
pJump.reset( new short[ r.pJump[0] + 1 ] ); pJump.reset( new short[ r.pJump[0] + 1 ] );
memcpy( pJump.get(), r.pJump.get(), (r.pJump[0] + 1) * sizeof(short) ); memcpy( pJump.get(), r.pJump.get(), (r.pJump[0] + 1) * sizeof(short) );
...@@ -438,8 +441,8 @@ public: ...@@ -438,8 +441,8 @@ public:
virtual short* GetJump() const override; virtual short* GetJump() const override;
virtual bool operator==( const formula::FormulaToken& rToken ) const override; virtual bool operator==( const formula::FormulaToken& rToken ) const override;
virtual FormulaToken* Clone() const override { return new FormulaJumpToken(*this); } virtual FormulaToken* Clone() const override { return new FormulaJumpToken(*this); }
virtual bool IsInForceArray() const override; virtual ParamClass GetInForceArray() const override;
virtual void SetInForceArray( bool b ) override; virtual void SetInForceArray( ParamClass c ) override;
}; };
......
...@@ -104,8 +104,8 @@ public: ...@@ -104,8 +104,8 @@ public:
union { union {
double nValue; double nValue;
struct { struct {
sal_uInt8 cByte; sal_uInt8 cByte;
bool bIsInForceArray; formula::ParamClass eInForceArray;
} sbyte; } sbyte;
ScComplexRefData aRef; ScComplexRefData aRef;
struct { struct {
......
...@@ -259,7 +259,7 @@ void ScRawToken::SetOpCode( OpCode e ) ...@@ -259,7 +259,7 @@ void ScRawToken::SetOpCode( OpCode e )
default: default:
eType = svByte; eType = svByte;
sbyte.cByte = 0; sbyte.cByte = 0;
sbyte.bIsInForceArray = false; sbyte.eInForceArray = ParamClass::Unknown;
} }
} }
...@@ -388,7 +388,7 @@ FormulaToken* ScRawToken::CreateToken() const ...@@ -388,7 +388,7 @@ FormulaToken* ScRawToken::CreateToken() const
switch ( GetType() ) switch ( GetType() )
{ {
case svByte : case svByte :
return new FormulaByteToken( eOp, sbyte.cByte, sbyte.bIsInForceArray ); return new FormulaByteToken( eOp, sbyte.cByte, sbyte.eInForceArray );
case svDouble : case svDouble :
IF_NOT_OPCODE_ERROR( ocPush, FormulaDoubleToken); IF_NOT_OPCODE_ERROR( ocPush, FormulaDoubleToken);
return new FormulaDoubleToken( nValue ); return new FormulaDoubleToken( nValue );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment