| /* An iterator wrapper that yields pointers instead of references. | |
| Copyright (C) 2021-2025 Free Software Foundation, Inc. | |
| This file is part of GDB. | |
| This program is free software; you can redistribute it and/or modify | |
| it under the terms of the GNU General Public License as published by | |
| the Free Software Foundation; either version 3 of the License, or | |
| (at your option) any later version. | |
| This program is distributed in the hope that it will be useful, | |
| but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| GNU General Public License for more details. | |
| You should have received a copy of the GNU General Public License | |
| along with this program. If not, see <http://www.gnu.org/licenses/>. */ | |
| #ifndef GDBSUPPORT_REFERENCE_TO_POINTER_ITERATOR_H | |
| #define GDBSUPPORT_REFERENCE_TO_POINTER_ITERATOR_H | |
| /* Wrap an iterator that yields references to objects so that it yields | |
| pointers to objects instead. | |
| This is useful for example to bridge the gap between iterators on intrusive | |
| lists, which yield references, and the rest of GDB, which for legacy reasons | |
| expects to iterate on pointers. */ | |
| template <typename IteratorType> | |
| struct reference_to_pointer_iterator | |
| { | |
| using self_type = reference_to_pointer_iterator; | |
| using value_type = typename IteratorType::value_type *; | |
| using reference = typename IteratorType::value_type *&; | |
| using pointer = typename IteratorType::value_type **; | |
| using iterator_category = typename IteratorType::iterator_category; | |
| using difference_type = typename IteratorType::difference_type; | |
| /* Construct a reference_to_pointer_iterator, passing args to the underlying | |
| iterator. */ | |
| template <typename... Args> | |
| reference_to_pointer_iterator (Args &&...args) | |
| : m_it (std::forward<Args> (args)...) | |
| {} | |
| /* Create a past-the-end iterator. | |
| Assumes that default-constructing an underlying iterator creates a | |
| past-the-end iterator. */ | |
| reference_to_pointer_iterator () | |
| {} | |
| /* Need these as the variadic constructor would be a better match | |
| otherwise. */ | |
| reference_to_pointer_iterator (reference_to_pointer_iterator &) = default; | |
| reference_to_pointer_iterator (const reference_to_pointer_iterator &) = default; | |
| reference_to_pointer_iterator (reference_to_pointer_iterator &&) = default; | |
| reference_to_pointer_iterator &operator= (const reference_to_pointer_iterator &) = default; | |
| reference_to_pointer_iterator &operator= (reference_to_pointer_iterator &&) = default; | |
| value_type operator* () const | |
| { return &*m_it; } | |
| self_type &operator++ () | |
| { | |
| ++m_it; | |
| return *this; | |
| } | |
| self_type &operator++ (int) | |
| { | |
| m_it++; | |
| return *this; | |
| } | |
| self_type &operator-- () | |
| { | |
| --m_it; | |
| return *this; | |
| } | |
| self_type &operator-- (int) | |
| { | |
| m_it--; | |
| return *this; | |
| } | |
| bool operator== (const self_type &other) const | |
| { return m_it == other.m_it; } | |
| bool operator!= (const self_type &other) const | |
| { return m_it != other.m_it; } | |
| private: | |
| /* The underlying iterator. */ | |
| IteratorType m_it; | |
| }; | |
| #endif /* GDBSUPPORT_REFERENCE_TO_POINTER_ITERATOR_H */ |