dynamic column container: fix some more for loops

and add reverse-iterator functionality

Change-Id: Ide7ee9d2152871d414246303d76c91da36557524
Reviewed-on: https://gerrit.libreoffice.org/41727
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index 45f450e..6e91927 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -2322,7 +2322,7 @@ public:
    void                SwapNonEmpty( sc::TableValues& rValues );
    void                finalizeOutlineImport();

    ScColumnsRange      GetColumnsRange(SCTAB nTab, SCCOL nColBegin, SCCOL nColEnd) const;
    SC_DLLPUBLIC ScColumnsRange GetColumnsRange(SCTAB nTab, SCCOL nColBegin, SCCOL nColEnd) const;

private:

diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx
index 3113ef6..4c734c7 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -132,6 +132,7 @@ class ScColumnsRange final
        explicit Iterator(std::vector<ScColumn*>::const_iterator colIter) : maColIter(colIter) {}

        Iterator& operator++() { maColIter++; return *this;}
        Iterator& operator--() { maColIter--; return *this;}

        bool operator==(Iterator other) const {return maColIter == other.maColIter;}
        bool operator!=(Iterator other) const {return !(*this == other);}
@@ -141,6 +142,8 @@ class ScColumnsRange final
    ScColumnsRange(Iterator nBegin, Iterator nEnd) : maBegin(nBegin), maEnd(nEnd) {}
    const Iterator & begin() { return maBegin; }
    const Iterator & end() { return maEnd; }
    std::reverse_iterator<Iterator> rbegin() { return std::reverse_iterator<Iterator>(maEnd); }
    std::reverse_iterator<Iterator> rend() { return std::reverse_iterator<Iterator>(maBegin); }
private:
    const Iterator maBegin;
    const Iterator maEnd;
diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx
index 94a91ed..9079c92 100644
--- a/sc/source/core/data/document.cxx
+++ b/sc/source/core/data/document.cxx
@@ -4569,7 +4569,7 @@ SCCOL ScDocument::GetNextDifferentChangedCol( SCTAB nTab, SCCOL nStart) const
    {
        CRFlags nStartFlags = maTabs[nTab]->GetColFlags(nStart);
        sal_uInt16 nStartWidth = maTabs[nTab]->GetOriginalWidth(nStart);
        for (SCCOL nCol = nStart + 1; nCol <= MAXCOL; nCol++)
        for (SCCOL nCol : maTabs[nTab]->GetColumnsRange( nStart + 1, MAXCOL))
        {
            if (((nStartFlags & CRFlags::ManualBreak) != (maTabs[nTab]->GetColFlags(nCol) & CRFlags::ManualBreak)) ||
                (nStartWidth != maTabs[nTab]->GetOriginalWidth(nCol)) ||
diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx
index 8ae6377..d14e699 100644
--- a/sc/source/core/data/table2.cxx
+++ b/sc/source/core/data/table2.cxx
@@ -17,6 +17,7 @@
 *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
 */

#include <algorithm>
#include <memory>
#include "table.hxx"
#include "patattr.hxx"
@@ -263,18 +264,19 @@ void ScTable::DeleteRow(

bool ScTable::TestInsertCol( SCROW nStartRow, SCROW nEndRow, SCSIZE nSize ) const
{
    bool bTest = true;

    if ( nStartRow==0 && nEndRow==MAXROW && pOutlineTable )
        bTest = pOutlineTable->TestInsertCol(nSize);

    if ( nSize > static_cast<SCSIZE>(MAXCOL) )
        bTest = false;
        return false;

    for (SCCOL i=MAXCOL; (i+static_cast<SCCOL>(nSize)>MAXCOL) && bTest; i--)
        bTest = aCol[i].TestInsertCol(nStartRow, nEndRow);
    if ( nStartRow==0 && nEndRow==MAXROW && pOutlineTable
        && ! pOutlineTable->TestInsertCol(nSize) )
            return false;

    return bTest;
    auto range = GetColumnsRange( MAXCOL - static_cast<SCCOL>(nSize) + 1, MAXCOL );
    for (auto it = range.rbegin(); it != range.rend(); ++it )
        if (! aCol[*it].TestInsertCol(nStartRow, nEndRow))
            return false;

    return true;
}

void ScTable::InsertCol(
diff --git a/sc/source/core/data/table5.cxx b/sc/source/core/data/table5.cxx
index 14d38e5..de41123 100644
--- a/sc/source/core/data/table5.cxx
+++ b/sc/source/core/data/table5.cxx
@@ -80,7 +80,6 @@ void ScTable::UpdatePageBreaks( const ScRange* pUserArea )
    SfxItemSet* pStyleSet = &pStyle->GetItemSet();
    const SfxPoolItem* pItem;

    SCCOL nX;
    SCCOL nStartCol = 0;
    SCROW nStartRow = 0;
    SCCOL nEndCol = MAXCOL;
@@ -99,7 +98,7 @@ void ScTable::UpdatePageBreaks( const ScRange* pUserArea )
        {
            // Show nothing, when multiple ranges

            for (nX=0; nX<MAXCOL; nX++)
            for (SCCOL nX : GetColumnsRange(0, MAXCOL))
                RemoveColBreak(nX, true, false);

            RemoveRowPageBreaks(0, MAXROW-1);
@@ -150,7 +149,7 @@ void ScTable::UpdatePageBreaks( const ScRange* pUserArea )

        //  Beginning: Remove breaks

    for (nX=0; nX<nStartCol; nX++)
    for (SCCOL nX : GetColumnsRange(0, nStartCol-1))
        RemoveColBreak(nX, true, false);
    RemoveRowPageBreaks(0, nStartRow-1);

@@ -164,7 +163,7 @@ void ScTable::UpdatePageBreaks( const ScRange* pUserArea )
    bool bRepeatCol = ( nRepeatStartX != SCCOL_REPEAT_NONE );
    bool bColFound = false;
    long nSizeX = 0;
    for (nX=nStartCol; nX<=nEndCol; nX++)
    for (SCCOL nX=nStartCol; nX<=nEndCol; nX++)
    {
        bool bStartOfPage = false;
        long nThisX = ColHidden(nX) ? 0 : pColWidth[nX];
diff --git a/sc/source/filter/dif/difimp.cxx b/sc/source/filter/dif/difimp.cxx
index 4d8c708..7cd8190 100644
--- a/sc/source/filter/dif/difimp.cxx
+++ b/sc/source/filter/dif/difimp.cxx
@@ -32,6 +32,7 @@
#include "scerrors.hxx"
#include "scitems.hxx"
#include "stringutil.hxx"
#include "table.hxx"
#include <memory>

const sal_Unicode pKeyTABLE[]   = { 'T', 'A', 'B', 'L', 'E', 0 };
@@ -686,7 +687,7 @@ void DifAttrCache::SetNumFormat( const SCCOL nCol, const SCROW nRow, const sal_u

void DifAttrCache::Apply( ScDocument& rDoc, SCTAB nTab )
{
    for( SCCOL nCol = 0 ; nCol <= MAXCOL ; nCol++ )
    for( SCCOL nCol : rDoc.GetColumnsRange(nTab, 0, MAXCOL) )
    {
        if( mvCols[ nCol ] )
            mvCols[ nCol ]->Apply( rDoc, nCol, nTab );
diff --git a/sc/source/filter/excel/colrowst.cxx b/sc/source/filter/excel/colrowst.cxx
index e1d12a00..1056379 100644
--- a/sc/source/filter/excel/colrowst.cxx
+++ b/sc/source/filter/excel/colrowst.cxx
@@ -29,6 +29,7 @@
#include "xistyle.hxx"
#include "queryparam.hxx"
#include "excimp8.hxx"
#include "table.hxx"

XclImpColRowSettings::XclImpColRowSettings( const XclImpRoot& rRoot ) :
    XclImpRoot( rRoot ),
@@ -188,7 +189,7 @@ void XclImpColRowSettings::Convert( SCTAB nScTab )
    // column widths ----------------------------------------------------------

    maColWidths.build_tree();
    for( SCCOL nCol = 0; nCol <= MAXCOL; ++nCol )
    for( SCCOL nCol : rDoc.GetColumnsRange(nScTab, 0, MAXCOL) )
    {
        sal_uInt16 nWidth = mnDefWidth;
        if (GetColFlag(nCol, ExcColRowFlags::Used))
@@ -280,7 +281,7 @@ void XclImpColRowSettings::ConvertHiddenFlags( SCTAB nScTab )
    ScDocument& rDoc = GetDoc();

    // hide the columns
    for( SCCOL nCol = 0; nCol <= MAXCOL; ++nCol )
    for( SCCOL nCol : rDoc.GetColumnsRange(nScTab, 0, MAXCOL) )
        if (GetColFlag(nCol, ExcColRowFlags::Hidden))
            rDoc.ShowCol( nCol, nScTab, false );

diff --git a/sc/source/ui/miscdlgs/datatableview.cxx b/sc/source/ui/miscdlgs/datatableview.cxx
index d149713..fc0e68a 100644
--- a/sc/source/ui/miscdlgs/datatableview.cxx
+++ b/sc/source/ui/miscdlgs/datatableview.cxx
@@ -23,6 +23,7 @@
#include "viewdata.hxx"
#include "output.hxx"
#include "fillinfo.hxx"
#include "table.hxx"

constexpr double nPPTX = 0.06666;
constexpr double nPPTY = 0.06666;
@@ -178,7 +179,7 @@ SCCOL findColFromPos(sal_uInt16 nPixelPos, const ScDocument* pDoc, SCCOL nStartC
{
    nPixelPos -= nRowHeaderWidth;
    sal_uInt32 nPixelLength = 0;
    for (SCCOL nCol = nStartCol; nCol <= MAXCOL; ++nCol)
    for (SCCOL nCol : pDoc->GetColumnsRange(0, nStartCol, MAXCOL))
    {
        sal_uInt16 nColWidth = pDoc->GetColWidth(nCol, 0, true);
        sal_uInt32 nPixel = ScViewData::ToPixel(nColWidth, nPPTX);
diff --git a/sc/source/ui/unoobj/cellsuno.cxx b/sc/source/ui/unoobj/cellsuno.cxx
index 5dece97..d51b826 100644
--- a/sc/source/ui/unoobj/cellsuno.cxx
+++ b/sc/source/ui/unoobj/cellsuno.cxx
@@ -131,6 +131,7 @@
#include <sortparam.hxx>
#include "condformatuno.hxx"
#include "TablePivotCharts.hxx"
#include "table.hxx"

#include <list>
#include <memory>
@@ -6932,8 +6933,7 @@ uno::Sequence<sheet::TablePageBreakData> SAL_CALL ScTableSheetObj::getColumnPage
        }

        SCCOL nCount = 0;
        SCCOL nCol;
        for (nCol=0; nCol<=MAXCOL; nCol++)
        for (SCCOL nCol : rDoc.GetColumnsRange(nTab, 0, MAXCOL))
            if (rDoc.HasColBreak(nCol, nTab) != ScBreakType::NONE)
                ++nCount;

@@ -6941,7 +6941,7 @@ uno::Sequence<sheet::TablePageBreakData> SAL_CALL ScTableSheetObj::getColumnPage
        uno::Sequence<sheet::TablePageBreakData> aSeq(nCount);
        sheet::TablePageBreakData* pAry = aSeq.getArray();
        sal_uInt16 nPos = 0;
        for (nCol=0; nCol<=MAXCOL; nCol++)
        for (SCCOL nCol : rDoc.GetColumnsRange(nTab, 0, MAXCOL))
        {
            ScBreakType nBreak = rDoc.HasColBreak(nCol, nTab);
            if (nBreak != ScBreakType::NONE)
diff --git a/sc/source/ui/unoobj/docuno.cxx b/sc/source/ui/unoobj/docuno.cxx
index b7b5529..c6445c7 100644
--- a/sc/source/ui/unoobj/docuno.cxx
+++ b/sc/source/ui/unoobj/docuno.cxx
@@ -122,6 +122,7 @@
#include "drtxtob.hxx"
#include "transobj.hxx"
#include "chgtrack.hxx"
#include "table.hxx"

#include "strings.hrc"

@@ -4315,7 +4316,7 @@ sal_Int32 SAL_CALL ScAnnotationsObj::getCount()
    if (pDocShell)
    {
        const ScDocument& rDoc = pDocShell->GetDocument();
        for (SCCOL nCol = 0; nCol <= MAXCOL; ++nCol)
        for (SCCOL nCol : rDoc.GetColumnsRange(nTab, 0, MAXCOL))
            nCount += rDoc.GetNoteCount(nTab, nCol);
    }
    return nCount;