/* A range adapter that wraps begin / end iterators. Copyright (C) 2021-2023 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 . */ #ifndef GDBSUPPORT_ITERATOR_RANGE_H #define GDBSUPPORT_ITERATOR_RANGE_H /* A wrapper that allows using ranged for-loops on a range described by two iterators. */ template struct iterator_range { using iterator = IteratorType; /* Create an iterator_range using BEGIN as the begin iterator. Assume that the end iterator can be default-constructed. */ template iterator_range (Args &&...args) : m_begin (std::forward (args)...) {} /* Create an iterator range using explicit BEGIN and END iterators. */ template iterator_range (IteratorType begin, IteratorType end) : m_begin (std::move (begin)), m_end (std::move (end)) {} /* Need these as the variadic constructor would be a better match otherwise. */ iterator_range (iterator_range &) = default; iterator_range (const iterator_range &) = default; iterator_range (iterator_range &&) = default; IteratorType begin () const { return m_begin; } IteratorType end () const { return m_end; } /* The number of items in this iterator_range. */ std::size_t size () const { return std::distance (m_begin, m_end); } private: IteratorType m_begin, m_end; }; #endif /* GDBSUPPORT_ITERATOR_RANGE_H */