/* Support for plotting bar charts in dumps.
   Copyright (C) 2020-2021 Free Software Foundation, Inc.
   Contributed by David Malcolm <dmalcolm@redhat.com>.

This file is part of GCC.

GCC 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, or (at your option)
any later version.

GCC 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 GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */

#include "config.h"
#include "system.h"
#include "coretypes.h"
#include "pretty-print.h"
#include "analyzer/bar-chart.h"

#if ENABLE_ANALYZER

namespace ana {

/* class bar_chart.  */

/* Add an item, taking a copy of NAME.  */

void
bar_chart::add_item (const char *name, value_t value)
{
  m_items.safe_push (new item (name, value));
}

/* Print the data to PP.  */

void
bar_chart::print (pretty_printer *pp) const
{
  /* Get maximum printing widths and maximum value.  */
  size_t max_width_name = 0;
  size_t max_width_value = 0;
  value_t max_value = 0;
  unsigned i;
  item *item;
  char digit_buffer[128];
  FOR_EACH_VEC_ELT (m_items, i, item)
    {
      max_width_name = MAX (max_width_name, item->m_strlen);
      sprintf (digit_buffer, "%li", item->m_value);
      max_width_value = MAX (max_width_value, strlen (digit_buffer));
      max_value = MAX (max_value, item->m_value);
    }

  /* Print items.  */
  FOR_EACH_VEC_ELT (m_items, i, item)
    {
      /* Print left-aligned name, padding to max_width_name.  */
      pp_string (pp, item->m_name);
      print_padding (pp, max_width_name - item->m_strlen);

      pp_string (pp, ": ");

      /* Print right-aligned name, padding to max_width_value.  */
      sprintf (digit_buffer, "%li", item->m_value);
      const size_t value_width = strlen (digit_buffer);
      print_padding (pp, max_width_value - value_width);
      pp_string (pp, digit_buffer);

      pp_character (pp, '|');

      /* Print bar, scaled in proportion to max value.  */
      const int max_width_bar
	= MIN (max_value, 76 - (max_width_name + max_width_value + 4));
      const int bar_width
	= (max_value > 0 ? (max_width_bar * item->m_value) / max_value : 0);
      for (int j = 0; j < bar_width; j++)
	pp_character (pp, '#');
      print_padding (pp, max_width_bar - bar_width);
      pp_character (pp, '|');
      pp_newline (pp);
    }
}

/* Print COUNT spaces to PP.  */

void
bar_chart::print_padding (pretty_printer *pp, size_t count)
{
  for (size_t i = 0; i < count; i++)
    pp_character (pp, ' ');
}

} // namespace ana

#endif /* #if ENABLE_ANALYZER */
