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_
16 namespace lldb_private {
18 template <typename I, typename E> E map_adapter(I &iter) {
22 template <typename I, typename E> E vector_adapter(I &iter) { return *iter; }
24 template <typename I, typename E> E list_adapter(I &iter) { return *iter; }
26 template <typename C, typename E, E (*A)(typename C::const_iterator &)>
27 class AdaptedConstIterator {
29 typedef typename C::const_iterator BackingIterator;
31 // Wrapping constructor
32 AdaptedConstIterator(BackingIterator backing_iterator)
33 : m_iter(backing_iterator) {}
35 // Default-constructible
36 AdaptedConstIterator() : m_iter() {}
39 AdaptedConstIterator(const AdaptedConstIterator &rhs) : m_iter(rhs.m_iter) {}
42 AdaptedConstIterator &operator=(const AdaptedConstIterator &rhs) {
48 ~AdaptedConstIterator() = default;
51 bool operator==(const AdaptedConstIterator &rhs) {
52 return m_iter == rhs.m_iter;
55 bool operator!=(const AdaptedConstIterator &rhs) {
56 return m_iter != rhs.m_iter;
59 // Rvalue dereferenceable
60 E operator*() { return (*A)(m_iter); }
62 E operator->() { return (*A)(m_iter); }
64 // Offset dereferenceable
65 E operator[](typename BackingIterator::difference_type offset) {
66 return AdaptedConstIterator(m_iter + offset);
70 AdaptedConstIterator &operator++() {
76 AdaptedConstIterator &operator--() {
81 // Compound assignment
82 AdaptedConstIterator &
83 operator+=(typename BackingIterator::difference_type offset) {
88 AdaptedConstIterator &
89 operator-=(typename BackingIterator::difference_type offset) {
96 operator+(typename BackingIterator::difference_type offset) {
97 return AdaptedConstIterator(m_iter + offset);
101 operator-(typename BackingIterator::difference_type offset) {
102 return AdaptedConstIterator(m_iter - offset);
106 bool operator<(AdaptedConstIterator &rhs) { return m_iter < rhs.m_iter; }
108 bool operator<=(AdaptedConstIterator &rhs) { return m_iter <= rhs.m_iter; }
110 bool operator>(AdaptedConstIterator &rhs) { return m_iter > rhs.m_iter; }
112 bool operator>=(AdaptedConstIterator &rhs) { return m_iter >= rhs.m_iter; }
114 template <typename C1, typename E1, E1 (*A1)(typename C1::const_iterator &)>
115 friend AdaptedConstIterator<C1, E1, A1>
116 operator+(typename C1::const_iterator::difference_type,
117 AdaptedConstIterator<C1, E1, A1> &);
119 template <typename C1, typename E1, E1 (*A1)(typename C1::const_iterator &)>
120 friend typename C1::const_iterator::difference_type
121 operator-(AdaptedConstIterator<C1, E1, A1> &,
122 AdaptedConstIterator<C1, E1, A1> &);
124 template <typename C1, typename E1, E1 (*A1)(typename C1::const_iterator &)>
125 friend void swap(AdaptedConstIterator<C1, E1, A1> &,
126 AdaptedConstIterator<C1, E1, A1> &);
129 BackingIterator m_iter;
132 template <typename C, typename E, E (*A)(typename C::const_iterator &)>
133 AdaptedConstIterator<C, E, A> operator+(
134 typename AdaptedConstIterator<C, E, A>::BackingIterator::difference_type
136 AdaptedConstIterator<C, E, A> &rhs) {
137 return rhs.operator+(offset);
140 template <typename C, typename E, E (*A)(typename C::const_iterator &)>
141 typename AdaptedConstIterator<C, E, A>::BackingIterator::difference_type
142 operator-(AdaptedConstIterator<C, E, A> &lhs,
143 AdaptedConstIterator<C, E, A> &rhs) {
144 return (lhs.m_iter - rhs.m_iter);
147 template <typename C, typename E, E (*A)(typename C::const_iterator &)>
148 void swap(AdaptedConstIterator<C, E, A> &lhs,
149 AdaptedConstIterator<C, E, A> &rhs) {
150 std::swap(lhs.m_iter, rhs.m_iter);
153 template <typename C, typename E, E (*A)(typename C::const_iterator &)>
154 class AdaptedIterable {
156 const C &m_container;
159 AdaptedIterable(const C &container) : m_container(container) {}
161 AdaptedConstIterator<C, E, A> begin() {
162 return AdaptedConstIterator<C, E, A>(m_container.begin());
165 AdaptedConstIterator<C, E, A> end() {
166 return AdaptedConstIterator<C, E, A>(m_container.end());
170 template <typename C, typename E, E (*A)(typename C::const_iterator &),
172 class LockingAdaptedIterable : public AdaptedIterable<C, E, A> {
174 LockingAdaptedIterable(C &container, MutexType &mutex)
175 : AdaptedIterable<C, E, A>(container), m_mutex(&mutex) {
179 LockingAdaptedIterable(LockingAdaptedIterable &&rhs)
180 : AdaptedIterable<C, E, A>(rhs), m_mutex(rhs.m_mutex) {
181 rhs.m_mutex = nullptr;
184 ~LockingAdaptedIterable() {
190 MutexType *m_mutex = nullptr;
192 LockingAdaptedIterable(const LockingAdaptedIterable &) = delete;
193 LockingAdaptedIterable &operator=(const LockingAdaptedIterable &) = delete;
196 } // namespace lldb_private
198 #endif // liblldb_Iterable_h_