Index: include/polly/Support/ISLTools.h =================================================================== --- include/polly/Support/ISLTools.h +++ include/polly/Support/ISLTools.h @@ -16,6 +16,96 @@ #define POLLY_ISLTOOLS_H #include "polly/Support/GICHelper.h" +#include "llvm/ADT/iterator_range.h" + +namespace isl { +inline namespace noexceptions { + +template +struct iterator_base : public llvm::iterator_facade_base< + iterator_base, + std::forward_iterator_tag, ElementT> { + explicit iterator_base(ListT &List) : List(&List) { + Position = static_cast(this)->list_size(); + } + iterator_base(ListT &List, int Position) : List(&List), Position(Position) {} + iterator_base &operator=(const iterator_base &R) = default; + + bool operator==(const iterator_base &O) const { + return List == O.List && Position == O.Position; + } + + DerivedT &operator++() { + ++Position; + return *static_cast(this); + } + + DerivedT operator++(int) { + DerivedT Copy{static_cast(this)}; + ++Position; + return Copy; + } + +protected: + ListT *List; + int Position = 0; +}; + +struct map_iterator : iterator_base { + using BaseT = iterator_base; + using BaseT::BaseT; + isl::map operator*() const { return List->get_map(this->Position); } + int list_size() const { return this->List->n_map(); } +}; + +struct basic_map_iterator + : iterator_base { + using BaseT = + iterator_base; + using BaseT::BaseT; + isl::basic_map operator*() const { + return List->get_basic_map(this->Position); + } + int list_size() const { return this->List->n_basic_map(); } +}; + +struct set_iterator : iterator_base { + using BaseT = iterator_base; + using BaseT::BaseT; + isl::set operator*() const { return List->get_set(this->Position); } + int list_size() const { return this->List->n_set(); } +}; + +struct basic_set_iterator + : iterator_base { + using BaseT = + iterator_base; + using BaseT::BaseT; + isl::basic_set operator*() const { + return List->get_basic_set(this->Position); + } + int list_size() const { return this->List->n_basic_set(); } +}; + +inline map_iterator begin(isl::map_list M) { return map_iterator(M, 0); } +inline map_iterator end(isl::map_list M) { return map_iterator(M); } +inline set_iterator begin(isl::set_list M) { return set_iterator(M, 0); } +inline set_iterator end(isl::set_list M) { return set_iterator(M); } +inline basic_map_iterator begin(isl::basic_map_list M) { + return basic_map_iterator(M, 0); +} +inline basic_map_iterator end(isl::basic_map_list M) { + return basic_map_iterator(M); +} +inline basic_set_iterator begin(isl::basic_set_list M) { + return basic_set_iterator(M, 0); +} +inline basic_set_iterator end(isl::basic_set_list M) { + return basic_set_iterator(M); +} + +} // namespace noexceptions +} // namespace isl namespace polly {