#pragma once

#include <hei_includes.hpp>
#include <isolator/hei_signature.hpp>

namespace libhei
{

/**
 * @brief The main isolate() API is given a list of chips to analyze. This class
 *        will contain a list of all active hardware errors found on those
 *        chips, the contents of any registers associated with the active
 *        errors, and any other data that can be useful for debug.
 */
class IsolationData
{
  public: // Constructors, destructor, assignment, etc.

    /** @brief Default constructor. */
    IsolationData() = default;

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

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

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

  private: // Instance variables

    /** A list of all signatures found during isolation. */
    std::vector<Signature> iv_sigLists;

    // TODO: add register dump.

  public: // Member functions

    /**
     * @brief Adds a signature to the signature list.
     * @param i_signature The target signature.
     */
    void addSignature(const Signature & i_signature)
    {
        iv_sigLists.push_back(i_signature);
    }

    /** @brief Allows access to the signature list. */
    const std::vector<Signature> & getSignatureList()
    {
        return iv_sigLists;
    }

    /** @brief Flushes the data to ensure a clean slate for isolation. */
    void flush()
    {
        iv_sigLists.clear();
    }

}; // end class IsolationData

} // end namespace libhei
