23 #ifndef SRC_SIMPLEX_TREE_INCLUDE_GUDHI_SIMPLEX_TREE_SIMPLEX_TREE_ITERATORS_H_
24 #define SRC_SIMPLEX_TREE_INCLUDE_GUDHI_SIMPLEX_TREE_SIMPLEX_TREE_ITERATORS_H_
26 #include <boost/iterator/iterator_facade.hpp>
41 template<
class SimplexTree>
42 class Simplex_tree_simplex_vertex_iterator :
public boost::iterator_facade<
43 Simplex_tree_simplex_vertex_iterator<SimplexTree>,
44 typename SimplexTree::Vertex_handle const, boost::forward_traversal_tag,
45 typename SimplexTree::Vertex_handle const> {
47 typedef typename SimplexTree::Simplex_handle Simplex_handle;
48 typedef typename SimplexTree::Siblings Siblings;
49 typedef typename SimplexTree::Vertex_handle Vertex_handle;
51 explicit Simplex_tree_simplex_vertex_iterator(SimplexTree * st)
54 v_(st->null_vertex()) {
57 Simplex_tree_simplex_vertex_iterator(SimplexTree * st, Simplex_handle sh)
58 : sib_(st->self_siblings(sh)),
63 friend class boost::iterator_core_access;
65 bool equal(Simplex_tree_simplex_vertex_iterator
const &other)
const {
66 return sib_ == other.sib_ && v_ == other.v_;
69 Vertex_handle
const& dereference()
const {
75 sib_ = sib_->oncles();
87 template<
class SimplexTree>
88 class Simplex_tree_boundary_simplex_iterator :
public boost::iterator_facade<
89 Simplex_tree_boundary_simplex_iterator<SimplexTree>,
90 typename SimplexTree::Simplex_handle const, boost::forward_traversal_tag> {
92 typedef typename SimplexTree::Simplex_handle Simplex_handle;
93 typedef typename SimplexTree::Vertex_handle Vertex_handle;
94 typedef typename SimplexTree::Siblings Siblings;
97 explicit Simplex_tree_boundary_simplex_iterator(SimplexTree * st)
98 : last_(st->null_vertex()),
102 Simplex_tree_boundary_simplex_iterator(SimplexTree * st, Simplex_handle sh)
106 Siblings * sib = st->self_siblings(sh);
107 next_ = sib->parent();
108 sib_ = sib->oncles();
110 sh_ = sib_->find(next_);
112 last_ = st->null_vertex();
117 friend class boost::iterator_core_access;
119 bool equal(Simplex_tree_boundary_simplex_iterator
const& other)
const {
120 return (sib_ == other.sib_ && last_ == other.last_);
123 Simplex_handle
const& dereference()
const {
129 last_ = st_->null_vertex();
133 Siblings * for_sib = sib_;
134 for (
typename std::vector<Vertex_handle>::reverse_iterator rit = suffix_
135 .rbegin(); rit != suffix_.rend(); ++rit) {
136 sh_ = for_sib->find(*rit);
137 for_sib = sh_->second.children();
139 sh_ = for_sib->find(last_);
140 suffix_.push_back(next_);
141 next_ = sib_->parent();
142 sib_ = sib_->oncles();
147 std::vector<Vertex_handle> suffix_;
156 template<
class SimplexTree>
157 class Simplex_tree_complex_simplex_iterator :
public boost::iterator_facade<
158 Simplex_tree_complex_simplex_iterator<SimplexTree>,
159 typename SimplexTree::Simplex_handle const, boost::forward_traversal_tag> {
161 typedef typename SimplexTree::Simplex_handle Simplex_handle;
162 typedef typename SimplexTree::Siblings Siblings;
163 typedef typename SimplexTree::Vertex_handle Vertex_handle;
166 Simplex_tree_complex_simplex_iterator()
170 explicit Simplex_tree_complex_simplex_iterator(SimplexTree * st)
172 if (st == NULL || st->root() == NULL || st->root()->members().empty()) {
175 sh_ = st->root()->members().begin();
177 while (st->has_children(sh_)) {
178 sib_ = sh_->second.children();
179 sh_ = sib_->members().begin();
184 friend class boost::iterator_core_access;
187 bool equal(Simplex_tree_complex_simplex_iterator
const& other)
const {
188 if (other.st_ == NULL) {
189 return (st_ == NULL);
194 return (&(sh_->second) == &(other.sh_->second));
197 Simplex_handle
const& dereference()
const {
204 if (sh_ == sib_->members().end()) {
205 if (sib_->oncles() == NULL) {
209 sh_ = sib_->oncles()->members().find(sib_->parent());
210 sib_ = sib_->oncles();
213 while (st_->has_children(sh_)) {
214 sib_ = sh_->second.children();
215 sh_ = sib_->members().begin();
228 template<
class SimplexTree>
229 class Simplex_tree_skeleton_simplex_iterator :
public boost::iterator_facade<
230 Simplex_tree_skeleton_simplex_iterator<SimplexTree>,
231 typename SimplexTree::Simplex_handle const, boost::forward_traversal_tag> {
233 typedef typename SimplexTree::Simplex_handle Simplex_handle;
234 typedef typename SimplexTree::Siblings Siblings;
235 typedef typename SimplexTree::Vertex_handle Vertex_handle;
238 Simplex_tree_skeleton_simplex_iterator()
242 Simplex_tree_skeleton_simplex_iterator(SimplexTree * st,
int dim_skel)
246 if (st == NULL || st->root() == NULL || st->root()->members().empty()) {
249 sh_ = st->root()->members().begin();
251 while (st->has_children(sh_) && curr_dim_ < dim_skel_) {
252 sib_ = sh_->second.children();
253 sh_ = sib_->members().begin();
259 friend class boost::iterator_core_access;
262 bool equal(Simplex_tree_skeleton_simplex_iterator
const& other)
const {
263 if (other.st_ == NULL) {
264 return (st_ == NULL);
269 return (&(sh_->second) == &(other.sh_->second));
272 Simplex_handle
const& dereference()
const {
279 if (sh_ == sib_->members().end()) {
280 if (sib_->oncles() == NULL) {
284 sh_ = sib_->oncles()->members().find(sib_->parent());
285 sib_ = sib_->oncles();
289 while (st_->has_children(sh_) && curr_dim_ < dim_skel_) {
290 sib_ = sh_->second.children();
291 sh_ = sib_->members().begin();
306 #endif // SRC_SIMPLEX_TREE_INCLUDE_GUDHI_SIMPLEX_TREE_SIMPLEX_TREE_ITERATORS_H_