diff options
author | Tom Tromey <tom@tromey.com> | 2019-11-03 10:38:36 -0700 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2019-12-12 15:50:54 -0700 |
commit | 13bff72615e5a93a6e5f28e83a594125e66ccced (patch) | |
tree | c909c2989bc3329a5349e165b741f4804ae72942 /gdb | |
parent | deeafabb678e59d8585be6d765c7fbd0e7060b6c (diff) | |
download | gdb-13bff72615e5a93a6e5f28e83a594125e66ccced.zip gdb-13bff72615e5a93a6e5f28e83a594125e66ccced.tar.gz gdb-13bff72615e5a93a6e5f28e83a594125e66ccced.tar.bz2 |
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
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/gdbsupport/safe-iterator.h | 52 |
2 files changed, 53 insertions, 5 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 26f764e..368d7f0 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,11 @@ 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> + * progspace.c (program_space::multi_objfile_p): New method. * printcmd.c (info_symbol_command): Update. * maint.c (maintenance_translate_address): Update. diff --git a/gdb/gdbsupport/safe-iterator.h b/gdb/gdbsupport/safe-iterator.h index 89aec01..1a98b42 100644 --- a/gdb/gdbsupport/safe-iterator.h +++ b/gdb/gdbsupport/safe-iterator.h @@ -48,17 +48,29 @@ public: typedef typename Iterator::iterator_category iterator_category; typedef typename Iterator::difference_type difference_type; - /* Construct by forwarding all arguments to the underlying - iterator. */ - template<typename... Args> - explicit basic_safe_iterator (Args &&...args) - : m_it (std::forward<Args> (args)...), + /* Construct using the given argument; the end iterator is default + constructed. */ + template<typename Arg> + explicit basic_safe_iterator (Arg &&arg) + : m_it (std::forward<Arg> (arg)), m_next (m_it) { if (m_it != m_end) ++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. */ basic_safe_iterator () {} @@ -90,4 +102,34 @@ private: 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 */ |