Jlm
IteratorWrapper.hpp
Go to the documentation of this file.
1 /*
2  * Copyright 2025 HÃ¥vard Krogstie <krogstie.havard@gmail.com>
3  * See COPYING for terms of redistribution.
4  */
5 
6 #ifndef JLM_UTIL_ITERATORWRAPPER_HPP
7 #define JLM_UTIL_ITERATORWRAPPER_HPP
8 
9 #include <jlm/util/common.hpp>
10 
11 #include <iterator>
12 
13 namespace jlm::util
14 {
15 
23 template<typename T, typename BaseIterator>
25 {
26  [[nodiscard]] T &
27  operator()(const BaseIterator & it) const
28  {
29  JLM_ASSERT(*it != nullptr);
30  return *(*it);
31  }
32 };
33 
41 template<typename T, typename BaseIterator>
43 {
44  [[nodiscard]] T &
45  operator()(const BaseIterator & it) const
46  {
47  JLM_ASSERT(it->second != nullptr);
48  return *(it->second);
49  }
50 };
51 
59 template<typename T, typename BaseIterator>
61 {
62  [[nodiscard]] T &
63  operator()(const BaseIterator & it) const
64  {
65  return it->second;
66  }
67 };
68 
78 template<typename T, typename BaseIterator, typename DereferenceFunc>
79 class IteratorWrapper final
80 {
81 public:
82  using difference_type = std::ptrdiff_t;
83  using value_type = T;
84  using pointer = T *;
85  using reference = T &;
86  using iterator_category = std::forward_iterator_tag;
87 
88  explicit IteratorWrapper(BaseIterator it)
89  : Iterator_(it)
90  {}
91 
93  operator++() noexcept
94  {
95  ++Iterator_;
96  return *this;
97  }
98 
100  operator++(int) noexcept
101  {
102  auto tmp = *this;
103  ++*this;
104  return tmp;
105  }
106 
107  [[nodiscard]] bool
108  operator==(const IteratorWrapper & other) const noexcept
109  {
110  return Iterator_ == other.Iterator_;
111  }
112 
113  [[nodiscard]] bool
114  operator!=(const IteratorWrapper & other) const noexcept
115  {
116  return !(other == *this);
117  }
118 
119  [[nodiscard]] reference
120  operator*() const noexcept
121  {
122  return DereferenceFunc{}(Iterator_);
123  }
124 
125  [[nodiscard]] pointer
126  operator->() const noexcept
127  {
128  return &operator*();
129  }
130 
131 private:
132  BaseIterator Iterator_;
133 };
134 
140 template<typename T, typename BaseIterator>
142 
148 template<typename T, typename BaseIterator>
151 
157 template<typename T, typename BaseIterator>
159 
160 }
161 
162 #endif // JLM_UTIL_ITERATORWRAPPER_HPP
pointer operator->() const noexcept
std::forward_iterator_tag iterator_category
reference operator*() const noexcept
bool operator!=(const IteratorWrapper &other) const noexcept
IteratorWrapper(BaseIterator it)
IteratorWrapper & operator++() noexcept
IteratorWrapper operator++(int) noexcept
bool operator==(const IteratorWrapper &other) const noexcept
#define JLM_ASSERT(x)
Definition: common.hpp:16
T & operator()(const BaseIterator &it) const
T & operator()(const BaseIterator &it) const
T & operator()(const BaseIterator &it) const