Change TUI source window iteration
authorTom Tromey <tom@tromey.com>
Sun, 7 Jul 2019 03:19:45 +0000 (21:19 -0600)
committerTom Tromey <tom@tromey.com>
Thu, 15 Aug 2019 18:29:28 +0000 (12:29 -0600)
Currently the TUI does separate bookkeeping to track which source
windows exist.  It seems better to me to just refer to the list of
windows for this, so this patch removes the special handling and
instead adds a new iterator.

gdb/ChangeLog
2019-08-15  Tom Tromey  <tom@tromey.com>

* tui/tui-winsource.h (struct tui_source_window_iterator): New.
(struct tui_source_windows): New.
* tui/tui-winsource.c (tui_display_main): Update.
* tui/tui-win.c (tui_resize_all, tui_adjust_win_heights)
(new_height_ok, parse_scrolling_args): Update.
* tui/tui-layout.c (show_layout, show_data): Update.
* tui/tui-data.h (tui_source_windows, tui_clear_source_windows)
(tui_add_to_source_windows): Don't declare.
* tui/tui-data.c (source_windows, tui_source_windows)
(tui_clear_source_windows, tui_add_to_source_windows): Remove.

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-winsource.c
gdb/tui/tui-winsource.h

index 26741a1b61bca086357f905af4c502312ed83872..5a42eee4f7ac2a8f467ec035754fab6d8ea2d4c5 100644 (file)
@@ -1,3 +1,16 @@
+2019-08-15  Tom Tromey  <tom@tromey.com>
+
+       * tui/tui-winsource.h (struct tui_source_window_iterator): New.
+       (struct tui_source_windows): New.
+       * tui/tui-winsource.c (tui_display_main): Update.
+       * tui/tui-win.c (tui_resize_all, tui_adjust_win_heights)
+       (new_height_ok, parse_scrolling_args): Update.
+       * tui/tui-layout.c (show_layout, show_data): Update.
+       * tui/tui-data.h (tui_source_windows, tui_clear_source_windows)
+       (tui_add_to_source_windows): Don't declare.
+       * tui/tui-data.c (source_windows, tui_source_windows)
+       (tui_clear_source_windows, tui_add_to_source_windows): Remove.
+
 2019-08-15  Tom Tromey  <tom@tromey.com>
 
        * tui/tui-winsource.h (struct tui_source_window_base) <resize>:
index c308237d187b9c98bdef0d943148f2b556a7503c..fe1f73f02e84a87ca8db9733d7145aad8ffbd795 100644 (file)
@@ -36,7 +36,6 @@ struct tui_win_info *tui_win_list[MAX_MAJOR_WINDOWS];
 ** Private data
 ****************************/
 static int term_height, term_width;
-static std::vector<tui_source_window_base *> source_windows;
 static struct tui_win_info *win_with_focus = NULL;
 
 static int win_resized = FALSE;
@@ -88,26 +87,6 @@ tui_set_win_with_focus (struct tui_win_info *win_info)
 }
 
 
-/* Accessor for the current source window.  Usually there is only one
-   source window (either source or disassembly), but both can be
-   displayed at the same time.  */
-std::vector<tui_source_window_base *> &
-tui_source_windows ()
-{
-  return source_windows;
-}
-
-
-/* Clear the list of source windows.  Usually there is only one source
-   window (either source or disassembly), but both can be displayed at
-   the same time.  */
-void
-tui_clear_source_windows ()
-{
-  source_windows.clear ();
-}
-
-
 /* Clear the pertinent detail in the source windows.  */
 void
 tui_clear_source_windows_detail ()
@@ -117,16 +96,6 @@ tui_clear_source_windows_detail ()
 }
 
 
-/* Add a window to the list of source windows.  Usually there is only
-   one source window (either source or disassembly), but both can be
-   displayed at the same time.  */
-void
-tui_add_to_source_windows (struct tui_source_window_base *win_info)
-{
-  if (source_windows.size () < 2)
-    source_windows.push_back (win_info);
-}
-
 /* Accessor for the term_height.  */
 int
 tui_term_height (void)
index 329fafc25523d6c2922cb7c66cb2f9ccf73ddde3..338867917efaf716f17e329550e4253555c2a783 100644 (file)
@@ -324,10 +324,7 @@ extern void tui_set_term_height_to (int);
 extern int tui_term_width (void);
 extern void tui_set_term_width_to (int);
 extern struct tui_locator_window *tui_locator_win_info_ptr (void);
-extern std::vector<tui_source_window_base *> &tui_source_windows ();
-extern void tui_clear_source_windows (void);
 extern void tui_clear_source_windows_detail (void);
-extern void tui_add_to_source_windows (struct tui_source_window_base *);
 extern struct tui_win_info *tui_win_with_focus (void);
 extern void tui_set_win_with_focus (struct tui_win_info *);
 extern int tui_win_resized (void);
index c7facc98343788aa522f6e291413c1580446b2a2..4ea604a1017f4426a9920cf2cc4a727c58f27513 100644 (file)
@@ -76,10 +76,6 @@ show_layout (enum tui_layout_type layout)
 
   if (layout != cur_layout)
     {
-      /* Since the new layout may cause changes in window size, we
-         should free the content and reallocate on next display of
-         source/asm.  */
-      tui_clear_source_windows ();
       /* First make the current layout be invisible.  */
       tui_make_all_invisible ();
       tui_locator_win_info_ptr ()->make_visible (false);
@@ -93,16 +89,12 @@ show_layout (enum tui_layout_type layout)
          /* Now show the new layout.  */
        case SRC_COMMAND:
          show_source_command ();
-         tui_add_to_source_windows (TUI_SRC_WIN);
          break;
        case DISASSEM_COMMAND:
          show_disasm_command ();
-         tui_add_to_source_windows (TUI_DISASM_WIN);
          break;
        case SRC_DISASSEM_COMMAND:
          show_source_disasm_command ();
-         tui_add_to_source_windows (TUI_SRC_WIN);
-         tui_add_to_source_windows (TUI_DISASM_WIN);
          break;
        default:
          break;
@@ -595,7 +587,6 @@ show_data (enum tui_layout_type new_layout)
   base->m_has_locator = true;
   locator->make_visible (true);
   tui_show_locator_content ();
-  tui_add_to_source_windows (base);
   TUI_CMD_WIN->make_visible (true);
   current_layout = new_layout;
 }
index 7210f6c41191f582a6e6e47324ef28362ba51314..aa07dfc82255f8eb79545a274a2891453757edd9 100644 (file)
@@ -571,7 +571,7 @@ tui_resize_all (void)
        {
        case SRC_COMMAND:
        case DISASSEM_COMMAND:
-         src_win = tui_source_windows ()[0];
+         src_win = *(tui_source_windows ().begin ());
          first_win = src_win;
          first_win->width += width_diff;
          locator->width += width_diff;
@@ -610,7 +610,7 @@ tui_resize_all (void)
            {
              first_win = TUI_DATA_WIN;
              first_win->width += width_diff;
-             src_win = tui_source_windows ()[0];
+             src_win = *(tui_source_windows ().begin ());
              second_win = src_win;
              second_win->width += width_diff;
            }
@@ -1046,7 +1046,7 @@ tui_adjust_win_heights (struct tui_win_info *primary_win_info,
              primary_win_info->make_invisible_and_set_new_height (new_height);
              if (primary_win_info->type == CMD_WIN)
                {
-                 win_info = tui_source_windows ()[0];
+                 win_info = *(tui_source_windows ().begin ());
                  src_win_info = win_info;
                }
              else
@@ -1084,7 +1084,7 @@ tui_adjust_win_heights (struct tui_win_info *primary_win_info,
                {
                  src1 = nullptr;
                  first_win = TUI_DATA_WIN;
-                 second_win = tui_source_windows ()[0];
+                 second_win = *(tui_source_windows ().begin ());
                }
              if (primary_win_info == TUI_CMD_WIN)
                { /* Split the change in height accross the 1st & 2nd
@@ -1238,7 +1238,7 @@ new_height_ok (struct tui_win_info *primary_win_info,
              struct tui_win_info *win_info;
 
              if (primary_win_info == TUI_CMD_WIN)
-               win_info = tui_source_windows ()[0];
+               win_info = *(tui_source_windows ().begin ());
              else
                win_info = TUI_CMD_WIN;
              ok = ((new_height +
@@ -1259,7 +1259,7 @@ new_height_ok (struct tui_win_info *primary_win_info,
          else
            {
              first_win = TUI_DATA_WIN;
-             second_win = tui_source_windows ()[0];
+             second_win = *(tui_source_windows ().begin ());
            }
          /* We could simply add all the heights to obtain the same
             result but below is more explicit since we subtract 1 for
@@ -1385,7 +1385,7 @@ parse_scrolling_args (const char *arg,
          if (!(*win_to_scroll)->is_visible)
            error (_("Window is not visible"));
          else if (*win_to_scroll == TUI_CMD_WIN)
-           *win_to_scroll = tui_source_windows ()[0];
+           *win_to_scroll = *(tui_source_windows ().begin ());
        }
     }
 }
index f62c79dc32a6320ea962386ff4d9e02c5effa231..613213fab5f5b3a603ce3bd5146cc5882021b9d7 100644 (file)
@@ -44,7 +44,8 @@
 void
 tui_display_main ()
 {
-  if (!tui_source_windows ().empty ())
+  auto adapter = tui_source_windows ();
+  if (adapter.begin () != adapter.end ())
     {
       struct gdbarch *gdbarch;
       CORE_ADDR addr;
index 606740806e1c80ceb12f579c917d10da794c543d..9945e9f9b0e55530b0cf75c47498d8fef91085b3 100644 (file)
@@ -156,6 +156,76 @@ public:
   std::vector<tui_source_element> content;
 };
 
+
+/* A wrapper for a TUI window iterator that only iterates over source
+   windows.  */
+
+struct tui_source_window_iterator
+{
+public:
+
+  typedef tui_source_window_iterator self_type;
+  typedef struct tui_source_window_base *value_type;
+  typedef struct tui_source_window_base *&reference;
+  typedef struct tui_source_window_base **pointer;
+  typedef std::forward_iterator_tag iterator_category;
+  typedef int difference_type;
+
+  explicit tui_source_window_iterator (bool dummy)
+    : m_iter (SRC_WIN)
+  {
+    advance ();
+  }
+
+  tui_source_window_iterator ()
+    : m_iter (tui_win_type (DISASSEM_WIN + 1))
+  {
+  }
+
+  bool operator!= (const self_type &other) const
+  {
+    return m_iter != other.m_iter;
+  }
+
+  value_type operator* () const
+  {
+    return (value_type) *m_iter;
+  }
+
+  self_type &operator++ ()
+  {
+    ++m_iter;
+    advance ();
+    return *this;
+  }
+
+private:
+
+  void advance ()
+  {
+    tui_window_iterator end;
+    while (m_iter != end && *m_iter == nullptr)
+      ++m_iter;
+  }
+
+  tui_window_iterator m_iter;
+};
+
+/* A range adapter for source windows.  */
+
+struct tui_source_windows
+{
+  tui_source_window_iterator begin () const
+  {
+    return tui_source_window_iterator (true);
+  }
+
+  tui_source_window_iterator end () const
+  {
+    return tui_source_window_iterator ();
+  }
+};
+
 /* Update the execution windows to show the active breakpoints.  This
    is called whenever a breakpoint is inserted, removed or has its
    state changed.  Normally BEING_DELETED is nullptr; if not nullptr,