diff options
author | Kohei Yoshida <kyoshida@novell.com> | 2011-07-25 10:21:01 -0400 |
---|---|---|
committer | Michael Meeks <michael.meeks@novell.com> | 2011-07-25 15:45:42 +0100 |
commit | 75784460f325f4151c72f410f41ba7566f71f176 (patch) | |
tree | 6d3924401e3467c0ece20288744a561e954aa853 | |
parent | 5e8c9cd8f385351c795c35120b78610a4aed23af (diff) |
fdo#39236: Better way to remove DP objects without reversing order.
The old fix reversed the order of the elements even when no elements
were deleted. This is better & cleaner. Thanks to David Tardon for
suggesting me this.
Signed-off-by: Michael Meeks <michael.meeks@novell.com>
-rw-r--r-- | sc/source/core/data/dpobject.cxx | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/sc/source/core/data/dpobject.cxx b/sc/source/core/data/dpobject.cxx index 3aa7477cd..d87629ab0 100644 --- a/sc/source/core/data/dpobject.cxx +++ b/sc/source/core/data/dpobject.cxx @@ -83,6 +83,7 @@ using namespace com::sun::star; using ::std::vector; +using ::std::unary_function; using ::boost::shared_ptr; using ::com::sun::star::uno::Sequence; using ::com::sun::star::uno::Reference; @@ -2554,6 +2555,25 @@ ScDPCollection::~ScDPCollection() maTables.clear(); } +namespace { + +/** + * Unary predicate to match DP objects by the table ID. + */ +class MatchByTable : public unary_function<ScDPObject, bool> +{ + SCTAB mnTab; +public: + MatchByTable(SCTAB nTab) : mnTab(nTab) {} + + bool operator() (const ScDPObject& rObj) const + { + return rObj.GetOutRange().aStart.Tab() == mnTab; + } +}; + +} + bool ScDPCollection::ClearCache(ScDPObject* pDPObj) { if (pDPObj->IsSheetData()) @@ -2591,15 +2611,7 @@ bool ScDPCollection::ClearCache(ScDPObject* pDPObj) void ScDPCollection::DeleteOnTab( SCTAB nTab ) { - TablesType aNewTables; - while (!maTables.empty()) - { - TablesType::auto_type xDP = maTables.pop_back(); - if (xDP->GetOutRange().aStart.Tab() != nTab) - // Not on this sheet. Keep it. - aNewTables.push_back(xDP.release()); - } - maTables.swap(aNewTables); + maTables.erase_if(MatchByTable(nTab)); } void ScDPCollection::UpdateReference( UpdateRefMode eUpdateRefMode, |