mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-20 01:50:24 +08:00
Introduce basic_safe_range
This introduces the basic_safe_range class, which can be used to create a basic_safe_iterator. This also changes basic_safe_iterator in two ways. First, it simplifies the constructor. This seemed unnecessarily complicated to me, and keeping it this way would prevent the second change... ... which is to add a second constructor for initializing the one-past-the-end iterator that is stored in basic_safe_iterator. gdb/ChangeLog 2019-12-12 Tom Tromey <tom@tromey.com> * gdbsupport/safe-iterator.h (basic_safe_iterator): Simplify. Add second constructor. (basic_safe_range): New class. Change-Id: Ib351ef6fd435129a5053c64e5561877e1459ab37
This commit is contained in:
@ -1,3 +1,9 @@
|
|||||||
|
2019-12-12 Tom Tromey <tom@tromey.com>
|
||||||
|
|
||||||
|
* gdbsupport/safe-iterator.h (basic_safe_iterator): Simplify. Add
|
||||||
|
second constructor.
|
||||||
|
(basic_safe_range): New class.
|
||||||
|
|
||||||
2019-12-12 Tom Tromey <tom@tromey.com>
|
2019-12-12 Tom Tromey <tom@tromey.com>
|
||||||
|
|
||||||
* progspace.c (program_space::multi_objfile_p): New method.
|
* progspace.c (program_space::multi_objfile_p): New method.
|
||||||
|
@ -48,17 +48,29 @@ public:
|
|||||||
typedef typename Iterator::iterator_category iterator_category;
|
typedef typename Iterator::iterator_category iterator_category;
|
||||||
typedef typename Iterator::difference_type difference_type;
|
typedef typename Iterator::difference_type difference_type;
|
||||||
|
|
||||||
/* Construct by forwarding all arguments to the underlying
|
/* Construct using the given argument; the end iterator is default
|
||||||
iterator. */
|
constructed. */
|
||||||
template<typename... Args>
|
template<typename Arg>
|
||||||
explicit basic_safe_iterator (Args &&...args)
|
explicit basic_safe_iterator (Arg &&arg)
|
||||||
: m_it (std::forward<Args> (args)...),
|
: m_it (std::forward<Arg> (arg)),
|
||||||
m_next (m_it)
|
m_next (m_it)
|
||||||
{
|
{
|
||||||
if (m_it != m_end)
|
if (m_it != m_end)
|
||||||
++m_next;
|
++m_next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Construct the iterator using the first argument, and construct
|
||||||
|
the end iterator using the second argument. */
|
||||||
|
template<typename Arg>
|
||||||
|
explicit basic_safe_iterator (Arg &&arg, Arg &&arg2)
|
||||||
|
: m_it (std::forward<Arg> (arg)),
|
||||||
|
m_next (m_it),
|
||||||
|
m_end (std::forward<Arg> (arg2))
|
||||||
|
{
|
||||||
|
if (m_it != m_end)
|
||||||
|
++m_next;
|
||||||
|
}
|
||||||
|
|
||||||
/* Create a one-past-end iterator. */
|
/* Create a one-past-end iterator. */
|
||||||
basic_safe_iterator ()
|
basic_safe_iterator ()
|
||||||
{}
|
{}
|
||||||
@ -90,4 +102,34 @@ private:
|
|||||||
Iterator m_end {};
|
Iterator m_end {};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* A range adapter that wraps another range, and then returns safe
|
||||||
|
iterators wrapping the original range's iterators. */
|
||||||
|
|
||||||
|
template<typename Range>
|
||||||
|
class basic_safe_range
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
typedef basic_safe_iterator<typename Range::iterator> iterator;
|
||||||
|
|
||||||
|
explicit basic_safe_range (Range range)
|
||||||
|
: m_range (range)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
iterator begin () const
|
||||||
|
{
|
||||||
|
return iterator (m_range.begin (), m_range.end ());
|
||||||
|
}
|
||||||
|
|
||||||
|
iterator end () const
|
||||||
|
{
|
||||||
|
return iterator (m_range.end (), m_range.end ());
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
Range m_range;
|
||||||
|
};
|
||||||
|
|
||||||
#endif /* COMMON_SAFE_ITERATOR_H */
|
#endif /* COMMON_SAFE_ITERATOR_H */
|
||||||
|
Reference in New Issue
Block a user