summaryrefslogtreecommitdiff
path: root/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_edges_iterators.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_edges_iterators.h')
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_edges_iterators.h153
1 files changed, 153 insertions, 0 deletions
diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_edges_iterators.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_edges_iterators.h
new file mode 100644
index 00000000..82025a1c
--- /dev/null
+++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_edges_iterators.h
@@ -0,0 +1,153 @@
+/*
+ * Skeleton_blockers_iterators_out.h
+ *
+ * Created on: Aug 25, 2014
+ * Author: dsalinas
+ */
+
+#ifndef GUDHI_SKELETON_BLOCKERS_ITERATORS_EDGES_H_
+#define GUDHI_SKELETON_BLOCKERS_ITERATORS_EDGES_H_
+
+#include "boost/iterator/iterator_facade.hpp"
+
+
+namespace Gudhi{
+
+namespace skbl {
+
+template<typename SkeletonBlockerComplex>
+class Complex_edge_around_vertex_iterator :
+ public boost::iterator_facade < Complex_edge_around_vertex_iterator<SkeletonBlockerComplex>
+ , typename SkeletonBlockerComplex::Edge_handle const
+ , boost::forward_traversal_tag
+ , typename SkeletonBlockerComplex::Edge_handle const
+ >
+{
+ friend class boost::iterator_core_access;
+
+ typedef SkeletonBlockerComplex Complex;
+ typedef typename Complex::boost_adjacency_iterator boost_adjacency_iterator;
+ typedef typename Complex::Vertex_handle Vertex_handle;
+ typedef typename Complex::Edge_handle Edge_handle;
+
+private:
+
+ const Complex* complex;
+ Vertex_handle v;
+
+ boost_adjacency_iterator current_;
+ boost_adjacency_iterator end_;
+
+public:
+
+ Complex_edge_around_vertex_iterator():complex(NULL){
+ }
+
+ Complex_edge_around_vertex_iterator(const Complex* complex_,Vertex_handle v_):
+ complex(complex_),
+ v(v_)
+ {
+ tie(current_,end_) = adjacent_vertices(v.vertex, complex->skeleton);
+ }
+
+ /**
+ * returns an iterator to the end
+ */
+ Complex_edge_around_vertex_iterator(const Complex* complex_,Vertex_handle v_,int end):
+ complex(complex_),
+ v(v_)
+ {
+ tie(current_,end_) = adjacent_vertices(v.vertex, complex->skeleton);
+ set_end();
+ }
+
+ bool equal(const Complex_edge_around_vertex_iterator& other) const{
+ return (complex== other.complex) && (v == other.v) && (current_ == other.current_) && (end_ == other.end_);
+ }
+
+ void increment(){
+ if(current_ != end_)
+ ++current_;
+ }
+
+ Edge_handle dereference() const{
+ return *(*complex)[std::make_pair(v,*current_)];
+ }
+
+private:
+ //remove this ugly hack
+ void set_end(){
+ current_ = end_;
+ }
+};
+
+
+
+/**
+ *@brief Iterator on the edges of a simplicial complex.
+ *
+ */
+template<typename SkeletonBlockerComplex>
+class Complex_edge_iterator :
+public boost::iterator_facade < Complex_edge_iterator<SkeletonBlockerComplex>
+, typename SkeletonBlockerComplex::Edge_handle const
+, boost::forward_traversal_tag
+, typename SkeletonBlockerComplex::Edge_handle const
+>
+
+{
+ friend class boost::iterator_core_access;
+public:
+ typedef SkeletonBlockerComplex Complex;
+ typedef typename Complex::boost_edge_iterator boost_edge_iterator;
+ typedef typename Complex::Edge_handle Edge_handle;
+
+
+ const Complex* complex;
+ std::pair<boost_edge_iterator,boost_edge_iterator> edge_iterator ;
+
+ Complex_edge_iterator():complex(NULL){
+ }
+
+ Complex_edge_iterator(const SkeletonBlockerComplex* complex_):
+ complex(complex_),
+ edge_iterator(boost::edges(complex_->skeleton))
+ {
+ }
+
+ /**
+ * return an iterator to the end
+ */
+ Complex_edge_iterator(const SkeletonBlockerComplex* complex_,int end):
+ complex(complex_),
+ edge_iterator(boost::edges(complex_->skeleton))
+ {
+ edge_iterator.first = edge_iterator.second;
+ }
+
+
+ bool equal(const Complex_edge_iterator& other) const{
+ return (complex == other.complex) && (edge_iterator == other.edge_iterator);
+ }
+
+ void increment(){
+ if(edge_iterator.first != edge_iterator.second){
+ ++(edge_iterator.first);
+ }
+ }
+
+ Edge_handle dereference() const{
+ return(*(edge_iterator.first));
+ }
+};
+
+
+
+}
+
+} // namespace GUDHI
+
+
+#endif /* GUDHI_SKELETON_BLOCKERS_ITERATORS_EDGES_H_ */
+
+