sc/inc/conditio.hxx | 20 +++++++++++++++++++- sc/source/core/data/conditio.cxx | 30 ++++++++++-------------------- 2 files changed, 29 insertions(+), 21 deletions(-)
New commits: commit 941df80853cb6ab729f713eeb75984ba6dfec4ab Author: Noel Grandin <noel.gran...@collabora.co.uk> AuthorDate: Mon Feb 11 09:38:17 2019 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Mon Feb 11 10:35:45 2019 +0100 ScConditionalFormatList, don't use linear search we can use the nice new C++14 compare methods to do this properly Change-Id: Ic2a8e46747c4a105d93d32b5f58a061a2e0d4e26 Reviewed-on: https://gerrit.libreoffice.org/67666 Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> Tested-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/sc/inc/conditio.hxx b/sc/inc/conditio.hxx index 36703a7d2017..ae1097078c15 100644 --- a/sc/inc/conditio.hxx +++ b/sc/inc/conditio.hxx @@ -595,12 +595,30 @@ public: void CalcAll(); }; +struct CompareScConditionalFormat +{ + using is_transparent = void; + bool operator()(std::unique_ptr<ScConditionalFormat> const& lhs, + std::unique_ptr<ScConditionalFormat> const& rhs) const + { + return (*lhs) < (*rhs); + } + bool operator()(sal_uInt32 nKey, std::unique_ptr<ScConditionalFormat> const& rpFormat) const + { + return nKey < rpFormat->GetKey(); + } + bool operator()(std::unique_ptr<ScConditionalFormat> const& rpFormat, sal_uInt32 nKey) const + { + return rpFormat->GetKey() < nKey; + } +}; + // List of all conditional formats in a sheet class SC_DLLPUBLIC ScConditionalFormatList { private: typedef std::set<std::unique_ptr<ScConditionalFormat>, - comphelper::UniquePtrValueLess<ScConditionalFormat>> ConditionalFormatContainer; + CompareScConditionalFormat> ConditionalFormatContainer; ConditionalFormatContainer m_ConditionalFormats; void operator =(ScConditionalFormatList const &) = delete; diff --git a/sc/source/core/data/conditio.cxx b/sc/source/core/data/conditio.cxx index 81160bae754d..c992bd6f3ec3 100644 --- a/sc/source/core/data/conditio.cxx +++ b/sc/source/core/data/conditio.cxx @@ -2047,10 +2047,8 @@ void ScConditionalFormatList::InsertNew( std::unique_ptr<ScConditionalFormat> pN ScConditionalFormat* ScConditionalFormatList::GetFormat( sal_uInt32 nKey ) { - //FIXME: Binary search - iterator itr = std::find_if(begin(), end(), - [&nKey](const std::unique_ptr<ScConditionalFormat>& rxFormat) { return rxFormat->GetKey() == nKey; }); - if (itr != end()) + auto itr = m_ConditionalFormats.find(nKey); + if (itr != m_ConditionalFormats.end()) return itr->get(); SAL_WARN("sc", "ScConditionalFormatList: Entry not found"); @@ -2059,10 +2057,8 @@ ScConditionalFormat* ScConditionalFormatList::GetFormat( sal_uInt32 nKey ) const ScConditionalFormat* ScConditionalFormatList::GetFormat( sal_uInt32 nKey ) const { - //FIXME: Binary search - const_iterator itr = std::find_if(begin(), end(), - [&nKey](const std::unique_ptr<ScConditionalFormat>& rxFormat) { return rxFormat->GetKey() == nKey; }); - if (itr != end()) + auto itr = m_ConditionalFormats.find(nKey); + if (itr != m_ConditionalFormats.end()) return itr->get(); SAL_WARN("sc", "ScConditionalFormatList: Entry not found"); @@ -2152,8 +2148,8 @@ bool ScConditionalFormatList::CheckAllEntries(const Link<ScConditionalFormat*,vo bool bValid = true; // need to check which must be deleted - iterator itr = begin(); - while(itr != end()) + iterator itr = m_ConditionalFormats.begin(); + while(itr != m_ConditionalFormats.end()) { if ((*itr)->GetRange().empty()) { @@ -2245,8 +2241,7 @@ bool ScConditionalFormatList::empty() const void ScConditionalFormatList::erase( sal_uLong nIndex ) { - iterator itr = std::find_if(begin(), end(), - [&nIndex](const std::unique_ptr<ScConditionalFormat>& rxFormat) { return rxFormat->GetKey() == nIndex; }); + auto itr = m_ConditionalFormats.find(nIndex); if (itr != end()) m_ConditionalFormats.erase(itr); } @@ -2274,14 +2269,9 @@ void ScConditionalFormatList::clear() sal_uInt32 ScConditionalFormatList::getMaxKey() const { - sal_uInt32 nMax = 0; - for (const auto& aEntry : m_ConditionalFormats) - { - if (aEntry->GetKey() > nMax) - nMax = aEntry->GetKey(); - } - - return nMax; + if (m_ConditionalFormats.empty()) + return 0; + return (*m_ConditionalFormats.rbegin())->GetKey(); } void ScConditionalFormatList::CalcAll() _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits