Hi
Note that I did not use boost::ptr_vector because that would have meant
switching to using references everywhere, and the existing logic makes
use of NULL values, so I left that for a future patch.
Code is contributed under MPL+/LGPL+/GPL+
Regards, Noel Grandin
Disclaimer: http://www.peralex.com/disclaimer.html
diff --git a/sc/inc/dptabres.hxx b/sc/inc/dptabres.hxx
index 6864e14..da1581d 100644
--- a/sc/inc/dptabres.hxx
+++ b/sc/inc/dptabres.hxx
@@ -221,8 +221,6 @@ public:
// results for a hierarchy dimension
//
-#define SC_DP_RES_GROW 16
-
class ScDPResultDimension;
class ScDPDataDimension;
class ScDPDataMember;
@@ -494,10 +492,7 @@ public:
ScDPDataDimension* GetChildDimension() { return
pChildDimension; }
};
-//! replace PtrArr with 32-bit array ????
-
-typedef ScDPDataMember* ScDPDataMemberPtr;
-SV_DECL_PTRARR_DEL(ScDPDataMembers, ScDPDataMemberPtr, SC_DP_RES_GROW)
+typedef std::vector<ScDPDataMember*> ScDPDataMembers;
// result dimension contains only members
@@ -646,7 +641,8 @@ public:
void DumpState( const ScDPResultDimension* pRefDim,
ScDocument* pDoc, ScAddress& rPos ) const;
long GetMemberCount() const;
- ScDPDataMember* GetMember(long n) const;
+ const ScDPDataMember* GetMember(long n) const;
+ ScDPDataMember* GetMember(long n);
};
// ----------------------------------------------------------------------------
diff --git a/sc/source/core/data/dptabres.cxx b/sc/source/core/data/dptabres.cxx
index 15fd87b..c892cea 100644
--- a/sc/source/core/data/dptabres.cxx
+++ b/sc/source/core/data/dptabres.cxx
@@ -67,10 +67,6 @@ using ::rtl::OUString;
// -----------------------------------------------------------------------
-SV_IMPL_PTRARR( ScDPDataMembers, ScDPDataMemberPtr );
-
-// -----------------------------------------------------------------------
-
static sal_uInt16 nFuncStrIds[12] = // passend zum enum ScSubTotalFunc
{
0, // SUBTOTAL_FUNC_NONE
@@ -243,8 +239,8 @@ sal_Bool ScDPRowMembersOrder::operator()( sal_Int32
nIndex1, sal_Int32 nIndex2 )
sal_Bool ScDPColMembersOrder::operator()( sal_Int32 nIndex1, sal_Int32 nIndex2
) const
{
- ScDPDataMember* pDataMember1 = rDimension.GetMember(nIndex1);
- ScDPDataMember* pDataMember2 = rDimension.GetMember(nIndex2);
+ const ScDPDataMember* pDataMember1 = rDimension.GetMember(nIndex1);
+ const ScDPDataMember* pDataMember2 = rDimension.GetMember(nIndex2);
sal_Bool bHide1 = pDataMember1 && !pDataMember1->IsVisible();
sal_Bool bHide2 = pDataMember2 && !pDataMember2->IsVisible();
if ( bHide1 || bHide2 )
@@ -2314,7 +2310,7 @@ void ScDPDataMember::UpdateRunningTotals( const
ScDPResultMember* pRefMember,
sal_Bool bRefDimInCol = ( nRefOrient ==
sheet::DataPilotFieldOrientation_COLUMN );
sal_Bool bRefDimInRow = ( nRefOrient ==
sheet::DataPilotFieldOrientation_ROW );
- const ScDPResultDimension* pSelectDim = NULL;
+ ScDPResultDimension* pSelectDim = NULL;
long nRowPos = 0;
long nColPos = 0;
@@ -3297,7 +3293,7 @@ ScDPDataMember*
ScDPResultDimension::GetRowReferenceMember( const ScDPRelativePo
const long* pNextColIndex = pColIndexes;
while ( *pNextColIndex >= 0 && pColMember )
{
- const ScDPDataDimension* pColChild =
pColMember->GetChildDimension();
+ ScDPDataDimension* pColChild = pColMember->GetChildDimension();
if ( pColChild && *pNextColIndex < pColChild->GetMemberCount()
)
pColMember = pColChild->GetMember( *pNextColIndex );
else
@@ -3349,7 +3345,7 @@ ScDPDataMember*
ScDPResultDimension::GetColReferenceMember( const ScDPRelativePo
long nColSkipped = 0;
while ( *pNextColIndex >= 0 && pColMember && nColSkipped < nRefDimPos )
{
- const ScDPDataDimension* pColChild =
pColMember->GetChildDimension();
+ ScDPDataDimension* pColChild = pColMember->GetChildDimension();
if ( pColChild && *pNextColIndex < pColChild->GetMemberCount() )
pColMember = pColChild->GetMember( *pNextColIndex );
else
@@ -3363,7 +3359,7 @@ ScDPDataMember*
ScDPResultDimension::GetColReferenceMember( const ScDPRelativePo
if ( pColMember )
{
- const ScDPDataDimension* pReferenceDim =
pColMember->GetChildDimension();
+ ScDPDataDimension* pReferenceDim = pColMember->GetChildDimension();
if ( pReferenceDim )
{
long nReferenceCount = pReferenceDim->GetMemberCount();
@@ -3404,7 +3400,7 @@ ScDPDataMember*
ScDPResultDimension::GetColReferenceMember( const ScDPRelativePo
const long* pNextColIndex = pColIndexes + nRefDimPos + 1;
while ( *pNextColIndex >= 0 && pColMember )
{
- const ScDPDataDimension* pColChild =
pColMember->GetChildDimension();
+ ScDPDataDimension* pColChild =
pColMember->GetChildDimension();
if ( pColChild && *pNextColIndex <
pColChild->GetMemberCount() )
pColMember = pColChild->GetMember( *pNextColIndex );
else
@@ -3504,6 +3500,8 @@ ScDPDataDimension::ScDPDataDimension( const
ScDPResultData* pData ) :
ScDPDataDimension::~ScDPDataDimension()
{
+ for (ScDPDataMembers::iterator it = aMembers.begin(); it !=
aMembers.end(); ++it)
+ delete *it;
}
void ScDPDataDimension::InitFrom( const ScDPResultDimension* pDim )
@@ -3522,7 +3520,7 @@ void ScDPDataDimension::InitFrom( const
ScDPResultDimension* pDim )
const ScDPResultMember* pResMem = pDim->GetMember(i);
ScDPDataMember* pNew = new ScDPDataMember( pResultData, pResMem );
- aMembers.Insert( pNew, aMembers.Count() );
+ aMembers.push_back( pNew);
if ( !pResultData->IsLateInit() )
{
@@ -3541,7 +3539,7 @@ void ScDPDataDimension::ProcessData( const vector< SCROW
>& aDataMembers, const
{
// the ScDPItemData array must contain enough entries for all dimensions -
this isn't checked
- long nCount = aMembers.Count();
+ long nCount = aMembers.size();
for (long i=0; i<nCount; i++)
{
ScDPDataMember* pMember = aMembers[(sal_uInt16)i];
@@ -3575,7 +3573,7 @@ void ScDPDataDimension::FillDataRow( const
ScDPResultDimension* pRefDim,
long nMemberMeasure = nMeasure;
long nMemberCol = nCol;
- long nCount = aMembers.Count();
+ long nCount = aMembers.size();
for (long i=0; i<nCount; i++)
{
long nSorted = rMemberOrder.empty() ? i : rMemberOrder[i];
@@ -3607,7 +3605,7 @@ void ScDPDataDimension::UpdateDataRow( const
ScDPResultDimension* pRefDim,
OSL_ENSURE( pRefDim == pResultDimension, "wrong dim" );
long nMemberMeasure = nMeasure;
- long nCount = aMembers.Count();
+ long nCount = aMembers.size();
for (long i=0; i<nCount; i++)
{
long nMemberPos = i;
@@ -3628,7 +3626,7 @@ void ScDPDataDimension::UpdateDataRow( const
ScDPResultDimension* pRefDim,
void ScDPDataDimension::SortMembers( ScDPResultDimension* pRefDim )
{
- long nCount = aMembers.Count();
+ long nCount = aMembers.size();
if ( pRefDim->IsSortByData() )
{
@@ -3664,7 +3662,7 @@ void ScDPDataDimension::SortMembers( ScDPResultDimension*
pRefDim )
void ScDPDataDimension::DoAutoShow( ScDPResultDimension* pRefDim )
{
- long nCount = aMembers.Count();
+ long nCount = aMembers.size();
// handle children first, before changing the visible state
@@ -3678,7 +3676,7 @@ void ScDPDataDimension::DoAutoShow( ScDPResultDimension*
pRefDim )
ScDPResultMember* pRefMember = pRefDim->GetMember(i);
if ( pRefMember->IsVisible() ) //! here or in ScDPDataMember ???
{
- ScDPDataMember* pDataMember = aMembers[(sal_uInt16)i];
+ ScDPDataMember* pDataMember = aMembers[i];
pDataMember->DoAutoShow( pRefMember );
}
}
@@ -3699,7 +3697,7 @@ void ScDPDataDimension::DoAutoShow( ScDPResultDimension*
pRefDim )
// look for equal values to the last included one
long nIncluded = pRefDim->GetAutoCount();
- ScDPDataMember* pDataMember1 =
aMembers[(sal_uInt16)aAutoOrder[nIncluded - 1]];
+ ScDPDataMember* pDataMember1 = aMembers[aAutoOrder[nIncluded - 1]];
if ( !pDataMember1->IsVisible() )
pDataMember1 = NULL;
sal_Bool bContinue = sal_True;
@@ -3708,7 +3706,7 @@ void ScDPDataDimension::DoAutoShow( ScDPResultDimension*
pRefDim )
bContinue = false;
if ( nIncluded < nCount )
{
- ScDPDataMember* pDataMember2 =
aMembers[(sal_uInt16)aAutoOrder[nIncluded]];
+ ScDPDataMember* pDataMember2 = aMembers[aAutoOrder[nIncluded]];
if ( !pDataMember2->IsVisible() )
pDataMember2 = NULL;
@@ -3732,13 +3730,13 @@ void ScDPDataDimension::DoAutoShow(
ScDPResultDimension* pRefDim )
void ScDPDataDimension::ResetResults()
{
- long nCount = aMembers.Count();
+ long nCount = aMembers.size();
for (long i=0; i<nCount; i++)
{
// sort order doesn't matter
long nMemberPos = bIsDataLayout ? 0 : i;
- ScDPDataMember* pDataMember = aMembers[(sal_uInt16)nMemberPos];
+ ScDPDataMember* pDataMember = aMembers[nMemberPos];
pDataMember->ResetResults();
}
}
@@ -3761,7 +3759,7 @@ void ScDPDataDimension::UpdateRunningTotals( const
ScDPResultDimension* pRefDim,
OSL_ENSURE( pRefDim == pResultDimension, "wrong dim" );
long nMemberMeasure = nMeasure;
- long nCount = aMembers.Count();
+ long nCount = aMembers.size();
for (long i=0; i<nCount; i++)
{
const ScMemberSortOrder& rMemberOrder = pRefDim->GetMemberOrder();
@@ -3784,7 +3782,7 @@ void ScDPDataDimension::UpdateRunningTotals( const
ScDPResultDimension* pRefDim,
else
rRunning.AddColIndex( i, nSorted );
- ScDPDataMember* pDataMember = aMembers[(sal_uInt16)nMemberPos];
+ ScDPDataMember* pDataMember = aMembers[nMemberPos];
pDataMember->UpdateRunningTotals( pRefMember, nMemberMeasure,
bIsSubTotalRow, rSubState,
rRunning, rTotals, rRowParent );
@@ -3800,11 +3798,11 @@ void ScDPDataDimension::DumpState( const
ScDPResultDimension* pRefDim, ScDocumen
SCROW nStartRow = rPos.Row();
- long nCount = bIsDataLayout ? 1 : aMembers.Count();
+ long nCount = bIsDataLayout ? 1 : aMembers.size();
for (long i=0; i<nCount; i++)
{
const ScDPResultMember* pRefMember = pRefDim->GetMember(i);
- const ScDPDataMember* pDataMember = aMembers[(sal_uInt16)i];
+ const ScDPDataMember* pDataMember = aMembers[i];
pDataMember->DumpState( pRefMember, pDoc, rPos );
}
@@ -3813,12 +3811,17 @@ void ScDPDataDimension::DumpState( const
ScDPResultDimension* pRefDim, ScDocumen
long ScDPDataDimension::GetMemberCount() const
{
- return aMembers.Count();
+ return aMembers.size();
+}
+
+const ScDPDataMember* ScDPDataDimension::GetMember(long n) const
+{
+ return aMembers[n];
}
-ScDPDataMember* ScDPDataDimension::GetMember(long n) const
+ScDPDataMember* ScDPDataDimension::GetMember(long n)
{
- return aMembers[(sal_uInt16)n];
+ return aMembers[n];
}
// ----------------------------------------------------------------------------
_______________________________________________
LibreOffice mailing list
LibreOffice@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice