From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 92407 invoked by alias); 25 Nov 2018 16:54:47 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 92313 invoked by uid 89); 25 Nov 2018 16:54:46 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.3 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_SHORT,RCVD_IN_DNSWL_NONE,SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=adapter, U*tom, HCc:U*tom, iterating X-HELO: gateway32.websitewelcome.com Received: from gateway32.websitewelcome.com (HELO gateway32.websitewelcome.com) (192.185.145.119) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sun, 25 Nov 2018 16:54:44 +0000 Received: from cm16.websitewelcome.com (cm16.websitewelcome.com [100.42.49.19]) by gateway32.websitewelcome.com (Postfix) with ESMTP id 99BFA14A8E for ; Sun, 25 Nov 2018 10:54:42 -0600 (CST) Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with SMTP id QxgAg3FcdaSeyQxgAgGLyq; Sun, 25 Nov 2018 10:54:42 -0600 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tromey.com; s=default; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From: Sender:Reply-To:MIME-Version:Content-Type:Content-Transfer-Encoding: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=O1bmZQCJ8j3QQ4VE+njULQKDFLEs67V65c7Ke6HUGd4=; b=YBsZP7cgcZVTH7ggug//M6Mq+Q u8fEUHMdHoOac4FlXnDyusmabwunLPuLEWBw9MH71TsjTuxXmXYE48kH/PYJRNbCjPY2xOeXdmaG/ 7MzPkLM3gvSznVKeNZw2IAAy4; Received: from 97-122-190-66.hlrn.qwest.net ([97.122.190.66]:51592 helo=bapiya.Home) by box5379.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.91) (envelope-from ) id 1gQxgA-0013GF-DE; Sun, 25 Nov 2018 10:54:42 -0600 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH 01/12] Introduce all_objfiles and next_iterator Date: Sun, 25 Nov 2018 16:54:00 -0000 Message-Id: <20181125165439.13773-2-tom@tromey.com> In-Reply-To: <20181125165439.13773-1-tom@tromey.com> References: <20181125165439.13773-1-tom@tromey.com> X-SW-Source: 2018-11/txt/msg00404.txt.bz2 This introduces an iterable object which can be used to iterate over objfiles. It also introduces a generic "next_iterator", which can be used to iterate over types that have a "next" field. gdb/ChangeLog 2018-11-25 Tom Tromey * common/next-iterator.h: New file. * objfiles.h (class all_objfiles): New. (struct objfile_iterator): New. --- gdb/ChangeLog | 6 +++ gdb/common/next-iterator.h | 102 +++++++++++++++++++++++++++++++++++++ gdb/objfiles.h | 17 +++++++ 3 files changed, 125 insertions(+) create mode 100644 gdb/common/next-iterator.h diff --git a/gdb/common/next-iterator.h b/gdb/common/next-iterator.h new file mode 100644 index 0000000000..79241a82a4 --- /dev/null +++ b/gdb/common/next-iterator.h @@ -0,0 +1,102 @@ +/* A "next" iterator for GDB, the GNU debugger. + Copyright (C) 2018 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 NEXT_ITERATOR_H +#define NEXT_ITERATOR_H + +/* An iterator that uses the 'next' field of a type to iterate. This + can be used with various GDB types that are stored as linked + lists. */ + +template +struct next_iterator +{ + typedef next_iterator self_type; + typedef T *value_type; + typedef T *&reference; + typedef T **pointer; + typedef std::forward_iterator_tag iterator_category; + typedef int difference_type; + + explicit next_iterator (T *item) + : m_item (item) + { + } + + /* Create a one-past-the-end iterator. */ + next_iterator () + : m_item (nullptr) + { + } + + value_type operator* () const + { + return m_item; + } + + bool operator== (const self_type &other) const + { + return m_item == other.m_item; + } + + bool operator!= (const self_type &other) const + { + return m_item != other.m_item; + } + + self_type &operator++ () + { + m_item = m_item->next; + return *this; + } + +private: + + T *m_item; +}; + +/* A range adapter that allows iterating over a linked list. */ + +template +class next_adapter +{ +public: + + explicit next_adapter (T *item) + : m_item (item) + { + } + + using iterator = next_iterator; + + iterator begin () const + { + return iterator (m_item); + } + + iterator end () const + { + return iterator (); + } + +private: + + T *m_item; +}; + +#endif /* NEXT_ITERATOR_H */ diff --git a/gdb/objfiles.h b/gdb/objfiles.h index 7a9087b015..9005be2795 100644 --- a/gdb/objfiles.h +++ b/gdb/objfiles.h @@ -28,6 +28,7 @@ #include "registry.h" #include "gdb_bfd.h" #include +#include "common/next-iterator.h" struct bcache; struct htab; @@ -565,6 +566,22 @@ extern void default_iterate_over_objfiles_in_search_order void *cb_data, struct objfile *current_objfile); +/* An iterarable object that can be used to iterate over all + objfiles. The basic use is in a foreach, like: + + for (struct objfile *objf : all_objfiles (pspace)) { ... } */ + +class all_objfiles : public next_adapter +{ +public: + + explicit all_objfiles (struct program_space *pspace) + : next_adapter (pspace->objfiles) + { + } +}; + + /* Traverse all object files in the current program space. ALL_OBJFILES_SAFE works even if you delete the objfile during the traversal. */ -- 2.17.2