#pragma once

/**
@file hei_chip_data_stream.hpp
@brief Description:  The ChipDataStream class

ChipDataStream makes it possible to read a buffer of binary data using the
stream operators, ">>".

Instantiate ChipDataStream class with a pointer to a data buffer
and its size in bytes as below:

    ChipDataStream cds(streamData,552);

Use the ">>" stream operator then to read the basic integral types
(bool, char, uint8_t, int8_t, uint16_t, int16_t, uint32_t,
int32_t, uint64_t, and int64_t).

Endian issues are taken care of by template specialization.
**/

#include <endian.h>
#include <string.h>

#include <hei_includes.hpp>

namespace libhei
{

/**
 * ChipDataStream
 * ChipDataStream offers convenient stream operator access to binary data.
 **/
class ChipDataStream
{

  private:

    /** iv_buffer points to the first address of the Chip Data File
        buffer.  **/
    const void * const iv_buffer;
    /** iv_bufferSize is the size of the data buffer.  It is
        initialized when the ChipDataStream class is instantiated. **/
    const size_t iv_bufferSize;
    /** iv_asyncOffset keeps an offset into the buffer.  This
        offset is incremented appropriately as data is read. **/
    size_t iv_asyncOffset;

  public:

    /* Constructors */

    /**
    When instantiating the ChipDataStream object a pointer to a
    data buffer containing all the data and its size is passed
    into the class.
    **/
    ChipDataStream(void * i_buffer, size_t i_bufferSize) :
        iv_asyncOffset(0), iv_buffer(i_buffer), iv_bufferSize(i_bufferSize)
    {}

    /** Eliminate copy and assignment operator constructors **/
    ChipDataStream(const ChipDataStream &) = delete;
    ChipDataStream & operator=(const ChipDataStream &) = delete;

    /** Destructor **/

    ~ChipDataStream() = default;

    /** Functions **/

    /**
     *@brief Default case for "operator>>" template.
     *@param             D:       A type
     *@param             o_right: A pointer to where the data is stored
     *@return            *this:   A pointer to "this" object
     **/
    template <class D>
    ChipDataStream & operator>>(D & o_right)
    {
        read(&o_right, sizeof(D));
        return *this;
    }

  private:

    /**
     *@brief Read does the copy from the buffer
     *@param o_buf       a pointer to the location to copy to
     *@param i_size      the size (in bytes) to copy
     *@return            None\n\n
     **/
    void read(void * o_buf, size_t i_size)
    {
        /* Ensure memory is not accessed outside i_buffer */
        HEI_ASSERT((iv_asyncOffset + i_size) <= iv_bufferSize);
        /* Copy appropriate bytes from i_buffer to o_buff */
        memcpy(o_buf, (char *)iv_buffer + iv_asyncOffset, i_size);
        /* Increment asynchronous offset to next piece of data */
        iv_asyncOffset = iv_asyncOffset + i_size;
    }
};

/*
 *   Note:  The specializations below ensure the big-endian Chip Data File
 *          format is converted into the host format.
 */

/**
 *   @brief This template extracts a uint16_t data type from the data buffer
 *   @param             o_right: A pointer to where the data is stored
 *   @return            *this:   A pointer to "this" object
 **/
template <> inline
ChipDataStream & ChipDataStream::operator>>(uint16_t & o_right)
{
    read(&o_right, sizeof(o_right));
    be16toh(o_right);
    return *this;
}

/**@brief This template extracts an int16_t type from the data buffer
 *  @param             o_right: A pointer to where the data is stored
 *  @return            *this:   A pointer to "this" object
 **/
template <> inline
ChipDataStream & ChipDataStream::operator>>(int16_t & o_right)
{
    read(&o_right, sizeof(o_right));
    be16toh(o_right);
    return *this;
}

/**@brief This template extracts a uint32_t type from the data buffer
 *  @param             o_right: A pointer to where the data is stored
 *  @return            *this:   A pointer to "this" object
 **/
template <> inline
ChipDataStream & ChipDataStream::operator>>(uint32_t & o_right)
{
    read(&o_right, sizeof(o_right));
    be32toh(o_right);
    return *this;
}

/**@brief This template extracts an int32_t type from the data buffer
 *  @param             o_right: A pointer to where the data is stored
 *  @return            *this:   A pointer to "this" object
 **/
template <> inline
ChipDataStream & ChipDataStream::operator>>(int32_t & o_right)
{
    read(&o_right, sizeof(o_right));
    be32toh(o_right);
    return *this;
}

/**@brief This template extracts a uint64_t type from the data buffer
 *  @param             o_right: A pointer to where the data is stored
 *  @return            *this:   A pointer to "this" object
 **/
template <> inline
ChipDataStream & ChipDataStream::operator>>(uint64_t & o_right)
{
    read(&o_right, sizeof(o_right));
    be64toh(o_right);
    return *this;
}

/**@brief This template extracts an int64_t type from the data buffer
 *  @param             o_right: A pointer to where the data is stored
 *  @return            *this:   A pointer to "this" object
 **/
template <> inline
ChipDataStream & ChipDataStream::operator>>(int64_t & o_right)
{
    read(&o_right, sizeof(o_right));
    be64toh(o_right);
    return *this;
}

} // namespace libhei
