#pragma once

#include <util/hei_bit_string.hpp>
#include <util/hei_includes.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
