//===-- Iterable.h ----------------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef liblldb_Iterable_h_ #define liblldb_Iterable_h_ #include namespace lldb_private { template E map_adapter(I &iter) { return iter->second; } template E vector_adapter(I &iter) { return *iter; } template E list_adapter(I &iter) { return *iter; } template class AdaptedConstIterator { public: typedef typename C::const_iterator BackingIterator; // Wrapping constructor AdaptedConstIterator(BackingIterator backing_iterator) : m_iter(backing_iterator) {} // Default-constructible AdaptedConstIterator() : m_iter() {} // Copy-constructible AdaptedConstIterator(const AdaptedConstIterator &rhs) : m_iter(rhs.m_iter) {} // Copy-assignable AdaptedConstIterator &operator=(const AdaptedConstIterator &rhs) { m_iter = rhs.m_iter; return *this; } // Destructible ~AdaptedConstIterator() = default; // Comparable bool operator==(const AdaptedConstIterator &rhs) { return m_iter == rhs.m_iter; } bool operator!=(const AdaptedConstIterator &rhs) { return m_iter != rhs.m_iter; } // Rvalue dereferenceable E operator*() { return (*A)(m_iter); } E operator->() { return (*A)(m_iter); } // Offset dereferenceable E operator[](typename BackingIterator::difference_type offset) { return AdaptedConstIterator(m_iter + offset); } // Incrementable AdaptedConstIterator &operator++() { m_iter++; return *this; } // Decrementable AdaptedConstIterator &operator--() { m_iter--; return *this; } // Compound assignment AdaptedConstIterator & operator+=(typename BackingIterator::difference_type offset) { m_iter += offset; return *this; } AdaptedConstIterator & operator-=(typename BackingIterator::difference_type offset) { m_iter -= offset; return *this; } // Arithmetic AdaptedConstIterator operator+(typename BackingIterator::difference_type offset) { return AdaptedConstIterator(m_iter + offset); } AdaptedConstIterator operator-(typename BackingIterator::difference_type offset) { return AdaptedConstIterator(m_iter - offset); } // Comparable bool operator<(AdaptedConstIterator &rhs) { return m_iter < rhs.m_iter; } bool operator<=(AdaptedConstIterator &rhs) { return m_iter <= rhs.m_iter; } bool operator>(AdaptedConstIterator &rhs) { return m_iter > rhs.m_iter; } bool operator>=(AdaptedConstIterator &rhs) { return m_iter >= rhs.m_iter; } template friend AdaptedConstIterator operator+(typename C1::const_iterator::difference_type, AdaptedConstIterator &); template friend typename C1::const_iterator::difference_type operator-(AdaptedConstIterator &, AdaptedConstIterator &); template friend void swap(AdaptedConstIterator &, AdaptedConstIterator &); private: BackingIterator m_iter; }; template AdaptedConstIterator operator+( typename AdaptedConstIterator::BackingIterator::difference_type offset, AdaptedConstIterator &rhs) { return rhs.operator+(offset); } template typename AdaptedConstIterator::BackingIterator::difference_type operator-(AdaptedConstIterator &lhs, AdaptedConstIterator &rhs) { return (lhs.m_iter - rhs.m_iter); } template void swap(AdaptedConstIterator &lhs, AdaptedConstIterator &rhs) { std::swap(lhs.m_iter, rhs.m_iter); } template class AdaptedIterable { private: const C &m_container; public: AdaptedIterable(const C &container) : m_container(container) {} AdaptedConstIterator begin() { return AdaptedConstIterator(m_container.begin()); } AdaptedConstIterator end() { return AdaptedConstIterator(m_container.end()); } }; template class LockingAdaptedIterable : public AdaptedIterable { public: LockingAdaptedIterable(C &container, MutexType &mutex) : AdaptedIterable(container), m_mutex(&mutex) { m_mutex->lock(); } LockingAdaptedIterable(LockingAdaptedIterable &&rhs) : AdaptedIterable(rhs), m_mutex(rhs.m_mutex) { rhs.m_mutex = nullptr; } ~LockingAdaptedIterable() { if (m_mutex) m_mutex->unlock(); } private: MutexType *m_mutex = nullptr; LockingAdaptedIterable(const LockingAdaptedIterable &) = delete; LockingAdaptedIterable &operator=(const LockingAdaptedIterable &) = delete; }; } // namespace lldb_private #endif // liblldb_Iterable_h_