diff options
Diffstat (limited to 'svl/source/items/itemiter.cxx')
-rw-r--r-- | svl/source/items/itemiter.cxx | 62 |
1 files changed, 34 insertions, 28 deletions
diff --git a/svl/source/items/itemiter.cxx b/svl/source/items/itemiter.cxx index a42a90bc2358..e1e8baade8be 100644 --- a/svl/source/items/itemiter.cxx +++ b/svl/source/items/itemiter.cxx @@ -25,44 +25,50 @@ SfxItemIter::SfxItemIter( const SfxItemSet& rItemSet ) : m_rSet( rItemSet ) { - if (!m_rSet.m_nCount) - { - m_nStart = 1; - m_nEnd = 0; + // store the set of keys because client code likes modifying the map + // while iterating over it + m_keys.resize(rItemSet.m_aItems.size()); + size_t idx = 0; + for (auto const & rPair : rItemSet.m_aItems) { + m_keys[idx++] = rPair.first; } - else - { - SfxItemArray ppFnd = m_rSet.m_pItems; + m_iter = m_keys.begin(); +} - // Find the first Item that is set - for (m_nStart = 0; !*(ppFnd + m_nStart ); ++m_nStart) - ; // empty loop - if (1 < m_rSet.Count()) - for (m_nEnd = m_rSet.TotalCount(); !*(ppFnd + --m_nEnd); ) - ; // empty loop - else - m_nEnd = m_nStart; - } +SfxItemIter::~SfxItemIter() +{ +} - m_nCurrent = m_nStart; +SfxPoolItem const * SfxItemIter::FirstItem() +{ + m_iter = m_keys.begin(); + return GetCurItem(); } -SfxItemIter::~SfxItemIter() +SfxPoolItem const * SfxItemIter::GetCurItem() { + if (m_keys.empty()) + return nullptr; + auto it = m_rSet.m_aItems.find(*m_iter); + if (it == m_rSet.m_aItems.end()) + return nullptr; + return it->second; } -const SfxPoolItem* SfxItemIter::NextItem() +SfxPoolItem const * SfxItemIter::NextItem() { - SfxItemArray ppFnd = m_rSet.m_pItems; + if (m_iter == m_keys.end()) + return nullptr; + ++m_iter; + if (m_iter == m_keys.end()) + return nullptr; + return GetCurItem(); +} - if (m_nCurrent < m_nEnd) - { - do { - m_nCurrent++; - } while (m_nCurrent < m_nEnd && !*(ppFnd + m_nCurrent )); - return *(ppFnd+m_nCurrent); - } - return nullptr; +bool SfxItemIter::IsAtEnd() const +{ + return m_iter == m_keys.end() || std::next(m_iter) == m_keys.end(); } + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |