2 * @file DirItemIterator.h
4 * @brief Declaration DirItemIterator classes.
6 // ID line follows -- this is updated by SVN
13 #include "IListCtrl.h"
17 class DirItemWithIndexIterator : public std::iterator<std::forward_iterator_tag, std::pair<int, DIFFITEM *> >
20 explicit DirItemWithIndexIterator(IListCtrl *pList, int sel = -1, bool selected = false, bool reverse = false) :
21 m_pList(pList), m_sel(sel), m_selected(selected), m_reverse(reverse)
27 int last = m_pList->GetRowCount() - 1;
28 if (!m_selected || m_pList->IsSelectedItem(last))
31 m_sel = m_pList->GetNextItem(last, m_selected, m_reverse);
34 m_sel = m_pList->GetNextItem(-1, m_selected, m_reverse);
38 if (m_pList->GetItemData(m_sel) == reinterpret_cast<void *>((uintptr_t)-1L))
40 if (m_reverse && m_sel == 0)
43 m_sel = m_pList->GetNextItem(m_sel, m_selected, m_reverse);
48 DirItemWithIndexIterator() : m_pList(NULL), m_sel(-1), m_selected(false), m_reverse(false)
52 ~DirItemWithIndexIterator() {}
54 DirItemWithIndexIterator& operator=(const DirItemWithIndexIterator& it)
58 m_selected = it.m_selected;
59 m_reverse = it.m_reverse;
63 DirItemWithIndexIterator& operator++()
65 m_sel = m_pList->GetNextItem(m_sel, m_selected, m_reverse);
69 std::pair<int, DIFFITEM *> operator*()
71 return std::make_pair(m_sel, reinterpret_cast<DIFFITEM *>(m_pList->GetItemData(m_sel)));
74 bool operator==(const DirItemWithIndexIterator& it) const
76 return m_sel == it.m_sel;
79 bool operator!=(const DirItemWithIndexIterator& it) const
81 return m_sel != it.m_sel;
92 class DirItemIterator : public std::iterator<std::forward_iterator_tag, DIFFITEM*>
95 explicit DirItemIterator(IListCtrl *pList, int sel = -1, bool selected = false, bool reverse = false) :
96 m_pList(pList), m_sel(sel), m_selected(selected), m_reverse(reverse), m_pdi(nullptr)
102 int last = m_pList->GetRowCount() - 1;
103 if (!m_selected || m_pList->IsSelectedItem(last))
106 m_sel = m_pList->GetNextItem(last, m_selected, m_reverse);
109 m_sel = m_pList->GetNextItem(-1, m_selected, m_reverse);
113 m_pdi = reinterpret_cast<const DIFFITEM *>(m_pList->GetItemData(m_sel));
114 if (m_pdi == reinterpret_cast<const DIFFITEM *>(-1L))
116 if (m_reverse && m_sel == 0)
120 m_sel = m_pList->GetNextItem(m_sel, m_selected, m_reverse);
121 m_pdi = reinterpret_cast<const DIFFITEM *>(m_pList->GetItemData(m_sel));
124 else if (m_pdi == nullptr)
131 DirItemIterator() : m_pList(nullptr), m_sel(-1), m_selected(false), m_reverse(false), m_pdi(nullptr)
135 ~DirItemIterator() {}
137 DirItemIterator& operator=(const DirItemIterator& it)
140 m_pList = it.m_pList;
142 m_selected = it.m_selected;
143 m_reverse = it.m_reverse;
147 DirItemIterator& operator++()
149 if (m_reverse && m_sel <= 0)
152 m_pdi = reinterpret_cast<const DIFFITEM *>(-1L);
156 m_sel = m_pList->GetNextItem(m_sel, m_selected, m_reverse);
157 m_pdi = reinterpret_cast<const DIFFITEM *>(m_pList->GetItemData(m_sel));
158 if (m_pdi == reinterpret_cast<const DIFFITEM *>(-1L))
164 DIFFITEM& operator*()
166 return *const_cast<DIFFITEM *>(m_pdi);
169 const DIFFITEM& operator*() const
174 bool operator==(const DirItemIterator& it) const
176 return m_sel == it.m_sel;
179 bool operator!=(const DirItemIterator& it) const
181 return m_sel != it.m_sel;
187 const DIFFITEM *m_pdi;