#pragma once

#include <hei_includes.hpp>

namespace libhei
{

/**
 * @brief A signature represents an active attention from a single bit on a
 *        register within a chip.
 *
 * The isolator will gather a list of all active attentions on a chip and return
 * a list of signatures to the user application. The user application should be
 * able to determine what actions to take based on these signatures.
 */
class Signature
{
  public: // Constructors, destructor, assignment, etc.

    /**
     * @brief Constructor from components.
     * @param i_chip     The chip containing this register.
     * @param i_id       The register ID.
     * @param i_instance The instance of this register.
     * @param i_bit      The target bit within this register.
     * @param i_attnType The attention type reported by this bit.
     */
    Signature(const Chip & i_chip, RegisterId_t i_id,
              RegisterInstance_t i_instance, RegisterBit_t i_bit,
              AttentionType_t i_attnType) :
        iv_chip(i_chip), iv_id(i_id), iv_instance(i_instance),
        iv_bit(i_bit), iv_attnType(i_attnType)
    {}

    /** @brief Destructor. */
    ~Signature() = default;

    /** @brief Copy constructor. */
    Signature(const Signature &) = default;

    /** @brief Assignment operator. */
    Signature & operator=(const Signature &) = default;

  private: // Instance variables.

    Chip               iv_chip;     ///< Chip containing this register.
    RegisterId_t       iv_id;       ///< Register ID.
    RegisterInstance_t iv_instance; ///< Instance of this register.
    RegisterBit_t      iv_bit;      ///< Target bit within this register.
    AttentionType_t    iv_attnType; ///< Attention type reported by this bit.

  public: // Member functions

    /** @return The chip containing this register. */
    const Chip & getChip() const { return iv_chip; }

    /** @return The register ID. */
    RegisterId_t getId() const { return iv_id; }

    /** @return The instance of this register. */
    RegisterInstance_t getInstance() const { return iv_instance; }

    /** @return The target bit within this register. */
    RegisterBit_t getBit() const { return iv_bit; }

    /** @return The attention type reported by this bit. */
    AttentionType_t getAttnType() const { return iv_attnType; }
};

} // end namespace libhei
