Introduce TUI window iterator
authorTom Tromey <tom@tromey.com>
Thu, 27 Jun 2019 22:04:26 +0000 (16:04 -0600)
committerTom Tromey <tom@tromey.com>
Wed, 17 Jul 2019 18:19:03 +0000 (12:19 -0600)
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.

gdb/ChangeLog
2019-07-17  Tom Tromey  <tom@tromey.com>

* 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
gdb/tui/tui-data.c
gdb/tui/tui-data.h
gdb/tui/tui-layout.c
gdb/tui/tui-win.c
gdb/tui/tui-wingeneral.c
gdb/tui/tui-wingeneral.h

index 822a4a9..64e3a1b 100644 (file)
@@ -1,5 +1,18 @@
 2019-07-17  Tom Tromey  <tom@tromey.com>
 
+       * 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.
+
+2019-07-17  Tom Tromey  <tom@tromey.com>
+
        * tui/tui-regs.c (tui_reg_next, tui_reg_prev): Add "current_group"
        parameter.  Don't reference globals.
        (tui_reg_command): Update.
index a62dbf4..eacf174 100644 (file)
@@ -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;
 }
 
 
index ecf23a2..bd22f9e 100644 (file)
@@ -601,6 +601,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 *);
index 9e683cf..a3ded20 100644 (file)
@@ -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
        {
index ee03cf3..f83281f 100644 (file)
@@ -364,18 +364,16 @@ window_name_completer (completion_tracker &tracker,
                       const char *text, const char *word)
 {
   std::vector<const char *> 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)  <has focus>\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 ();
     }
 }
 
index c15739c..22f841e 100644 (file)
@@ -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)
     {
index e925606..20b7f21 100644 (file)
@@ -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 */