1 //===-- Iterable.h ----------------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef liblldb_Iterable_h_
11 #define liblldb_Iterable_h_
17 // Other libraries and framework includes
20 namespace lldb_private {
22 template <typename I, typename E> E map_adapter(I &iter) {
26 template <typename I, typename E> E vector_adapter(I &iter) { return *iter; }
28 template <typename I, typename E> E list_adapter(I &iter) { return *iter; }
30 template <typename C, typename E, E (*A)(typename C::const_iterator &)>
31 class AdaptedConstIterator {
33 typedef typename C::const_iterator BackingIterator;
35 // Wrapping constructor
36 AdaptedConstIterator(BackingIterator backing_iterator)
37 : m_iter(backing_iterator) {}
39 // Default-constructible
40 AdaptedConstIterator() : m_iter() {}
43 AdaptedConstIterator(const AdaptedConstIterator &rhs) : m_iter(rhs.m_iter) {}
46 AdaptedConstIterator &operator=(const AdaptedConstIterator &rhs) {
52 ~AdaptedConstIterator() = default;
55 bool operator==(const AdaptedConstIterator &rhs) {
56 return m_iter == rhs.m_iter;
59 bool operator!=(const AdaptedConstIterator &rhs) {
60 return m_iter != rhs.m_iter;
63 // Rvalue dereferenceable
64 E operator*() { return (*A)(m_iter); }
66 E operator->() { return (*A)(m_iter); }
68 // Offset dereferenceable
69 E operator[](typename BackingIterator::difference_type offset) {
70 return AdaptedConstIterator(m_iter + offset);
74 AdaptedConstIterator &operator++() {
80 AdaptedConstIterator &operator--() {
85 // Compound assignment
86 AdaptedConstIterator &
87 operator+=(typename BackingIterator::difference_type offset) {
92 AdaptedConstIterator &
93 operator-=(typename BackingIterator::difference_type offset) {
100 operator+(typename BackingIterator::difference_type offset) {
101 return AdaptedConstIterator(m_iter + offset);
105 operator-(typename BackingIterator::difference_type offset) {
106 return AdaptedConstIterator(m_iter - offset);
110 bool operator<(AdaptedConstIterator &rhs) { return m_iter < rhs.m_iter; }
112 bool operator<=(AdaptedConstIterator &rhs) { return m_iter <= rhs.m_iter; }
114 bool operator>(AdaptedConstIterator &rhs) { return m_iter > rhs.m_iter; }
116 bool operator>=(AdaptedConstIterator &rhs) { return m_iter >= rhs.m_iter; }
118 template <typename C1, typename E1, E1 (*A1)(typename C1::const_iterator &)>
119 friend AdaptedConstIterator<C1, E1, A1>
120 operator+(typename C1::const_iterator::difference_type,
121 AdaptedConstIterator<C1, E1, A1> &);
123 template <typename C1, typename E1, E1 (*A1)(typename C1::const_iterator &)>
124 friend typename C1::const_iterator::difference_type
125 operator-(AdaptedConstIterator<C1, E1, A1> &,
126 AdaptedConstIterator<C1, E1, A1> &);
128 template <typename C1, typename E1, E1 (*A1)(typename C1::const_iterator &)>
129 friend void swap(AdaptedConstIterator<C1, E1, A1> &,
130 AdaptedConstIterator<C1, E1, A1> &);
133 BackingIterator m_iter;
136 template <typename C, typename E, E (*A)(typename C::const_iterator &)>
137 AdaptedConstIterator<C, E, A> operator+(
138 typename AdaptedConstIterator<C, E, A>::BackingIterator::difference_type
140 AdaptedConstIterator<C, E, A> &rhs) {
141 return rhs.operator+(offset);
144 template <typename C, typename E, E (*A)(typename C::const_iterator &)>
145 typename AdaptedConstIterator<C, E, A>::BackingIterator::difference_type
146 operator-(AdaptedConstIterator<C, E, A> &lhs,
147 AdaptedConstIterator<C, E, A> &rhs) {
148 return (lhs.m_iter - rhs.m_iter);
151 template <typename C, typename E, E (*A)(typename C::const_iterator &)>
152 void swap(AdaptedConstIterator<C, E, A> &lhs,
153 AdaptedConstIterator<C, E, A> &rhs) {
154 std::swap(lhs.m_iter, rhs.m_iter);
157 template <typename C, typename E, E (*A)(typename C::const_iterator &)>
158 class AdaptedIterable {
160 const C &m_container;
163 AdaptedIterable(const C &container) : m_container(container) {}
165 AdaptedConstIterator<C, E, A> begin() {
166 return AdaptedConstIterator<C, E, A>(m_container.begin());
169 AdaptedConstIterator<C, E, A> end() {
170 return AdaptedConstIterator<C, E, A>(m_container.end());
174 template <typename C, typename E, E (*A)(typename C::const_iterator &),
176 class LockingAdaptedIterable : public AdaptedIterable<C, E, A> {
178 LockingAdaptedIterable(C &container, MutexType &mutex)
179 : AdaptedIterable<C, E, A>(container), m_mutex(&mutex) {
183 LockingAdaptedIterable(LockingAdaptedIterable &&rhs)
184 : AdaptedIterable<C, E, A>(rhs), m_mutex(rhs.m_mutex) {
185 rhs.m_mutex = nullptr;
188 ~LockingAdaptedIterable() {
194 MutexType *m_mutex = nullptr;
196 LockingAdaptedIterable(const LockingAdaptedIterable &) = delete;
197 LockingAdaptedIterable &operator=(const LockingAdaptedIterable &) = delete;
200 } // namespace lldb_private
202 #endif // liblldb_Iterable_h_