11#ifndef SIMPLEX_TREE_SIMPLEX_TREE_STAR_SIMPLEX_ITERATORS_H_
12#define SIMPLEX_TREE_SIMPLEX_TREE_STAR_SIMPLEX_ITERATORS_H_
14#include <gudhi/Debug_utils.h>
15#include <boost/iterator/iterator_facade.hpp>
16#include <boost/version.hpp>
17#include <boost/iterator/filter_iterator.hpp>
45template <
class SimplexTree>
46class Simplex_tree_optimized_cofaces_rooted_subtrees_simplex_iterator
47 :
public boost::iterator_facade<Simplex_tree_optimized_cofaces_rooted_subtrees_simplex_iterator<SimplexTree>,
48 typename SimplexTree::Simplex_handle const, boost::forward_traversal_tag> {
54 using Static_vertex_vector =
typename SimplexTree::Static_vertex_vector;
75 bool operator()(
const typename SimplexTree::Hooks_simplex_base& curr_hooks) {
76 const Node& curr_node =
static_cast<const Node&
>(curr_hooks);
77 Simplex_handle sh = cpx_->simplex_handle_from_node(curr_node);
80 auto rng_it = rng.begin();
81 GUDHI_CHECK(*rng_it == simp_.front(), std::invalid_argument(
"first Node must always have label simp_.begin()"));
82 auto simp_it = simp_.begin();
84 return std::includes(++rng_it, rng.end(), ++simp_it, simp_.end(), std::greater<Vertex_handle>());
89 Static_vertex_vector simp_;
92 typedef boost::filter_iterator<is_coface, typename SimplexTree::List_max_vertex::const_iterator>
93 Filtered_cofaces_simplex_iterator;
95 Simplex_tree_optimized_cofaces_rooted_subtrees_simplex_iterator() : predicate_(), st_(nullptr) {}
97 Simplex_tree_optimized_cofaces_rooted_subtrees_simplex_iterator(
SimplexTree const* cpx,
98 Static_vertex_vector&& simp)
99 : predicate_(cpx,
std::move(simp)), st_(cpx) {
100 GUDHI_CHECK(!simp.empty(), std::invalid_argument(
"cannot call for cofaces of an empty simplex"));
101 const auto list_ptr = st_->nodes_by_label(simp.front());
102 GUDHI_CHECK(list_ptr !=
nullptr, std::runtime_error(
"invalid call to cofaces forest"));
104 it_ = boost::make_filter_iterator(predicate_, list_ptr->begin(), list_ptr->end());
105 end_ = boost::make_filter_iterator(predicate_, list_ptr->end(), list_ptr->end());
106 const Node& curr_node =
static_cast<const Node&
>(*it_);
107 sh_ = st_->simplex_handle_from_node(curr_node);
111 friend class boost::iterator_core_access;
114 bool equal(Simplex_tree_optimized_cofaces_rooted_subtrees_simplex_iterator
const& other)
const {
115 if (other.st_ ==
nullptr) {
116 return (st_ ==
nullptr);
118 if (st_ ==
nullptr) {
121 return (it_ == other.it_);
124 Simplex_handle
const& dereference()
const {
return sh_; }
131 const Node& curr_node =
static_cast<const Node&
>(*it_);
132 sh_ = st_->simplex_handle_from_node(curr_node);
138 is_coface predicate_;
141 Filtered_cofaces_simplex_iterator it_;
142 Filtered_cofaces_simplex_iterator end_;
159template <
class SimplexTree>
161 :
public boost::iterator_facade<Simplex_tree_optimized_star_simplex_iterator<SimplexTree>,
162 typename SimplexTree::Simplex_handle const, boost::forward_traversal_tag> {
168 using Static_vertex_vector =
typename SimplexTree::Static_vertex_vector;
174 : st_(cpx), it_(cpx, std::move(simp)), end_(), sh_(*it_), sib_(st_->self_siblings(sh_)), children_stack_() {
183 children_stack_.push_back(st_->children(sh_));
189 friend class boost::iterator_core_access;
193 if (other.st_ ==
nullptr) {
194 return (st_ ==
nullptr);
196 if (st_ ==
nullptr) {
199 return (&(sh_->second) == &(other.sh_->second));
202 Simplex_handle
const& dereference()
const {
return sh_; }
221 void increment_all_cofaces() {
224 if (is_root_ || sh_ == sib_->members().end()) {
226 if (!children_stack_.empty()) {
227 sib_ = children_stack_.back();
228 children_stack_.pop_back();
229 sh_ = sib_->members().begin();
231 children_stack_.push_back(st_->children(sh_));
242 children_stack_.push_back(st_->children(sh_));
248 children_stack_.push_back(st_->children(sh_));
255 void increment() { increment_all_cofaces(); }
263 Simplex_tree_optimized_cofaces_rooted_subtrees_simplex_iterator<SimplexTree> it_;
264 Simplex_tree_optimized_cofaces_rooted_subtrees_simplex_iterator<SimplexTree> end_;
268 Siblings
const* sib_;
270 std::vector<Siblings const*> children_stack_;
Predicate to check whether an input SimplexTree::Node represents a coface of a simplex simp_,...
Definition: Simplex_tree_star_simplex_iterators.h:68
Iterator over the simplices of the star of a simplex.
Definition: Simplex_tree_star_simplex_iterators.h:162
Simplex Tree data structure for representing simplicial complexes.
Definition: Simplex_tree.h:98
Siblings const * self_siblings(SimplexHandle sh) const
Definition: Simplex_tree.h:1154
Simplex_vertex_range simplex_vertex_range(Simplex_handle sh) const
Returns a range over the vertices of a simplex.
Definition: Simplex_tree.h:369
bool has_children(SimplexHandle sh) const
Returns true if the node in the simplex tree pointed by the given simplex handle has children.
Definition: Simplex_tree.h:874
Dictionary::const_iterator Simplex_handle
Handle type to a simplex contained in the simplicial complex represented by the simplex tree.
Definition: Simplex_tree.h:192
Simplex_tree_siblings< Simplex_tree, Dictionary > Siblings
Set of nodes sharing a same parent in the simplex tree.
Definition: Simplex_tree.h:136
Options::Vertex_handle Vertex_handle
Type for the vertex handle.
Definition: Simplex_tree.h:119
Gudhi namespace.
Definition: SimplicialComplexForAlpha.h:14
Node of a simplex tree with filtration value and simplex key.
Definition: Simplex_tree_node_explicit_storage.h:40
Handle type for the vertices of a cell complex.
Definition: VertexHandle.h:15