/* Copyright (C) 2021-2025 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 _INDEXOBJECT_H
#define _INDEXOBJECT_H

#include "Histable.h"
#include "Expression.h"

class IndexObject : public Histable
{
public:
  IndexObject (int _indextype, uint64_t _index);
  IndexObject (int _indextype, Histable *_obj);
  bool requires_string_sort (); // name column should be sorted using name text

  virtual Histable_type
  get_type ()
  {
    return INDEXOBJ;
  }

  virtual char *get_name (NameFormat = NA);
  virtual void set_name (char*);
  virtual void set_name_from_context (Expression::Context *);
  virtual Histable *convertto (Histable_type, Histable* = NULL);

  virtual uint64_t
  get_addr ()
  {
    return id;
  }

  uint64_t
  get_index ()
  {
    return id;
  }

  Histable *
  get_obj ()
  {
    return obj;
  }

  // for use in index object definitions
  static const uint64_t INDXOBJ_EXPGRID_SHIFT   = 60;
  static const uint64_t INDXOBJ_EXPID_SHIFT     = 32;
  static const uint64_t INDXOBJ_PAYLOAD_SHIFT   = 0;
  static const uint64_t INDXOBJ_EXPGRID_MASK    =
	((1LLU << (64 - INDXOBJ_EXPGRID_SHIFT)) - 1);
  static const uint64_t INDXOBJ_EXPID_MASK      =
	((1LLU << (INDXOBJ_EXPGRID_SHIFT - INDXOBJ_EXPID_SHIFT)) - 1);
  static const uint64_t INDXOBJ_PAYLOAD_MASK    =
	((1LLU << (INDXOBJ_EXPID_SHIFT - INDXOBJ_PAYLOAD_SHIFT)) - 1);

private:

  int indextype;
  Histable *obj;
  bool nameIsFinal;
};

typedef enum IndexObjTypes
{
  INDEX_THREADS = 0,
  INDEX_CPUS,
  INDEX_SAMPLES,
  INDEX_GCEVENTS,
  INDEX_SECONDS,
  INDEX_PROCESSES,
  INDEX_EXPERIMENTS,
  INDEX_BYTES,
  INDEX_DURATION,
  INDEX_LAST    // never used; marks the count of precompiled items
} IndexObjTypes_t;

class IndexObjType_t
{
public:
  IndexObjType_t ();
  ~IndexObjType_t ();
  int type;
  char *name;           // used as input
  char *i18n_name;      // used for output
  char *index_expr_str;
  Expression *index_expr;
  char mnemonic;
  char *short_description;
  char *long_description;
  MemObjType_t *memObj;
};

#endif  /* _INDEXOBJECT_H */
