From patchwork Thu Dec 12 23:50:10 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Simon Marchi (Code Review)" X-Patchwork-Id: 36811 Received: (qmail 101632 invoked by alias); 12 Dec 2019 23:50:27 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 101207 invoked by uid 89); 12 Dec 2019 23:50:24 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-21.7 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3 autolearn=ham version=3.3.1 spammy= X-HELO: mx1.osci.io Received: from polly.osci.io (HELO mx1.osci.io) (8.43.85.229) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 12 Dec 2019 23:50:22 +0000 Received: by mx1.osci.io (Postfix, from userid 994) id 747E520641; Thu, 12 Dec 2019 18:50:19 -0500 (EST) Received: from gnutoolchain-gerrit.osci.io (gnutoolchain-gerrit.osci.io [8.43.85.239]) by mx1.osci.io (Postfix) with ESMTP id 1AB4520A81; Thu, 12 Dec 2019 18:50:10 -0500 (EST) Received: from localhost (localhost [127.0.0.1]) by gnutoolchain-gerrit.osci.io (Postfix) with ESMTP id 0AE3F20AF6; Thu, 12 Dec 2019 18:50:10 -0500 (EST) X-Gerrit-PatchSet: 2 Date: Thu, 12 Dec 2019 18:50:10 -0500 From: "Sourceware to Gerrit sync (Code Review)" To: Tom Tromey , gdb-patches@sourceware.org Auto-Submitted: auto-generated X-Gerrit-MessageType: merged Subject: [pushed] Introduce basic_safe_range X-Gerrit-Change-Id: Ib351ef6fd435129a5053c64e5561877e1459ab37 X-Gerrit-Change-Number: 498 X-Gerrit-ChangeURL: X-Gerrit-Commit: 13bff72615e5a93a6e5f28e83a594125e66ccced In-Reply-To: References: Reply-To: noreply@gnutoolchain-gerrit.osci.io, tromey@sourceware.org, gdb-patches@sourceware.org MIME-Version: 1.0 Content-Disposition: inline User-Agent: Gerrit/3.0.3-79-g83ff7f88f1 Message-Id: <20191212235010.0AE3F20AF6@gnutoolchain-gerrit.osci.io> Sourceware to Gerrit sync has submitted this change. Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/498 ...................................................................... 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 * gdbsupport/safe-iterator.h (basic_safe_iterator): Simplify. Add second constructor. (basic_safe_range): New class. Change-Id: Ib351ef6fd435129a5053c64e5561877e1459ab37 --- M gdb/ChangeLog M gdb/gdbsupport/safe-iterator.h 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 + * gdbsupport/safe-iterator.h (basic_safe_iterator): Simplify. Add + second constructor. + (basic_safe_range): New class. + +2019-12-12 Tom Tromey + * 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 @@ typedef typename Iterator::iterator_category iterator_category; typedef typename Iterator::difference_type difference_type; - /* Construct by forwarding all arguments to the underlying - iterator. */ - template - explicit basic_safe_iterator (Args &&...args) - : m_it (std::forward (args)...), + /* Construct using the given argument; the end iterator is default + constructed. */ + template + explicit basic_safe_iterator (Arg &&arg) + : m_it (std::forward (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 + explicit basic_safe_iterator (Arg &&arg, Arg &&arg2) + : m_it (std::forward (arg)), + m_next (m_it), + m_end (std::forward (arg2)) + { + if (m_it != m_end) + ++m_next; + } + /* Create a one-past-end iterator. */ basic_safe_iterator () {} @@ -90,4 +102,34 @@ Iterator m_end {}; }; +/* A range adapter that wraps another range, and then returns safe + iterators wrapping the original range's iterators. */ + +template +class basic_safe_range +{ +public: + + typedef basic_safe_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 */