#pragma once

#include <hei_types.hpp>

namespace libhei
{

/**
 * @brief This is a simple container for pointers to the user application chip
 *        objects and the associated chip type.
 */
class Chip
{
  public: // Constructors, destructors, assignment, etc.
    /**
     * @brief Default contructor.
     *
     * In general the default constructor should not be used, but it is needed
     * for some STL functions.
     */
    Chip() = default;

    /**
     * @brief Constructor.
     * @param i_chip See description for iv_chip.
     * @param i_type See description for iv_type.
     */
    Chip(const void* i_chip, ChipType_t i_type) :
        iv_chip(i_chip), iv_type(i_type)
    {}

    ~Chip() = default;

    Chip(const Chip&) = default;

    Chip& operator=(const Chip&) = default;

  public: // Accessors
    const void* getChip() const
    {
        return iv_chip;
    }

    ChipType_t getType() const
    {
        return iv_type;
    }

  public: // Operators
    bool operator==(const Chip& r) const
    {
        return (iv_chip == r.iv_chip) && (iv_type == r.iv_type);
    }

    bool operator<(const Chip& r) const
    {
        return (iv_chip < r.iv_chip) ||
               ((iv_chip == r.iv_chip) && (iv_type < r.iv_type));
    }

  private:
    /**
     * The user application will provide pointers to user application objects
     * that represent chips targeted for analysis. The isolator does not know
     * anything about these objects nor how to use them. The pointers' only
     * purpose is to eventually get passed back to the user application with
     * information associated with each chip.
     */
    const void* iv_chip = nullptr;

    /**
     * When doing analysis on a chip, the isolator will need to know the chip
     * type in order to look up the correct information from the Chip Data
     * Files.
     */
    ChipType_t iv_type = 0;

}; // end class Chip

} // end namespace libhei
