summaryrefslogtreecommitdiff
path: root/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_blockers_iterators.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_blockers_iterators.h')
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_blockers_iterators.h120
1 files changed, 120 insertions, 0 deletions
diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_blockers_iterators.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_blockers_iterators.h
new file mode 100644
index 00000000..21091d10
--- /dev/null
+++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_blockers_iterators.h
@@ -0,0 +1,120 @@
+/*
+ * Skeleton_blockers_blockers_iterators.h
+ *
+ * Created on: Aug 25, 2014
+ * Author: dsalinas
+ */
+
+#ifndef GUDHI_SKELETON_BLOCKERS_BLOCKERS_ITERATORS_H_
+#define GUDHI_SKELETON_BLOCKERS_BLOCKERS_ITERATORS_H_
+
+#include "boost/iterator/iterator_facade.hpp"
+
+namespace Gudhi{
+
+namespace skbl {
+
+/**
+ * @brief Iterator through the blockers of a vertex.
+ */
+// ReturnType = const Simplex_handle* or Simplex_handle*
+// MapIteratorType = BlockerMapConstIterator or BlockerMapIterator
+template<typename MapIteratorType, typename ReturnType>
+class Blocker_iterator_internal : public boost::iterator_facade<
+ Blocker_iterator_internal<MapIteratorType,ReturnType>,
+ ReturnType,
+ boost::forward_traversal_tag,
+ ReturnType
+ >{
+private:
+ MapIteratorType current_position;
+ MapIteratorType end_of_map;
+public:
+
+ Blocker_iterator_internal():current_position(){}
+
+ Blocker_iterator_internal(MapIteratorType position,MapIteratorType end_of_map_ ):
+ current_position(position), end_of_map(end_of_map_)
+ { }
+
+ bool equal(const Blocker_iterator_internal& other) const{
+ return current_position == other.current_position;
+ }
+
+ void increment(){
+ goto_next_blocker();
+ }
+
+ ReturnType dereference() const {
+ return(current_position->second);
+ }
+
+private:
+ /**
+ * Let the current pair be (v,sigma) where v is a vertex and sigma is a blocker.
+ * If v is not the first vertex of sigma then we already have seen sigma as a blocker
+ * and we look for the next one.
+ */
+ void goto_next_blocker(){
+ do {
+ ++current_position;
+ } while (!(current_position == end_of_map) && !first_time_blocker_is_seen());
+ }
+
+ bool first_time_blocker_is_seen() const{
+ return current_position->first == current_position->second->first_vertex();
+ }
+};
+
+
+
+/**
+ * @brief Iterator through the blockers of a vertex
+ */
+// ReturnType = const Simplex_handle* or Simplex_handle*
+// MapIteratorType = BlockerMapConstIterator or BlockerMapIterator
+template<typename MapIteratorType, typename ReturnType>
+class Blocker_iterator_around_vertex_internal : public boost::iterator_facade<
+ Blocker_iterator_around_vertex_internal<MapIteratorType,ReturnType>,
+ ReturnType,
+ boost::forward_traversal_tag,
+ ReturnType
+>{
+private:
+ MapIteratorType current_position_;
+public:
+
+ Blocker_iterator_around_vertex_internal():current_position_(){}
+
+ Blocker_iterator_around_vertex_internal(MapIteratorType position):
+ current_position_(position)
+ {}
+
+ Blocker_iterator_around_vertex_internal& operator=(Blocker_iterator_around_vertex_internal other){
+ this->current_position_ = other.current_position_;
+ return *this;
+ }
+
+ bool equal(const Blocker_iterator_around_vertex_internal& other) const{
+ return current_position_ == other.current_position_;
+ }
+
+ void increment(){
+ current_position_++;
+ }
+
+ ReturnType dereference() const{
+ return(current_position_->second);
+ }
+
+
+ MapIteratorType current_position(){
+ return this->current_position_;
+ }
+};
+
+}
+
+} // namespace GUDHI
+
+#endif /* GUDHI_SKELETON_BLOCKERS_BLOCKERS_ITERATORS_H_ */