2 * @file DirItemIterator.h
4 * @brief Declaration DirItemIterator classes.
11 #include "IListCtrl.h"
15 class DirItemWithIndexIterator : public std::iterator<std::forward_iterator_tag, std::pair<int, DIFFITEM *> >
18 explicit DirItemWithIndexIterator(IListCtrl *pList, int sel = -1, bool selected = false, bool reverse = false) :
19 m_pList(pList), m_sel(sel), m_selected(selected), m_reverse(reverse)
25 int last = m_pList->GetRowCount() - 1;
26 if (!m_selected || m_pList->IsSelectedItem(last))
29 m_sel = m_pList->GetNextItem(last, m_selected, m_reverse);
32 m_sel = m_pList->GetNextItem(-1, m_selected, m_reverse);
36 if (m_pList->GetItemData(m_sel) == reinterpret_cast<void *>((uintptr_t)-1L))
38 if (m_reverse && m_sel == 0)
41 m_sel = m_pList->GetNextItem(m_sel, m_selected, m_reverse);
46 DirItemWithIndexIterator() : m_pList(NULL), m_sel(-1), m_selected(false), m_reverse(false)
50 ~DirItemWithIndexIterator() = default;
52 DirItemWithIndexIterator& operator=(const DirItemWithIndexIterator& it)
56 m_selected = it.m_selected;
57 m_reverse = it.m_reverse;
61 DirItemWithIndexIterator& operator++()
63 m_sel = m_pList->GetNextItem(m_sel, m_selected, m_reverse);
67 std::pair<int, DIFFITEM *> operator*()
69 return std::make_pair(m_sel, reinterpret_cast<DIFFITEM *>(m_pList->GetItemData(m_sel)));
72 bool operator==(const DirItemWithIndexIterator& it) const
74 return m_sel == it.m_sel;
77 bool operator!=(const DirItemWithIndexIterator& it) const
79 return m_sel != it.m_sel;
90 class DirItemIterator : public std::iterator<std::forward_iterator_tag, DIFFITEM*>
93 explicit DirItemIterator(IListCtrl *pList, int sel = -1, bool selected = false, bool reverse = false) :
94 m_pList(pList), m_sel(sel), m_selected(selected), m_reverse(reverse), m_pdi(nullptr)
100 int last = m_pList->GetRowCount() - 1;
101 if (!m_selected || m_pList->IsSelectedItem(last))
104 m_sel = m_pList->GetNextItem(last, m_selected, m_reverse);
107 m_sel = m_pList->GetNextItem(-1, m_selected, m_reverse);
111 m_pdi = reinterpret_cast<const DIFFITEM *>(m_pList->GetItemData(m_sel));
112 if (m_pdi == reinterpret_cast<const DIFFITEM *>(-1L))
114 if (m_reverse && m_sel == 0)
118 m_sel = m_pList->GetNextItem(m_sel, m_selected, m_reverse);
119 m_pdi = reinterpret_cast<const DIFFITEM *>(m_pList->GetItemData(m_sel));
122 else if (m_pdi == nullptr)
129 DirItemIterator() : m_pList(nullptr), m_sel(-1), m_selected(false), m_reverse(false), m_pdi(nullptr)
133 ~DirItemIterator() = default;
135 DirItemIterator::DirItemIterator(const DirItemIterator& it)
138 m_pList = it.m_pList;
140 m_selected = it.m_selected;
141 m_reverse = it.m_reverse;
144 DirItemIterator& operator=(const DirItemIterator& it)
147 m_pList = it.m_pList;
149 m_selected = it.m_selected;
150 m_reverse = it.m_reverse;
154 DirItemIterator& operator++()
156 if (m_reverse && m_sel <= 0)
159 m_pdi = reinterpret_cast<const DIFFITEM *>(-1L);
163 m_sel = m_pList->GetNextItem(m_sel, m_selected, m_reverse);
164 m_pdi = reinterpret_cast<const DIFFITEM *>(m_pList->GetItemData(m_sel));
165 if (m_pdi == reinterpret_cast<const DIFFITEM *>(-1L))
171 DIFFITEM& operator*()
173 return *const_cast<DIFFITEM *>(m_pdi);
176 const DIFFITEM& operator*() const
181 bool operator==(const DirItemIterator& it) const
183 return m_sel == it.m_sel;
186 bool operator!=(const DirItemIterator& it) const
188 return m_sel != it.m_sel;
194 const DIFFITEM *m_pdi;