Kaydet (Commit) 1ba2028a authored tarafından Stephan Bergmann's avatar Stephan Bergmann

Move FormulaToken::TextEqual overrides down into specific subclasses

Change-Id: I5f27054ef2f9fdc4d0be0afe91ad31d053976bcf
üst a6b01d01
......@@ -57,6 +57,8 @@ protected:
ScToken( formula::StackVar eTypeP,OpCode e = ocPush ) : formula::FormulaToken(eTypeP,e) {}
ScToken( const ScToken& r ): formula::FormulaToken(r) {}
bool checkTextEqual( const formula::FormulaToken& rToken ) const;
public:
virtual ~ScToken();
......@@ -88,8 +90,6 @@ public:
virtual const ScRefList* GetRefList() const;
virtual ScRefList* GetRefList();
virtual bool TextEqual( const formula::FormulaToken& rToken ) const SAL_OVERRIDE;
#if DEBUG_FORMULA_COMPILER
virtual void Dump() const;
#endif
......@@ -130,6 +130,7 @@ public:
ScToken( r ), aSingleRef( r.aSingleRef ) {}
virtual const ScSingleRefData& GetSingleRef() const SAL_OVERRIDE;
virtual ScSingleRefData& GetSingleRef() SAL_OVERRIDE;
virtual bool TextEqual( const formula::FormulaToken& rToken ) const SAL_OVERRIDE;
virtual bool operator==( const formula::FormulaToken& rToken ) const SAL_OVERRIDE;
virtual FormulaToken* Clone() const SAL_OVERRIDE { return new ScSingleRefToken(*this); }
......@@ -160,6 +161,7 @@ public:
virtual ScComplexRefData& GetDoubleRef() SAL_OVERRIDE;
virtual const ScSingleRefData& GetSingleRef2() const SAL_OVERRIDE;
virtual ScSingleRefData& GetSingleRef2() SAL_OVERRIDE;
virtual bool TextEqual( const formula::FormulaToken& rToken ) const SAL_OVERRIDE;
virtual bool operator==( const formula::FormulaToken& rToken ) const SAL_OVERRIDE;
virtual FormulaToken* Clone() const SAL_OVERRIDE { return new ScDoubleRefToken(*this); }
......
......@@ -471,43 +471,39 @@ ScToken::~ScToken()
}
// TextEqual: if same formula entered (for optimization in sort)
bool ScToken::TextEqual( const FormulaToken& _rToken ) const
bool ScToken::checkTextEqual( const FormulaToken& _rToken ) const
{
if ( eType == svSingleRef || eType == svDoubleRef )
{
// in relative Refs only compare relative parts
if ( eType != _rToken.GetType() || GetOpCode() != _rToken.GetOpCode() )
return false;
const ScToken& rToken = static_cast<const ScToken&>(_rToken);
ScComplexRefData aTemp1;
if ( eType == svSingleRef )
{
aTemp1.Ref1 = GetSingleRef();
aTemp1.Ref2 = aTemp1.Ref1;
}
else
aTemp1 = GetDoubleRef();
assert(
(eType == svSingleRef || eType == svDoubleRef)
&& FormulaToken::operator ==(_rToken));
ScComplexRefData aTemp2;
if ( rToken.eType == svSingleRef )
{
aTemp2.Ref1 = rToken.GetSingleRef();
aTemp2.Ref2 = aTemp2.Ref1;
}
else
aTemp2 = rToken.GetDoubleRef();
// in relative Refs only compare relative parts
ScAddress aPos;
ScRange aRange1 = aTemp1.toAbs(aPos), aRange2 = aTemp2.toAbs(aPos);
const ScToken& rToken = static_cast<const ScToken&>(_rToken);
ScComplexRefData aTemp1;
if ( eType == svSingleRef )
{
aTemp1.Ref1 = GetSingleRef();
aTemp1.Ref2 = aTemp1.Ref1;
}
else
aTemp1 = GetDoubleRef();
// memcmp doesn't work because of the alignment byte after bFlags.
// After SmartRelAbs only absolute parts have to be compared.
return aRange1 == aRange2 && aTemp1.Ref1.FlagValue() == aTemp2.Ref1.FlagValue() && aTemp1.Ref2.FlagValue() == aTemp2.Ref2.FlagValue();
ScComplexRefData aTemp2;
if ( rToken.eType == svSingleRef )
{
aTemp2.Ref1 = rToken.GetSingleRef();
aTemp2.Ref2 = aTemp2.Ref1;
}
else
return *this == _rToken; // else normal operator==
aTemp2 = rToken.GetDoubleRef();
ScAddress aPos;
ScRange aRange1 = aTemp1.toAbs(aPos), aRange2 = aTemp2.toAbs(aPos);
// memcmp doesn't work because of the alignment byte after bFlags.
// After SmartRelAbs only absolute parts have to be compared.
return aRange1 == aRange2 && aTemp1.Ref1.FlagValue() == aTemp2.Ref1.FlagValue() && aTemp1.Ref2.FlagValue() == aTemp2.Ref2.FlagValue();
}
#if DEBUG_FORMULA_COMPILER
......@@ -719,6 +715,10 @@ ScRefList* ScToken::GetRefList()
const ScSingleRefData& ScSingleRefToken::GetSingleRef() const { return aSingleRef; }
ScSingleRefData& ScSingleRefToken::GetSingleRef() { return aSingleRef; }
bool ScSingleRefToken::TextEqual( const FormulaToken& _rToken ) const
{
return FormulaToken::operator ==(_rToken) && checkTextEqual(_rToken);
}
bool ScSingleRefToken::operator==( const FormulaToken& r ) const
{
return FormulaToken::operator==( r ) && aSingleRef == static_cast<const ScToken&>(r).GetSingleRef();
......@@ -738,6 +738,10 @@ const ScComplexRefData& ScDoubleRefToken::GetDoubleRef() const { return aDo
ScComplexRefData& ScDoubleRefToken::GetDoubleRef() { return aDoubleRef; }
const ScSingleRefData& ScDoubleRefToken::GetSingleRef2() const { return aDoubleRef.Ref2; }
ScSingleRefData& ScDoubleRefToken::GetSingleRef2() { return aDoubleRef.Ref2; }
bool ScDoubleRefToken::TextEqual( const FormulaToken& _rToken ) const
{
return FormulaToken::operator ==(_rToken) && checkTextEqual(_rToken);
}
bool ScDoubleRefToken::operator==( const FormulaToken& r ) const
{
return FormulaToken::operator==( r ) && aDoubleRef == static_cast<const ScToken&>(r).GetDoubleRef();
......
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