sc/inc/dpgroup.hxx | 2 - sc/inc/dptabsrc.hxx | 8 ++++-- sc/source/core/data/dpgroup.cxx | 27 +++++++++++----------- sc/source/core/data/dptabres.cxx | 4 +-- sc/source/core/data/dptabsrc.cxx | 47 +++++++++++++-------------------------- 5 files changed, 38 insertions(+), 50 deletions(-)
New commits: commit 137b53e0e2763d41c43e62ecc85b38d7f3cb71f7 Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Fri Mar 9 22:25:10 2012 -0500 vector and rtl::Reference over manual ref-counting. diff --git a/sc/inc/dptabsrc.hxx b/sc/inc/dptabsrc.hxx index b43e795..b69846b 100644 --- a/sc/inc/dptabsrc.hxx +++ b/sc/inc/dptabsrc.hxx @@ -54,6 +54,7 @@ #include <cppuhelper/implbase3.hxx> #include <cppuhelper/implbase5.hxx> #include <cppuhelper/implbase6.hxx> +#include "rtl/ref.hxx" #include "dptabdat.hxx" #include "dpglobal.hxx" @@ -683,12 +684,13 @@ class ScDPMembers : public cppu::WeakImplHelper2< com::sun::star::lang::XServiceInfo > { private: + typedef std::vector<rtl::Reference<ScDPMember> > MembersType; ScDPSource* pSource; long nDim; long nHier; long nLev; long nMbrCount; - ScDPMember** ppMbrs; + mutable MembersType maMembers; mutable ScDPMembersHashMap aHashMap; public: diff --git a/sc/source/core/data/dptabsrc.cxx b/sc/source/core/data/dptabsrc.cxx index 9514046..3d41f86 100644 --- a/sc/source/core/data/dptabsrc.cxx +++ b/sc/source/core/data/dptabsrc.cxx @@ -2284,8 +2284,7 @@ ScDPMembers::ScDPMembers( ScDPSource* pSrc, long nD, long nH, long nL ) : pSource( pSrc ), nDim( nD ), nHier( nH ), - nLev( nL ), - ppMbrs( NULL ) + nLev( nL ) { //! hold pSource @@ -2357,15 +2356,6 @@ ScDPMembers::ScDPMembers( ScDPSource* pSrc, long nD, long nH, long nL ) : ScDPMembers::~ScDPMembers() { - //! release pSource - - if (ppMbrs) - { - for (long i=0; i<nMbrCount; i++) - if ( ppMbrs[i] ) - ppMbrs[i]->release(); // ref-counted - delete[] ppMbrs; - } } // XNameAccess implementation using getCount/getByIndex @@ -2451,13 +2441,14 @@ long ScDPMembers::getMinMembers() const // used in lcl_CountMinMembers long nVisCount = 0; - if ( ppMbrs ) + if (!maMembers.empty()) { - for (long i=0; i<nMbrCount; i++) + MembersType::const_iterator it = maMembers.begin(), itEnd = maMembers.end(); + for (; it != itEnd; ++it) { // count only visible with details (default is true for both) - const ScDPMember* pMbr = ppMbrs[i]; - if ( !pMbr || ( pMbr->isVisible() && pMbr->getShowDetails() ) ) + const rtl::Reference<ScDPMember>& pMbr = *it; + if (!pMbr.get() || (pMbr->isVisible() && pMbr->getShowDetails())) ++nVisCount; } } @@ -2474,20 +2465,17 @@ ScDPMember* ScDPMembers::getByIndex(long nIndex) const if ( nIndex >= 0 && nIndex < nMbrCount ) { - if ( !ppMbrs ) - { - ((ScDPMembers*)this)->ppMbrs = new ScDPMember*[nMbrCount]; - for (long i=0; i<nMbrCount; i++) - ppMbrs[i] = NULL; - } - if ( !ppMbrs[nIndex] ) + if (maMembers.empty()) + maMembers.resize(nMbrCount); + + if (!maMembers[nIndex].get()) { - ScDPMember* pNew; + rtl::Reference<ScDPMember> pNew; long nSrcDim = pSource->GetSourceDim( nDim ); if ( pSource->IsDataLayoutDimension(nSrcDim) ) { // empty name (never shown, not used for lookup) - pNew = new ScDPMember( pSource, nDim, nHier, nLev, 0 ); + pNew.set(new ScDPMember(pSource, nDim, nHier, nLev, 0)); } else if ( nHier != SC_DAPI_HIERARCHY_FLAT && pSource->IsDateDimension( nSrcDim ) ) { @@ -2549,20 +2537,17 @@ ScDPMember* ScDPMembers::getByIndex(long nIndex) const ScDPItemData aData(nGroupBy, nVal); SCROW nId = pSource->GetCache()->GetIdByItemData(nDim, aData); - pNew = new ScDPMember(pSource, nDim, nHier, nLev, nId); + pNew.set(new ScDPMember(pSource, nDim, nHier, nLev, nId)); } else { const std::vector<SCROW>& memberIndexs = pSource->GetData()->GetColumnEntries(nSrcDim); - pNew = new ScDPMember(pSource, nDim, nHier, nLev, memberIndexs[nIndex]); + pNew.set(new ScDPMember(pSource, nDim, nHier, nLev, memberIndexs[nIndex])); } - pNew->acquire(); // ref-counted - ppMbrs[nIndex] = pNew; + maMembers[nIndex] = pNew; } - OSL_ENSURE( ppMbrs[nIndex] ," member is not initialized " ); - - return ppMbrs[nIndex]; + return maMembers[nIndex].get(); } return NULL; //! exception? commit 3ec7ba96cf945b203297cf597c0514dc6bd9eeeb Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Fri Mar 9 21:54:02 2012 -0500 These don't have to be virtual. diff --git a/sc/inc/dptabsrc.hxx b/sc/inc/dptabsrc.hxx index 6db6ea4..b43e795 100644 --- a/sc/inc/dptabsrc.hxx +++ b/sc/inc/dptabsrc.hxx @@ -718,8 +718,8 @@ public: virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames() throw(::com::sun::star::uno::RuntimeException); - virtual long getCount() const; - virtual ScDPMember* getByIndex(long nIndex) const; + long getCount() const; + ScDPMember* getByIndex(long nIndex) const; long getMinMembers() const; commit bdd349501eb3df24830d2daf2338a7a422a8e00c Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Fri Mar 9 21:29:31 2012 -0500 Keep vector as vector. diff --git a/sc/inc/dpgroup.hxx b/sc/inc/dpgroup.hxx index be7d39c..b81db64 100644 --- a/sc/inc/dpgroup.hxx +++ b/sc/inc/dpgroup.hxx @@ -163,7 +163,7 @@ class ScDPGroupTableData : public ScDPTableData ScDocument* pDoc; StringHashSet aGroupNames; - void FillGroupValues( SCROW* pItemDataIndex, long nCount, const long* pDims ); + void FillGroupValues(std::vector<SCROW>& rItems, const std::vector<long>& rDims); virtual long GetSourceDim( long nDim ); bool IsNumGroupDimension( long nDimension ) const; diff --git a/sc/source/core/data/dpgroup.cxx b/sc/source/core/data/dpgroup.cxx index 73a9d10..bcd7032 100644 --- a/sc/source/core/data/dpgroup.cxx +++ b/sc/source/core/data/dpgroup.cxx @@ -788,11 +788,11 @@ void ScDPGroupTableData::CalcResults(CalcInfo& rInfo, bool bAutoShow) FillRowDataFromCacheTable(nRow, rCacheTable, rInfo, aData); if ( !rInfo.aColLevelDims.empty() ) - FillGroupValues(&aData.aColData[0], rInfo.aColLevelDims.size(), &rInfo.aColLevelDims[0]); + FillGroupValues(aData.aColData, rInfo.aColLevelDims); if ( !rInfo.aRowLevelDims.empty() ) - FillGroupValues(&aData.aRowData[0], rInfo.aRowLevelDims.size(), &rInfo.aRowLevelDims[0]); + FillGroupValues(aData.aRowData, rInfo.aRowLevelDims); if ( !rInfo.aPageDims.empty() ) - FillGroupValues(&aData.aPageData[0], rInfo.aPageDims.size(), &rInfo.aPageDims[0]); + FillGroupValues(aData.aPageData, rInfo.aPageDims); ProcessRowData(rInfo, aData, bAutoShow); } @@ -803,16 +803,17 @@ const ScDPCacheTable& ScDPGroupTableData::GetCacheTable() const return pSourceData->GetCacheTable(); } -void ScDPGroupTableData::FillGroupValues(SCROW* pItemDataIndex, long nCount, const long* pDims) +void ScDPGroupTableData::FillGroupValues(vector<SCROW>& rItems, const vector<long>& rDims) { long nGroupedColumns = aGroups.size(); const ScDPCache* pCache = GetCacheTable().getCache(); - for (long nDim = 0; nDim < nCount; ++nDim) + vector<long>::const_iterator it = rDims.begin(), itEnd = rDims.end(); + for (size_t i = 0; it != itEnd; ++it, ++i) { + long nColumn = *it; const ScDPDateGroupHelper* pDateHelper = NULL; - long nColumn = pDims[nDim]; long nSourceDim = nColumn; if ( nColumn >= nSourceCount && nColumn < nSourceCount + nGroupedColumns ) { @@ -821,15 +822,15 @@ void ScDPGroupTableData::FillGroupValues(SCROW* pItemDataIndex, long nCount, con pDateHelper = rGroupDim.GetDateHelper(); if (!pDateHelper) // date is handled below { - const ScDPItemData& rItem = *GetMemberById(nSourceDim, pItemDataIndex[nDim]); + const ScDPItemData& rItem = *GetMemberById(nSourceDim, rItems[i]); const ScDPGroupItem* pGroupItem = rGroupDim.GetGroupForData(rItem); if (pGroupItem) { - pItemDataIndex[nDim] = + rItems[i] = pCache->GetIdByItemData(nColumn, pGroupItem->GetName()); } else - pItemDataIndex[nDim] = pCache->GetIdByItemData(nColumn, rItem); + rItems[i] = pCache->GetIdByItemData(nColumn, rItem); } } else if ( IsNumGroupDimension( nColumn ) ) @@ -837,7 +838,7 @@ void ScDPGroupTableData::FillGroupValues(SCROW* pItemDataIndex, long nCount, con pDateHelper = pNumGroups[nColumn].GetDateHelper(); if (!pDateHelper) // date is handled below { - const ScDPItemData* pData = pCache->GetItemDataById(nSourceDim, pItemDataIndex[nDim]); + const ScDPItemData* pData = pCache->GetItemDataById(nSourceDim, rItems[i]); if (pData->GetType() == ScDPItemData::Value) { ScDPNumGroupInfo aNumInfo; @@ -845,7 +846,7 @@ void ScDPGroupTableData::FillGroupValues(SCROW* pItemDataIndex, long nCount, con double fGroupValue = ScDPUtil::getNumGroupStartValue(pData->GetValue(), aNumInfo); ScDPItemData aItemData; aItemData.SetRangeStart(fGroupValue); - pItemDataIndex[nDim] = pCache->GetIdByItemData(nSourceDim, aItemData); + rItems[i] = pCache->GetIdByItemData(nSourceDim, aItemData); } // else (textual) keep original value } @@ -854,7 +855,7 @@ void ScDPGroupTableData::FillGroupValues(SCROW* pItemDataIndex, long nCount, con if ( pDateHelper ) { const ScDPItemData* pData = - GetCacheTable().getCache()->GetItemDataById(nSourceDim, pItemDataIndex[nDim]); + GetCacheTable().getCache()->GetItemDataById(nSourceDim, rItems[i]); if (pData->GetType() == ScDPItemData::Value) { SvNumberFormatter* pFormatter = pDoc->GetFormatTable(); @@ -865,7 +866,7 @@ void ScDPGroupTableData::FillGroupValues(SCROW* pItemDataIndex, long nCount, con pDateHelper->GetDatePart(), nPartValue, pFormatter, rNumInfo.mfStart, rNumInfo.mfEnd); ScDPItemData aItem(pDateHelper->GetDatePart(), nPartValue); - pItemDataIndex[nDim] = GetCacheTable().getCache()->GetIdByItemData(nColumn, aItem); + rItems[i] = GetCacheTable().getCache()->GetIdByItemData(nColumn, aItem); } } } diff --git a/sc/source/core/data/dptabres.cxx b/sc/source/core/data/dptabres.cxx index a14c53a..3372d68 100644 --- a/sc/source/core/data/dptabres.cxx +++ b/sc/source/core/data/dptabres.cxx @@ -3012,10 +3012,10 @@ void ScDPResultDimension::ProcessData( const vector< SCROW >& aMembers, ScDPResultMember* pMember = FindMember( aMembers[0] ); if ( NULL != pMember ) { - vector</*ScDPItemData*/SCROW > aChildMembers; + vector<SCROW> aChildMembers; if (aMembers.size() > 1) { - vector</*ScDPItemData*/SCROW >::const_iterator itr = aMembers.begin(); + vector<SCROW>::const_iterator itr = aMembers.begin(); aChildMembers.insert(aChildMembers.begin(), ++itr, aMembers.end()); } pMember->ProcessData( aChildMembers, pDataDim, aDataMembers, aValues ); _______________________________________________ Libreoffice-commits mailing list Libreoffice-commits@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits