mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-11-16 12:34:43 +00:00
There are two ways to build an iterator_range: - Using the variadic constructor, where the arguments you pass are used to construct the "begin" underlying iterator. The "end" iterator is obtained by default-constructing the underlying iterator. - Using the other constructor, by explicitly providing the "begin" and "end" iterators. My experience is that using the variadic constructor is very confusing, especially when you have multiple layers of iterator wrappers. It's not obvious where the arguments you provide end up. When you have a compilation error, it is hard to decipher. I propose to remove the variadicity of the first constructor of iterator_range, and subsequently of the other iterator wrappers. This requires callers to be more verbose, explicitly instantiate all the layers. But since we only instantiate these iterator wrappers in factory functions, I think it's fine. If there is a compilation error, it will be much easier to find and fix the problem. Using the new one-argument constructor, it is still assumed that the end iterator can be obtained by default-constructing the underlying iterator type, which I think is fine and not too confusing. Change-Id: I54d6fdef18bcd7e308825064e0fc18fadd7ca717 Approved-By: Tom Tromey <tom@tromey.com>
67 lines
2.1 KiB
C++
67 lines
2.1 KiB
C++
/* A range adapter that wraps begin / end iterators.
|
|
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_ITERATOR_RANGE_H
|
|
#define GDBSUPPORT_ITERATOR_RANGE_H
|
|
|
|
/* A wrapper that allows using ranged for-loops on a range described by two
|
|
iterators. */
|
|
|
|
template <typename IteratorType>
|
|
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. */
|
|
explicit iterator_range (IteratorType begin)
|
|
: iterator_range (std::move (begin), IteratorType {})
|
|
{}
|
|
|
|
/* Create an iterator range using explicit BEGIN and END iterators. */
|
|
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); }
|
|
|
|
/* Return true if this range is empty. */
|
|
bool empty () const
|
|
{ return m_begin == m_end; }
|
|
|
|
private:
|
|
IteratorType m_begin, m_end;
|
|
};
|
|
|
|
#endif /* GDBSUPPORT_ITERATOR_RANGE_H */
|