#pragma once

#include <stdint.h>

namespace libhei
{

class ReturnCode
{
  public:

    /**
     * @brief Constructor.
     * @param i_rc The error code value.
     */
    explicit constexpr ReturnCode(uint32_t i_rc = 0) :
        iv_rc(i_rc)
    {}

    /** @brief Default copy constructor. */
    ReturnCode(const ReturnCode &) = default;

    /** @brief Default assignment operator. */
    ReturnCode& operator=(const ReturnCode &) = default;

    /** @brief Default destructor. */
    ~ReturnCode() = default;

    /** @brief Integral type conversion function. */
    operator uint32_t() const { return iv_rc; }

    /** @brief Integral type conversion function. */
    operator uint64_t() const { return iv_rc; }

    /** @brief Equals operator. */
    bool operator==(const ReturnCode & rhs) const
    {
        return rhs.iv_rc == iv_rc;
    }

    /** @brief Not equals operator. */
    bool operator!=(const ReturnCode & rhs) const
    {
        return rhs.iv_rc != iv_rc;
    }

    /**
     * @brief Returns the error code value.
     *
     * We'd prefer to use the integral type conversion functions above, but
     * some compilers will throw warnings when passing this object into
     * functions with variadic arguments, like printf().
     */
    uint32_t get() const { return iv_rc; }

  private:

    uint32_t iv_rc; ///< return code value
};

/** Function returned successfully. */
static constexpr ReturnCode RC_SUCCESS                 = ReturnCode();

/** The given Chip Data File is malformed or unsupported. */
static constexpr ReturnCode RC_CHIP_DATA_INVALID       = ReturnCode(0x00000001);

/** The given Chip Data File contains a chip type that has already been
 *  initialized. */
static constexpr ReturnCode RC_CHIP_DATA_INITIALIZED   = ReturnCode(0x00000002);

/** The given chip type has not been initialized. */
static constexpr ReturnCode RC_CHIP_DATA_MISSING       = ReturnCode(0x00000003);

/** Generic return code indicating something along the hardware register access
 *  path failed and the returned data is undefined and should not be used. */
static constexpr ReturnCode RC_REG_ACCESS_FAILURE      = ReturnCode(0x00000004);

} // end namespace libhei
