diff options
author | Philip Pfaffe <philip.pfaffe@gmail.com> | 2018-07-23 15:28:50 +0000 |
---|---|---|
committer | Philip Pfaffe <philip.pfaffe@gmail.com> | 2018-07-23 15:28:50 +0000 |
commit | fcdbcb0c1fe7bba317866905ca1aab635c8edce9 (patch) | |
tree | fe05cb28528383df3d04590d7dfda3f85a59d7bc /polly | |
parent | 813fd665193e43db0d8e85128c2dd530c571d701 (diff) |
[isl] Simplify iterator implementation by building on top of list accessors
Summary:
With the new accessors, it's straightforward to use the templated
iterator instead of subclassing it for all the list types.
Depends on D49019
Reviewers: grosser, Meinersbur, bollu
Reviewed By: grosser
Subscribers: mehdi_amini, steven_wu, dexonsmith, pollydev, llvm-commits
Differential Revision: https://reviews.llvm.org/D49021
Diffstat (limited to 'polly')
-rw-r--r-- | polly/include/polly/Support/ISLTools.h | 90 |
1 files changed, 26 insertions, 64 deletions
diff --git a/polly/include/polly/Support/ISLTools.h b/polly/include/polly/Support/ISLTools.h index c0095dfc248..afb68fcb883 100644 --- a/polly/include/polly/Support/ISLTools.h +++ b/polly/include/polly/Support/ISLTools.h @@ -21,88 +21,50 @@ namespace isl { inline namespace noexceptions { -template <typename DerivedT, typename ElementT, typename ListT> -struct iterator_base : public llvm::iterator_facade_base< - iterator_base<DerivedT, ElementT, ListT>, - std::forward_iterator_tag, ElementT> { - explicit iterator_base(const ListT &List) : List(&List) { - Position = static_cast<DerivedT *>(this)->list_size(); - } - iterator_base(const ListT &List, int Position) +template <typename ListT> +using list_element_type = decltype(std::declval<ListT>().get_at(0)); + +template <typename ListT> +struct isl_iterator + : public llvm::iterator_facade_base<isl_iterator<ListT>, + std::forward_iterator_tag, + list_element_type<ListT>> { + + using ElementT = list_element_type<ListT>; + + explicit isl_iterator(const ListT &List) + : List(&List), Position(List.size()) {} + isl_iterator(const ListT &List, int Position) : List(&List), Position(Position) {} - iterator_base &operator=(const iterator_base &R) = default; + isl_iterator &operator=(const isl_iterator &R) = default; - bool operator==(const iterator_base &O) const { + bool operator==(const isl_iterator &O) const { return List == O.List && Position == O.Position; } - DerivedT &operator++() { + isl_iterator &operator++() { ++Position; - return *static_cast<DerivedT *>(this); + return *this; } - DerivedT operator++(int) { - DerivedT Copy{static_cast<DerivedT *>(this)}; + isl_iterator operator++(int) { + isl_iterator Copy{*this}; ++Position; return Copy; } + ElementT operator*() const { return List->get_at(this->Position); } + protected: const ListT *List; int Position = 0; }; -struct map_iterator : iterator_base<map_iterator, isl::map, isl::map_list> { - using BaseT = iterator_base<map_iterator, isl::map, isl::map_list>; - 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<basic_map_iterator, isl::basic_map, isl::basic_map_list> { - using BaseT = - iterator_base<basic_map_iterator, isl::basic_map, isl::basic_map_list>; - 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<set_iterator, isl::set, isl::set_list> { - using BaseT = iterator_base<set_iterator, isl::set, isl::set_list>; - 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<basic_set_iterator, isl::basic_set, isl::basic_set_list> { - using BaseT = - iterator_base<basic_set_iterator, isl::basic_set, isl::basic_set_list>; - 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(const isl::map_list &M) { return map_iterator(M, 0); } -inline map_iterator end(const isl::map_list &M) { return map_iterator(M); } -inline set_iterator begin(const isl::set_list &M) { return set_iterator(M, 0); } -inline set_iterator end(const isl::set_list &M) { return set_iterator(M); } -inline basic_map_iterator begin(const isl::basic_map_list &M) { - return basic_map_iterator(M, 0); -} -inline basic_map_iterator end(const isl::basic_map_list &M) { - return basic_map_iterator(M); -} -inline basic_set_iterator begin(const isl::basic_set_list &M) { - return basic_set_iterator(M, 0); +template <typename T> isl_iterator<T> begin(const T &t) { + return isl_iterator<T>(t, 0); } -inline basic_set_iterator end(const isl::basic_set_list &M) { - return basic_set_iterator(M); +template <typename T> isl_iterator<T> end(const T &t) { + return isl_iterator<T>(t); } } // namespace noexceptions |