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> {
53 using Node =
typename SimplexTree::Node;
54 using Static_vertex_vector =
typename SimplexTree::Static_vertex_vector;
70 is_coface() : cpx_(
nullptr) {}
71 is_coface(SimplexTree
const* cpx, Static_vertex_vector&& simp) : cpx_(cpx), simp_(simp) {}
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);
79 auto&& rng = cpx_->simplex_vertex_range(sh);
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>());
88 SimplexTree
const* cpx_;
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);
139 SimplexTree
const* st_;
141 Filtered_cofaces_simplex_iterator it_;
142 Filtered_cofaces_simplex_iterator end_;
159template <
class SimplexTree>
160class Simplex_tree_optimized_star_simplex_iterator
161 :
public boost::iterator_facade<Simplex_tree_optimized_star_simplex_iterator<SimplexTree>,
162 typename SimplexTree::Simplex_handle const, boost::forward_traversal_tag> {
167 using Node =
typename SimplexTree::Node;
168 using Static_vertex_vector =
typename SimplexTree::Static_vertex_vector;
171 Simplex_tree_optimized_star_simplex_iterator() : st_(
nullptr) {}
173 Simplex_tree_optimized_star_simplex_iterator(SimplexTree
const* cpx, Static_vertex_vector&& simp)
174 : st_(cpx), it_(cpx, std::move(simp)), end_(), sh_(*it_), sib_(st_->self_siblings(sh_)), children_stack_() {
181 sib_ = st_->self_siblings(sh_);
182 if (st_->has_children(sh_)) {
183 children_stack_.push_back(st_->children(sh_));
189 friend class boost::iterator_core_access;
192 bool equal(Simplex_tree_optimized_star_simplex_iterator
const& other)
const {
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();
230 if (st_->has_children(sh_)) {
231 children_stack_.push_back(st_->children(sh_));
240 sib_ = st_->self_siblings(sh_);
241 if (st_->has_children(sh_)) {
242 children_stack_.push_back(st_->children(sh_));
247 if (st_->has_children(sh_)) {
248 children_stack_.push_back(st_->children(sh_));
255 void increment() { increment_all_cofaces(); }
259 SimplexTree
const* st_;
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
Dictionary::const_iterator Simplex_handle
Handle type to a simplex contained in the simplicial complex represented by the simplex tree.
Definition Simplex_tree.h:212
Simplex_tree_siblings< Simplex_tree, Dictionary > Siblings
Set of nodes sharing a same parent in the simplex tree.
Definition Simplex_tree.h:139
Options::Vertex_handle Vertex_handle
Type for the vertex handle.
Definition Simplex_tree.h:122
Gudhi namespace.
Definition SimplicialComplexForAlpha.h:14