#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

