[Libreoffice-commits] core.git: sc/inc sc/source

Eike Rathke erack at redhat.com
Wed Nov 30 16:45:23 UTC 2016


 sc/inc/address.hxx                         |   27 ++++++++++++++++++++++++---
 sc/source/filter/xml/XMLExportIterator.cxx |   12 ++++++------
 2 files changed, 30 insertions(+), 9 deletions(-)

New commits:
commit c038d88c228bb2f4d0dde88f59ee4b9c6620687e
Author: Eike Rathke <erack at redhat.com>
Date:   Wed Nov 30 17:37:12 2016 +0100

    ScAddress::operator<() is not what we need here, tdf#48140 follow-up fix
    
    ScAddress::operator<() compares by tab,col,row while we need tab,row,col
    for ODF import/export.
    
    This caused the export crash tests
    http://dev-builds.libreoffice.org/crashtest/27ec6d1cb96a0d3becf14309a26d1c024a0f8603/exportCrash.txt
    to fail due to assert
    
    sax/source/expatwrap/saxwriter.cxx:1143: virtual void
    {anonymous}::SAXWriter::endElement(const rtl::OUString&): Assertion
    `aName == m_pSaxWriterHelper->m_DebugStartedElements.top()'
    
    Fallout from
    commit 50106435e9a5bbc067e9beeabc5147ed9f305286
    Date:   Thu Nov 24 00:02:45 2016 +0100
    
        tdf#48140 Change types of variables and remove uneeded code
    
    Change-Id: I63d365f62868099b79de4812534c323b89dc2ee1

diff --git a/sc/inc/address.hxx b/sc/inc/address.hxx
index d801d05..a1a75f2 100644
--- a/sc/inc/address.hxx
+++ b/sc/inc/address.hxx
@@ -344,6 +344,7 @@ public:
     inline bool operator!=( const ScAddress& rAddress ) const;
     inline bool operator<( const ScAddress& rAddress ) const;
     inline bool operator<=( const ScAddress& rAddress ) const;
+    inline bool lessThanByRow( const ScAddress& rAddress ) const;
 
     inline size_t hash() const;
 
@@ -398,8 +399,7 @@ inline bool ScAddress::operator!=( const ScAddress& rAddress ) const
     return !operator==( rAddress );
 }
 
-/** Same behavior as the old sal_uInt32 nAddress < r.nAddress with encoded
-    tab|col|row bit fields. */
+/** Less than ordered by tab,col,row. */
 inline bool ScAddress::operator<( const ScAddress& rAddress ) const
 {
     if (nTab == rAddress.nTab)
@@ -418,6 +418,20 @@ inline bool ScAddress::operator<=( const ScAddress& rAddress ) const
     return operator<( rAddress ) || operator==( rAddress );
 }
 
+/** Less than ordered by tab,row,col as needed by row-wise import/export */
+inline bool ScAddress::lessThanByRow( const ScAddress& rAddress ) const
+{
+    if (nTab == rAddress.nTab)
+    {
+        if (nRow == rAddress.nRow)
+            return nCol < rAddress.nCol;
+        else
+            return nRow < rAddress.nRow;
+    }
+    else
+        return nTab < rAddress.nTab;
+}
+
 inline size_t ScAddress::hash() const
 {
     // Assume that there are not that many addresses with row > 2^16 AND column
@@ -609,6 +623,7 @@ public:
     inline bool operator!=( const ScRange& rRange ) const;
     inline bool operator<( const ScRange& rRange ) const;
     inline bool operator<=( const ScRange& rRange ) const;
+    inline bool lessThanByRow( const ScRange& rRange ) const;
 
     /// Hash 2D area ignoring table number.
     inline size_t hashArea() const;
@@ -645,7 +660,7 @@ inline bool ScRange::operator!=( const ScRange& rRange ) const
     return !operator==( rRange );
 }
 
-/// Sort on upper left corner, if equal then use lower right too.
+/// Sort on upper left corner tab,col,row, if equal then use lower right too.
 inline bool ScRange::operator<( const ScRange& r ) const
 {
     return aStart < r.aStart || (aStart == r.aStart && aEnd < r.aEnd) ;
@@ -656,6 +671,12 @@ inline bool ScRange::operator<=( const ScRange& rRange ) const
     return operator<( rRange ) || operator==( rRange );
 }
 
+/// Sort on upper left corner tab,row,col, if equal then use lower right too.
+inline bool ScRange::lessThanByRow( const ScRange& r ) const
+{
+    return aStart.lessThanByRow( r.aStart) || (aStart == r.aStart && aEnd.lessThanByRow( r.aEnd)) ;
+}
+
 inline bool ScRange::In( const ScAddress& rAddress ) const
 {
     return
diff --git a/sc/source/filter/xml/XMLExportIterator.cxx b/sc/source/filter/xml/XMLExportIterator.cxx
index b680dd9..c4903e6 100644
--- a/sc/source/filter/xml/XMLExportIterator.cxx
+++ b/sc/source/filter/xml/XMLExportIterator.cxx
@@ -52,7 +52,7 @@ void ScMyIteratorBase::UpdateAddress( ScAddress& rCellAddress )
 
 inline bool ScMyShape::operator<(const ScMyShape& aShape) const
 {
-    return ( aAddress < aShape.aAddress );
+    return aAddress.lessThanByRow( aShape.aAddress );
 }
 
 ScMyShapesContainer::ScMyShapesContainer()
@@ -108,7 +108,7 @@ void ScMyShapesContainer::Sort()
 
 inline bool ScMyNoteShape::operator<(const ScMyNoteShape& aNote) const
 {
-    return ( aPos < aNote.aPos );
+    return aPos.lessThanByRow( aNote.aPos );
 }
 
 ScMyNoteShapesContainer::ScMyNoteShapesContainer()
@@ -159,7 +159,7 @@ void ScMyNoteShapesContainer::Sort()
 
 inline bool ScMyMergedRange::operator<(const ScMyMergedRange& aRange) const
 {
-    return ( aCellRange.aStart < aRange.aCellRange.aStart );
+    return aCellRange.aStart.lessThanByRow( aRange.aCellRange.aStart );
 }
 
 ScMyMergedRangesContainer::ScMyMergedRangesContainer()
@@ -253,7 +253,7 @@ bool ScMyAreaLink::Compare( const ScMyAreaLink& rAreaLink ) const
 
 inline bool ScMyAreaLink::operator<(const ScMyAreaLink& rAreaLink ) const
 {
-    return ( aDestRange.aStart < rAreaLink.aDestRange.aStart );
+    return aDestRange.aStart.lessThanByRow( rAreaLink.aDestRange.aStart );
 }
 
 ScMyAreaLinksContainer::ScMyAreaLinksContainer() :
@@ -379,7 +379,7 @@ void ScMyEmptyDatabaseRangesContainer::Sort()
 
 inline bool ScMyDetectiveObj::operator<( const ScMyDetectiveObj& rDetObj) const
 {
-    return ( aPosition < rDetObj.aPosition );
+    return aPosition.lessThanByRow( rDetObj.aPosition );
 }
 
 ScMyDetectiveObjContainer::ScMyDetectiveObjContainer() :
@@ -461,7 +461,7 @@ void ScMyDetectiveObjContainer::Sort()
 
 inline bool ScMyDetectiveOp::operator<( const ScMyDetectiveOp& rDetOp) const
 {
-    return ( aPosition < rDetOp.aPosition );
+    return aPosition.lessThanByRow( rDetOp.aPosition );
 }
 
 ScMyDetectiveOpContainer::ScMyDetectiveOpContainer() :


More information about the Libreoffice-commits mailing list