summaryrefslogtreecommitdiff
path: root/svl/source/items/itemiter.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'svl/source/items/itemiter.cxx')
-rw-r--r--svl/source/items/itemiter.cxx62
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: */