/* Copyright (C) 2021-2024 Free Software Foundation, Inc.
   Contributed by Oracle.

   This file is part of GNU Binutils.

   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, 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, write to the Free Software
   Foundation, 51 Franklin Street - Fifth Floor, Boston,
   MA 02110-1301, USA.  */

#ifndef _METRIC_H
#define _METRIC_H

#include "dbe_structs.h"
#include "vec.h"
#include "enums.h"
#include "BaseMetric.h"

#define MAX_LEN  1024

class Expression;

// The metric class defines the metrics that are available. The metrics are
// registered when the experiment's log file is read.
class Metric : public BaseMetric
{
public:

  typedef struct HistMetricS
  {
    int width;
    int maxvalue_width;
    int maxtime_width;
    char legend1[MAX_LEN];
    char legend2[MAX_LEN];
    char legend3[MAX_LEN];
    int indFirstExp;        // only for -compare=[delta|ratio]
    int indTimeVal;         // only for HWC time-converted metrics
    void update_max (struct HistMetricS *hm);
    void init ();
  } HistMetric;

  Metric (const Metric& item);      // copy constructor
  Metric (BaseMetric *item, SubType st);
  Metric (char *_name, SubType st); // for derived metrics
  virtual ~Metric ();

  char *get_mcmd (bool);        // e.user, a.total, etc. NOTI18N
  int get_real_visbits ();      // methods for managing visibility
  ValueTag get_vtype2 ();       // takes comparison visbits into account
  void set_dmetrics_visbits (int _dmetrics_visbits);

  // fetch various fields from a Metric
  SubType
  get_subtype ()
  {
    return subtype;
  }

  char *
  get_name ()
  {
    return name;
  }

  char *
  get_abbr ()
  {
    return abbr;
  }

  char *
  get_abbr_unit ()
  {
    return abbr_unit;
  }

  BaseMetric *
  get_base_metric ()
  {
    return baseMetric;
  }

  int
  get_visbits ()
  {
    return visbits;
  }

  void
  set_raw_visbits (int _visbits)
  {
    visbits = _visbits;
  }

  void
  clear_all_visbits ()
  {
    visbits = VAL_NA;
  }

  void
  enable_all_visbits ()
  {
    visbits = get_value_styles ();
  }


#define VAL_IS_HIDDEN(n) ((n) == -1 || (n) == VAL_NA || ((n) & VAL_HIDE_ALL) != 0)

  bool
  is_any_visible ()
  {
    return !VAL_IS_HIDDEN (visbits)
	    && (visbits & (VAL_VALUE | VAL_TIMEVAL | VAL_PERCENT));
  }

  bool
  is_value_visible ()
  {
    return (visbits & VAL_VALUE) != 0
	    || (!is_time_val () && (visbits & VAL_TIMEVAL) != 0);
  }

  bool
  is_time_visible ()
  {
    return is_time_val () && (visbits & VAL_TIMEVAL) != 0;
  }

  bool
  is_visible ()
  {
    return !VAL_IS_HIDDEN (visbits) && is_value_visible ();
  }

  bool
  is_tvisible ()
  {
    return !VAL_IS_HIDDEN (visbits) && is_time_visible ();
  }

  bool
  is_pvisible ()
  {
    return !VAL_IS_HIDDEN (visbits) && (visbits & VAL_PERCENT) != 0;
  }

  bool
  is_time_val ()
  {
    int v = VAL_TIMEVAL | VAL_VALUE;
    return (get_value_styles () & v) == v;
  }

  // per-bit handling of visbits
  // Note: Forces VAL_HIDE_ALL to zero. Use only on temporary Metric objects.
  void set_vvisible (bool set);
  void set_tvisible (bool set);
  void set_pvisible (bool set);

  void set_subtype (SubType st);
  void legend_width (HistMetric *hitem, int gap);
  char *get_vis_str ();
  char *get_vis_string (int vis);
  char *dump ();


private:
  BaseMetric *baseMetric;
  SubType subtype; // specific variant for this Metric
  char *name;
  char *abbr;
  char *abbr_unit;
  int visbits; // ValueType, e.g. VAL_VALUE|VAL_TIMEVAL
};

#endif  /* _METRIC_H */
