Jlm
Loading...
Searching...
No Matches
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
13namespace jlm::util
14{
15
23template<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
41template<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
59template<typename T, typename BaseIterator>
61{
62 [[nodiscard]] T &
63 operator()(const BaseIterator & it) const
64 {
65 return it->second;
66 }
67};
68
78template<typename T, typename BaseIterator, typename DereferenceFunc>
79class IteratorWrapper final
80{
81public:
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
131private:
132 BaseIterator Iterator_;
133};
134
140template<typename T, typename BaseIterator>
142
148template<typename T, typename BaseIterator>
151
157template<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 operator++(int) noexcept
bool operator==(const IteratorWrapper &other) const noexcept
IteratorWrapper & operator++() 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