[Libreoffice-commits] core.git: editeng/source include/editeng include/svl sc/source svl/source
Eike Rathke
erack at redhat.com
Thu Jul 27 15:49:40 UTC 2017
editeng/source/editeng/editobj.cxx | 18 ++++++++++++++----
editeng/source/editeng/editobj2.hxx | 3 ++-
include/editeng/editobj.hxx | 7 +++++++
include/svl/itemset.hxx | 14 ++++++++++++++
sc/source/core/data/global.cxx | 19 +------------------
svl/source/items/itemset.cxx | 12 ++++++++++--
6 files changed, 48 insertions(+), 25 deletions(-)
New commits:
commit 238de04de6c8b67f74c75514b86c08bf888feb48
Author: Eike Rathke <erack at redhat.com>
Date: Thu Jul 27 16:58:59 2017 +0200
Ditch use of EditTextObject::Store() in ScGlobal::EETextObjEqual()
This was the last incarnation of SfxItem binary stream serialization that is to
be eliminated after clipboard use is gone.
The "full" EditTextObject::operator==() in EditTextObjectImpl::operator==(),
and via ContentInfo::operator==() in SfxItemSet::operator==(), also compare the
SfxItemPool pointers which gets in the way here (not stored to stream hence
didn't matter and maybe the reason for not having switched EETextObjEqual() to
use operator==() back in the days).
Introduce *::Equals() functions that do not compare pool pointers and let
SfxItemSet::Equals() in that case not assume it would be operating on one pool
only.
Change-Id: Ifff939a92101c7f74695b676a45a7fdbb4f1d7f6
Reviewed-on: https://gerrit.libreoffice.org/40492
Reviewed-by: Eike Rathke <erack at redhat.com>
Tested-by: Jenkins <ci at libreoffice.org>
diff --git a/editeng/source/editeng/editobj.cxx b/editeng/source/editeng/editobj.cxx
index 3a7036b05fb8..c3ac63cd6d61 100644
--- a/editeng/source/editeng/editobj.cxx
+++ b/editeng/source/editeng/editobj.cxx
@@ -225,13 +225,13 @@ void ContentInfo::Dump() const
}
#endif
-bool ContentInfo::operator==( const ContentInfo& rCompare ) const
+bool ContentInfo::Equals( const ContentInfo& rCompare, bool bComparePool ) const
{
if( (maText == rCompare.maText) &&
(aStyle == rCompare.aStyle ) &&
(maCharAttribs.size() == rCompare.maCharAttribs.size()) &&
(eFamily == rCompare.eFamily ) &&
- (aParaAttribs == rCompare.aParaAttribs ) )
+ aParaAttribs.Equals( rCompare.aParaAttribs, bComparePool ) )
{
for (size_t i = 0, n = maCharAttribs.size(); i < n; ++i)
{
@@ -455,6 +455,11 @@ bool EditTextObject::operator==( const EditTextObject& rCompare ) const
return mpImpl->operator==(*rCompare.mpImpl);
}
+bool EditTextObject::Equals( const EditTextObject& rCompare, bool bComparePool ) const
+{
+ return mpImpl->Equals(*rCompare.mpImpl, bComparePool);
+}
+
// #i102062#
bool EditTextObject::isWrongListEqual(const EditTextObject& rCompare) const
{
@@ -1612,11 +1617,16 @@ void EditTextObjectImpl::CreateData( SvStream& rIStream )
bool EditTextObjectImpl::operator==( const EditTextObjectImpl& rCompare ) const
{
+ return Equals( rCompare, true);
+}
+
+bool EditTextObjectImpl::Equals( const EditTextObjectImpl& rCompare, bool bComparePool ) const
+{
if( this == &rCompare )
return true;
if( ( aContents.size() != rCompare.aContents.size() ) ||
- ( pPool != rCompare.pPool ) ||
+ ( bComparePool && pPool != rCompare.pPool ) ||
( nMetric != rCompare.nMetric ) ||
( nUserType!= rCompare.nUserType ) ||
( nScriptType != rCompare.nScriptType ) ||
@@ -1626,7 +1636,7 @@ bool EditTextObjectImpl::operator==( const EditTextObjectImpl& rCompare ) const
for (size_t i = 0, n = aContents.size(); i < n; ++i)
{
- if (!(*(aContents[i]) == *(rCompare.aContents[i])))
+ if (!(aContents[i]->Equals( *(rCompare.aContents[i]), bComparePool)))
return false;
}
diff --git a/editeng/source/editeng/editobj2.hxx b/editeng/source/editeng/editobj2.hxx
index 460a891f7632..21e91dcec7b8 100644
--- a/editeng/source/editeng/editobj2.hxx
+++ b/editeng/source/editeng/editobj2.hxx
@@ -163,7 +163,7 @@ public:
const WrongList* GetWrongList() const;
void SetWrongList( WrongList* p );
- bool operator==( const ContentInfo& rCompare ) const;
+ bool Equals( const ContentInfo& rCompare, bool bComparePool ) const;
// #i102062#
bool isWrongListEqual(const ContentInfo& rCompare) const;
@@ -272,6 +272,7 @@ public:
void StoreUnicodeStrings( bool b ) { bStoreUnicodeStrings = b; }
bool operator==( const EditTextObjectImpl& rCompare ) const;
+ bool Equals( const EditTextObjectImpl& rCompare, bool bComparePool ) const;
// #i102062#
bool isWrongListEqual(const EditTextObjectImpl& rCompare) const;
diff --git a/include/editeng/editobj.hxx b/include/editeng/editobj.hxx
index 68aa86c7c20e..2807aa96a962 100644
--- a/include/editeng/editobj.hxx
+++ b/include/editeng/editobj.hxx
@@ -133,6 +133,13 @@ public:
bool operator==( const EditTextObject& rCompare ) const;
+ /** Compare possibly ignoring SfxItemPool pointer.
+ @param bComparePool
+ if <FALSE/> ignore SfxItemPool pointer,
+ if <TRUE/> compare also SfxItemPool pointer (identical to operator==())
+ */
+ bool Equals( const EditTextObject& rCompare, bool bComparePool ) const;
+
// #i102062#
bool isWrongListEqual(const EditTextObject& rCompare) const;
diff --git a/include/svl/itemset.hxx b/include/svl/itemset.hxx
index 971444099f31..95953dd08f7f 100644
--- a/include/svl/itemset.hxx
+++ b/include/svl/itemset.hxx
@@ -206,6 +206,20 @@ public:
void Store( SvStream &, bool bDirect = false ) const;
bool operator==(const SfxItemSet &) const;
+
+ /** Compare possibly ignoring SfxItemPool pointer.
+
+ This can be used to compare the content of two SfxItemSet even if they
+ don't share the same pool. EditTextObject::Equals(...,false) uses this
+ which is needed in ScGlobal::EETextObjEqual() for
+ ScPageHFItem::operator==()
+
+ @param bComparePool
+ if <FALSE/> ignore SfxItemPool pointer,
+ if <TRUE/> compare also SfxItemPool pointer (identical to operator==())
+ */
+ bool Equals(const SfxItemSet &, bool bComparePool) const;
+
sal_Int32 getHash() const;
OString stringify() const;
void dumpAsXml(struct _xmlTextWriter* pWriter) const;
diff --git a/sc/source/core/data/global.cxx b/sc/source/core/data/global.cxx
index 34398fe41760..a5b4e10bda3d 100644
--- a/sc/source/core/data/global.cxx
+++ b/sc/source/core/data/global.cxx
@@ -788,24 +788,7 @@ bool ScGlobal::EETextObjEqual( const EditTextObject* pObj1,
return true;
if ( pObj1 && pObj2 )
- {
- // First test for equal text content
- sal_Int32 nParCount = pObj1->GetParagraphCount();
- if ( nParCount != pObj2->GetParagraphCount() )
- return false;
- for (sal_Int32 nPar=0; nPar<nParCount; nPar++)
- if ( pObj1->GetText(nPar) != pObj2->GetText(nPar) )
- return false;
-
- SvMemoryStream aStream1;
- SvMemoryStream aStream2;
- pObj1->Store( aStream1 );
- pObj2->Store( aStream2 );
- const sal_uInt64 nSize = aStream1.Tell();
- if ( aStream2.Tell() == nSize )
- if ( !memcmp( aStream1.GetData(), aStream2.GetData(), (sal_uInt16) nSize ) )
- return true;
- }
+ return pObj1->Equals( *pObj2, false);
return false;
}
diff --git a/svl/source/items/itemset.cxx b/svl/source/items/itemset.cxx
index d59872fa3799..72ae16c836bb 100644
--- a/svl/source/items/itemset.cxx
+++ b/svl/source/items/itemset.cxx
@@ -1446,12 +1446,20 @@ void SfxItemSet::Load
bool SfxItemSet::operator==(const SfxItemSet &rCmp) const
{
+ return Equals( rCmp, true);
+}
+
+bool SfxItemSet::Equals(const SfxItemSet &rCmp, bool bComparePool) const
+{
// Values we can get quickly need to be the same
+ const bool bDifferentPools = (m_pPool != rCmp.m_pPool);
if ( m_pParent != rCmp.m_pParent ||
- m_pPool != rCmp.m_pPool ||
+ (bComparePool && bDifferentPools) ||
Count() != rCmp.Count() )
return false;
+ // If we reach here and bDifferentPools==true that means bComparePool==false.
+
// Counting Ranges takes longer; they also need to be the same, however
sal_uInt16 nCount1 = TotalCount();
sal_uInt16 nCount2 = rCmp.TotalCount();
@@ -1499,7 +1507,7 @@ bool SfxItemSet::operator==(const SfxItemSet &rCmp) const
if ( *ppItem1 != *ppItem2 &&
( ( !*ppItem1 || !*ppItem2 ) ||
( IsInvalidItem(*ppItem1) || IsInvalidItem(*ppItem2) ) ||
- (m_pPool->IsItemPoolable(**ppItem1)) ||
+ (!bDifferentPools && m_pPool->IsItemPoolable(**ppItem1)) ||
**ppItem1 != **ppItem2 ) )
return false;
More information about the Libreoffice-commits
mailing list