From patchwork Thu Jul 4 17:02:30 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 33557 Received: (qmail 106871 invoked by alias); 4 Jul 2019 17:03:37 -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 105692 invoked by uid 89); 4 Jul 2019 17:03:28 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-18.5 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS autolearn=ham version=3.3.1 spammy=WINDOW, adapter, difference_type X-HELO: gateway23.websitewelcome.com Received: from gateway23.websitewelcome.com (HELO gateway23.websitewelcome.com) (192.185.49.104) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 04 Jul 2019 17:03:23 +0000 Received: from cm11.websitewelcome.com (cm11.websitewelcome.com [100.42.49.5]) by gateway23.websitewelcome.com (Postfix) with ESMTP id BC720CD68 for ; Thu, 4 Jul 2019 12:03:21 -0500 (CDT) Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with SMTP id j58jhYBUMdnCej58jh6Hff; Thu, 04 Jul 2019 12:03:21 -0500 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=OYzp5rRiBHfBEuBkbLceMdPS/8Jm59KlSS2jnqgN1R4=; b=xLSDGHHIzPcDnAJ9qjE9wn6GR3 clXRWuEuHsgyz5ZzrKXXKDklcfoOFoFLjUEYv89rhLymEeCyzlcXqTqrlWvsu5nT7Wy8+P8I+g9NW Nn5nqN7AiLuIylb5Pl+wS45X7; Received: from 174-29-58-150.hlrn.qwest.net ([174.29.58.150]:34694 helo=bapiya.Home) by box5379.bluehost.com with esmtpa (Exim 4.92) (envelope-from ) id 1hj58j-002sFu-HT; Thu, 04 Jul 2019 12:03:21 -0500 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH 20/61] Introduce TUI window iterator Date: Thu, 4 Jul 2019 11:02:30 -0600 Message-Id: <20190704170311.15982-21-tom@tromey.com> In-Reply-To: <20190704170311.15982-1-tom@tromey.com> References: <20190704170311.15982-1-tom@tromey.com> This introduces an iterator class and a range adapter to make it simpler to iterate over TUI windows. One explicit iteration remains, in tui-win.c, because that spot is deleting windows as well. 2019-07-04 Tom Tromey * tui/tui-wingeneral.h (tui_refresh_all): Update. * tui/tui-wingeneral.c (make_all_visible): Use foreach. (tui_refresh_all): Remove "list" parameter. Use foreach. * tui/tui-win.c (window_name_completer): Use foreach. (tui_refresh_all_win, tui_rehighlight_all, tui_all_windows_info) (update_tab_width): Likewise. * tui/tui-layout.c (show_layout): Update. * tui/tui-data.h (class tui_window_iterator): New. (struct all_tui_windows): New. * tui/tui-data.c (tui_partial_win_by_name): Use foreach. --- gdb/ChangeLog | 13 ++++++++ gdb/tui/tui-data.c | 22 ++++--------- gdb/tui/tui-data.h | 69 ++++++++++++++++++++++++++++++++++++++++ gdb/tui/tui-layout.c | 2 +- gdb/tui/tui-win.c | 47 +++++++++++---------------- gdb/tui/tui-wingeneral.c | 20 ++++-------- gdb/tui/tui-wingeneral.h | 2 +- 7 files changed, 116 insertions(+), 59 deletions(-) diff --git a/gdb/tui/tui-data.c b/gdb/tui/tui-data.c index a62dbf4d670..eacf174bbe7 100644 --- a/gdb/tui/tui-data.c +++ b/gdb/tui/tui-data.c @@ -294,27 +294,19 @@ tui_prev_win (struct tui_win_info *cur_win) struct tui_win_info * tui_partial_win_by_name (const char *name) { - struct tui_win_info *win_info = NULL; - if (name != NULL) { - int i = 0; - - while (i < MAX_MAJOR_WINDOWS && win_info == NULL) + for (tui_win_info *item : all_tui_windows ()) { - if (tui_win_list[i] != 0) - { - const char *cur_name = tui_win_list[i]->name (); - - if (strlen (name) <= strlen (cur_name) - && startswith (cur_name, name)) - win_info = tui_win_list[i]; - } - i++; + const char *cur_name = item->name (); + + if (strlen (name) <= strlen (cur_name) + && startswith (cur_name, name)) + return item; } } - return win_info; + return NULL; } diff --git a/gdb/tui/tui-data.h b/gdb/tui/tui-data.h index b3592e39133..76f6bc6102c 100644 --- a/gdb/tui/tui-data.h +++ b/gdb/tui/tui-data.h @@ -602,6 +602,75 @@ extern struct tui_win_info *tui_win_list[MAX_MAJOR_WINDOWS]; #define TUI_DATA_WIN ((tui_data_window *) tui_win_list[DATA_WIN]) #define TUI_CMD_WIN ((tui_cmd_window *) tui_win_list[CMD_WIN]) +/* An iterator that iterates over all windows. */ + +class tui_window_iterator +{ +public: + + typedef tui_window_iterator self_type; + typedef struct tui_win_info *value_type; + typedef struct tui_win_info *&reference; + typedef struct tui_win_info **pointer; + typedef std::forward_iterator_tag iterator_category; + typedef int difference_type; + + explicit tui_window_iterator (enum tui_win_type type) + : m_type (type) + { + advance (); + } + + tui_window_iterator () + : m_type (MAX_MAJOR_WINDOWS) + { + } + + bool operator!= (const self_type &other) const + { + return m_type != other.m_type; + } + + value_type operator* () const + { + gdb_assert (m_type < MAX_MAJOR_WINDOWS); + return tui_win_list[m_type]; + } + + self_type &operator++ () + { + ++m_type; + advance (); + return *this; + } + +private: + + void advance () + { + while (m_type < MAX_MAJOR_WINDOWS && tui_win_list[m_type] == nullptr) + ++m_type; + } + + int m_type; +}; + +/* A range adapter for iterating over TUI windows. */ + +struct all_tui_windows +{ + tui_window_iterator begin () const + { + return tui_window_iterator (SRC_WIN); + } + + tui_window_iterator end () const + { + return tui_window_iterator (); + } +}; + + /* Data Manipulation Functions. */ extern void tui_initialize_static_data (void); extern struct tui_win_info *tui_partial_win_by_name (const char *); diff --git a/gdb/tui/tui-layout.c b/gdb/tui/tui-layout.c index 9e683cfa919..a3ded203736 100644 --- a/gdb/tui/tui-layout.c +++ b/gdb/tui/tui-layout.c @@ -86,7 +86,7 @@ show_layout (enum tui_layout_type layout) || layout == DISASSEM_DATA_COMMAND) { show_data (layout); - tui_refresh_all (tui_win_list); + tui_refresh_all (); } else { diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c index ee03cf38e14..f83281f7902 100644 --- a/gdb/tui/tui-win.c +++ b/gdb/tui/tui-win.c @@ -364,18 +364,16 @@ window_name_completer (completion_tracker &tracker, const char *text, const char *word) { std::vector completion_name_vec; - int win_type; - for (win_type = SRC_WIN; win_type < MAX_MAJOR_WINDOWS; win_type++) + for (tui_win_info *win_info : all_tui_windows ()) { const char *completion_name = NULL; /* We can't focus on an invisible window. */ - if (tui_win_list[win_type] == NULL - || !tui_win_list[win_type]->is_visible) + if (!win_info->is_visible) continue; - completion_name = tui_win_list[win_type]->name (); + completion_name = win_info->name (); gdb_assert (completion_name != NULL); completion_name_vec.push_back (completion_name); } @@ -518,14 +516,12 @@ tui_source_window_base::refresh_all () void tui_refresh_all_win (void) { - int type; - clearok (curscr, TRUE); - tui_refresh_all (tui_win_list); - for (type = SRC_WIN; type < MAX_MAJOR_WINDOWS; type++) + tui_refresh_all (); + for (tui_win_info *win_info : all_tui_windows ()) { - if (tui_win_list[type] && tui_win_list[type]->is_visible) - tui_win_list[type]->refresh_all (); + if (win_info->is_visible) + win_info->refresh_all (); } tui_show_locator_content (); } @@ -533,10 +529,8 @@ tui_refresh_all_win (void) void tui_rehighlight_all (void) { - int type; - - for (type = SRC_WIN; type < MAX_MAJOR_WINDOWS; type++) - tui_check_and_display_highlight_if_needed (tui_win_list[type]); + for (tui_win_info *win_info : all_tui_windows ()) + tui_check_and_display_highlight_if_needed (win_info); } /* Resize all the windows based on the terminal size. This function @@ -885,21 +879,19 @@ tui_set_focus_command (const char *arg, int from_tty) static void tui_all_windows_info (const char *arg, int from_tty) { - int type; struct tui_win_info *win_with_focus = tui_win_with_focus (); - for (type = SRC_WIN; (type < MAX_MAJOR_WINDOWS); type++) - if (tui_win_list[type] - && tui_win_list[type]->is_visible) + for (tui_win_info *win_info : all_tui_windows ()) + if (win_info->is_visible) { - if (win_with_focus == tui_win_list[type]) + if (win_with_focus == win_info) printf_filtered (" %s\t(%d lines) \n", - tui_win_list[type]->name (), - tui_win_list[type]->height); + win_info->name (), + win_info->height); else printf_filtered (" %s\t(%d lines)\n", - tui_win_list[type]->name (), - tui_win_list[type]->height); + win_info->name (), + win_info->height); } } @@ -940,11 +932,10 @@ tui_source_window_base::update_tab_width () static void update_tab_width () { - for (int win_type = SRC_WIN; win_type < MAX_MAJOR_WINDOWS; win_type++) + for (tui_win_info *win_info : all_tui_windows ()) { - if (tui_win_list[win_type] != NULL - && tui_win_list[win_type]->is_visible) - tui_win_list[win_type]->update_tab_width (); + if (win_info->is_visible) + win_info->update_tab_width (); } } diff --git a/gdb/tui/tui-wingeneral.c b/gdb/tui/tui-wingeneral.c index c15739c594b..22f841eb88c 100644 --- a/gdb/tui/tui-wingeneral.c +++ b/gdb/tui/tui-wingeneral.c @@ -212,15 +212,8 @@ tui_source_window_base::make_visible (bool visible) static void make_all_visible (bool visible) { - int i; - - for (i = 0; i < MAX_MAJOR_WINDOWS; i++) - { - if (tui_win_list[i] != NULL) - tui_win_list[i]->make_visible (visible); - } - - return; + for (tui_win_info *win_info : all_tui_windows ()) + win_info->make_visible (visible); } void @@ -257,15 +250,14 @@ tui_source_window_base::refresh () /* Function to refresh all the windows currently displayed. */ void -tui_refresh_all (struct tui_win_info **list) +tui_refresh_all () { - int type; struct tui_locator_window *locator = tui_locator_win_info_ptr (); - for (type = SRC_WIN; (type < MAX_MAJOR_WINDOWS); type++) + for (tui_win_info *win_info : all_tui_windows ()) { - if (list[type] && list[type]->is_visible) - list[type]->refresh (); + if (win_info->is_visible) + win_info->refresh (); } if (locator->is_visible) { diff --git a/gdb/tui/tui-wingeneral.h b/gdb/tui/tui-wingeneral.h index e925606229c..20b7f21c7c0 100644 --- a/gdb/tui/tui-wingeneral.h +++ b/gdb/tui/tui-wingeneral.h @@ -37,7 +37,7 @@ extern struct tui_win_info *tui_copy_win (struct tui_win_info *); extern void tui_box_win (struct tui_gen_win_info *, int); extern void tui_highlight_win (struct tui_win_info *); extern void tui_check_and_display_highlight_if_needed (struct tui_win_info *); -extern void tui_refresh_all (struct tui_win_info **); +extern void tui_refresh_all (); extern void tui_delete_win (WINDOW *window); #endif /* TUI_TUI_WINGENERAL_H */