PulseView  0.3.0
A Qt-based sigrok GUI
viewitemiterator.hpp
Go to the documentation of this file.
1 /*
2  * This file is part of the PulseView project.
3  *
4  * Copyright (C) 2014 Joel Holdsworth <joel@airwebreathe.org.uk>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 #ifndef PULSEVIEW_PV_VIEW_VIEWITEMITERATOR_HPP
22 #define PULSEVIEW_PV_VIEW_VIEWITEMITERATOR_HPP
23 
24 #include <algorithm>
25 #include <cassert>
26 #include <iterator>
27 #include <memory>
28 #include <stack>
29 #include <type_traits>
30 #include <vector>
31 
32 #include <pv/session.hpp>
33 
34 namespace pv {
35 namespace view {
36 
37 template<class Owner, class Item> class ViewItemIterator
38 {
39 public:
40  typedef typename Owner::item_list::const_iterator child_iterator;
41  typedef std::shared_ptr<Item> value_type;
42  typedef ptrdiff_t difference_type;
43  typedef value_type pointer;
44  typedef const value_type& reference;
45  typedef std::forward_iterator_tag iterator_category;
46 
47 public:
48  ViewItemIterator(Owner *owner) :
49  owner_stack_({owner}) {}
50 
51  ViewItemIterator(Owner *owner, child_iterator iter) :
52  owner_stack_({owner}) {
53  assert(owner);
54  if (iter != owner->child_items().end())
55  iter_stack_.push(iter);
56  }
57 
61 
62  reference operator*() const {
63  return *iter_stack_.top();
64  }
65 
66  reference operator->() const {
67  return *this;
68  }
69 
71  using std::dynamic_pointer_cast;
72  using std::shared_ptr;
73 
74  assert(!owner_stack_.empty());
75  assert(!iter_stack_.empty());
76 
77  shared_ptr<Owner> owner(dynamic_pointer_cast<Owner>(
78  *iter_stack_.top()));
79  if (owner && !owner->child_items().empty()) {
80  owner_stack_.push(owner.get());
81  iter_stack_.push(owner->child_items().begin());
82  } else {
83  while (!iter_stack_.empty() && (++iter_stack_.top()) ==
84  owner_stack_.top()->child_items().end()) {
85  owner_stack_.pop();
86  iter_stack_.pop();
87  }
88  }
89 
90  return *this;
91  }
92 
95  ++*this;
96  return pre;
97  }
98 
99  bool operator==(const ViewItemIterator &o) const {
100  return (iter_stack_.empty() && o.iter_stack_.empty()) || (
101  iter_stack_.size() == o.iter_stack_.size() &&
102  owner_stack_.top() == o.owner_stack_.top() &&
103  iter_stack_.top() == o.iter_stack_.top());
104  }
105 
106  bool operator!=(const ViewItemIterator &o) const {
107  return !((const ViewItemIterator&)*this == o);
108  }
109 
112  swap(iter_stack_, other.iter_stack_);
113  }
114 
115 private:
116  std::stack<Owner*> owner_stack_;
117  std::stack<child_iterator> iter_stack_;
118 };
119 
120 template<class Owner, class Item>
122 {
123  a.swap(b);
124 }
125 
126 } // namespace view
127 } // namespace pv
128 
129 #endif // PULSEVIEW_PV_VIEW_VIEWITEMITERATOR_HPP
bool operator==(const ViewItemIterator &o) const
ViewItemIterator(Owner *owner, child_iterator iter)
std::stack< Owner * > owner_stack_
const value_type & reference
reference operator*() const
ViewItemIterator(const ViewItemIterator< Owner, Item > &o)
ViewItemIterator< Owner, Item > operator++(int)
reference operator->() const
void swap(ViewItemIterator< Owner, Item > &other)
void swap(ViewItemIterator< Owner, Item > &a, ViewItemIterator< Owner, Item > &b)
Owner::item_list::const_iterator child_iterator
std::shared_ptr< Item > value_type
ViewItemIterator< Owner, Item > & operator++()
std::forward_iterator_tag iterator_category
std::stack< child_iterator > iter_stack_
bool operator!=(const ViewItemIterator &o) const