#pragma once

#include <hei_includes.hpp>
#include <util/hei_bit_string.hpp>

namespace libhei
{

/**
@brief An abstract class for register objects.

Purpose:  Register is an abstract base class for real and virtual registers.
A few examples of these registers are; HardwareRegister, ConstantRegister,
NotRegister, and AndRegister.  As a base class of register types, Register
creates a place where these registers can be put together like logical
building blocks.  For example, Register makes this possible:

Register * mask1 = new ConstantRegister(0xffff000000000000);
Register * mask2 = new ConstantRegister(0xffffffff00000000);
Register * fir_mask = new AndRegister(mask1, mask2);
const BitString * bs = fir_mask->getBitString(chip);

The getBitString function (defined by each register) provides access to
the BitString that manages each register's data.  In this example bs will
contain the result of mask1 & mask2.
*/
class Register
{
  public: // Aliases
    using Ptr      = std::shared_ptr<Register>;
    using ConstPtr = std::shared_ptr<const Register>;

  public:
    /** @brief Pure virtual destructor. */
    virtual ~Register() = 0;

    /**
     * @brief  Provides access to the value of this register.
     * @param  i_chip Indicates which chip to access for this register.
     * @return A BitString containing the value of this register.
     */
    virtual const BitString* getBitString(const Chip& i_chip) const = 0;

    /** @return The size (in bytes) of this register. */
    virtual size_t getSize() const = 0;
};

// Pure virtual destructor must be defined.
inline Register::~Register() {}

} // end namespace libhei
